Я пытаюсь запустить исполняемый файл WIN32 PE из памяти (не для вредоносных программ только в целях защиты программного обеспечения). Когда я размещаю на нужном изображении базовый адрес (0x00400000), он работает отлично. Но это не идеально, так как этот адрес не всегда доступен, иногда даже используется текущим процессом в зависимости от ASLR.
Вместо этого я должен переместить изображение с новым адресом, полученным из VirtualAllo c (), используя этот обобщенный код c.
while (pIBR->VirtualAddress)
{
if (pIBR->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION))
{
count = (pIBR->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
list = (PWORD)(pIBR + 1);
for (i = 0; i < count; i++)
{
if (list[i])
{
ptr = (PDWORD)((LPBYTE)image + (pIBR->VirtualAddress + (list[i] & 0xFFF)));
*ptr += delta;
}
}
}
pIBR = (PIMAGE_BASE_RELOCATION)((LPBYTE)pIBR + pIBR->SizeOfBlock);
}
, который отлично работает для простых исполняемых файлов, но более сложные исполняемые файлы с ресурсами, TLS и многими другими вещами загружаются некорректно или вообще не загружаются.
Мой вопрос, есть ли лучший способ перемещения изображений или как я всегда могу зарезервировать адрес 0x00400000 за мой новый образ PE.
Спасибо.