Я собираю свой упаковщик студией 2015 и хочу, чтобы базовый адрес загрузчика был повыше: например, 0x02000000. Для этого в поле Base Address в настройках линкера я указал 02000000, в Randomized Base Address поставил /DYNAMICBASE:NO, а в Fixed Base Address поставил /FIXED. Мне понадобилось это сделать потому, что при загрузке PE-файлов моим лоадером иногда происходит конфликт базовых адресов, а секции релоков в файле нет. Однако при загрузке стаба в олли адреса в секции кода располагаются по адресам, которые совсем не близки к 2000000: например, 81F49. Почему не используется адрес 2000000? Как решить конфликт базовых адресов, когда стаб загружается, например, по адресу 400000, и лоадер загружает файл без секции релоков, который хочет загрузиться тоже по адресу 400000? Получается файл, который запускается через раз. Происходит краш при попытке выделить память: Код (C++): void debug(DWORD addr) { TCHAR msg[255]; wsprintf(msg, TEXT("%08x and %08x"), GetModuleHandle(0), addr); MessageBox(0, msg, TEXT(""), 0); } void* LoadPE_AllocateMemory(LoadPE_CONTEXT* ctx, PBYTE disk_image) { PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)(disk_image); PIMAGE_NT_HEADERS NtHeaders = (PIMAGE_NT_HEADERS)(disk_image + DosHeader->e_lfanew); std::size_t ImageBase = NtHeaders->OptionalHeader.ImageBase; std::size_t SizeOfImage = NtHeaders->OptionalHeader.SizeOfImage; UnmapViewOfFile((void *)ImageBase); VirtualFree((void *)ImageBase, SizeOfImage, MEM_DECOMMIT); VirtualFree((void *)ImageBase, SizeOfImage, MEM_RELEASE); void* mem = VirtualAlloc((void*)ImageBase, SizeOfImage, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); debug(DWORD(mem)); ctx->pbRealImageBase = PBYTE(mem); return mem; } Иногда debug успевает показать, что VirtualAlloc возвратила 00000000, а иногда происходит краш даже до того, как был бы показан MessageBox.