Конфликт базовых адресов

Тема в разделе "WASM.BEGINNERS", создана пользователем Aoizora, 2 авг 2017.

  1. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    369
    Я собираю свой упаковщик студией 2015 и хочу, чтобы базовый адрес загрузчика был повыше: например, 0x02000000. Для этого в поле Base Address в настройках линкера я указал 02000000, в Randomized Base Address поставил /DYNAMICBASE:NO, а в Fixed Base Address поставил /FIXED.

    Мне понадобилось это сделать потому, что при загрузке PE-файлов моим лоадером иногда происходит конфликт базовых адресов, а секции релоков в файле нет.

    Однако при загрузке стаба в олли адреса в секции кода располагаются по адресам, которые совсем не близки к 2000000: например, 81F49. Почему не используется адрес 2000000?

    Как решить конфликт базовых адресов, когда стаб загружается, например, по адресу 400000, и лоадер загружает файл без секции релоков, который хочет загрузиться тоже по адресу 400000? Получается файл, который запускается через раз.

    Происходит краш при попытке выделить память:

    Код (C++):
    1. void debug(DWORD addr)
    2. {
    3.     TCHAR msg[255];
    4.     wsprintf(msg, TEXT("%08x and %08x"), GetModuleHandle(0), addr);
    5.     MessageBox(0, msg, TEXT(""), 0);
    6. }
    7.  
    8. void* LoadPE_AllocateMemory(LoadPE_CONTEXT* ctx, PBYTE disk_image)
    9. {
    10.     PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)(disk_image);
    11.     PIMAGE_NT_HEADERS NtHeaders = (PIMAGE_NT_HEADERS)(disk_image + DosHeader->e_lfanew);
    12.  
    13.     std::size_t ImageBase   = NtHeaders->OptionalHeader.ImageBase;
    14.     std::size_t SizeOfImage = NtHeaders->OptionalHeader.SizeOfImage;
    15.     UnmapViewOfFile((void *)ImageBase);
    16.     VirtualFree((void *)ImageBase, SizeOfImage, MEM_DECOMMIT);
    17.     VirtualFree((void *)ImageBase, SizeOfImage, MEM_RELEASE);
    18.     void* mem = VirtualAlloc((void*)ImageBase,
    19.                              SizeOfImage,
    20.                              MEM_RESERVE | MEM_COMMIT,
    21.                              PAGE_READWRITE);
    22.     debug(DWORD(mem));
    23.     ctx->pbRealImageBase = PBYTE(mem);
    24.     return mem;
    25. }
    Иногда debug успевает показать, что VirtualAlloc возвратила 00000000, а иногда происходит краш даже до того, как был бы показан MessageBox.
     
    Последнее редактирование: 2 авг 2017