我正在尝试从内存中运行 WIN32 PE 可执行文件(不用于恶意软件,仅用于软件保护目的)。当我在所需的图像基地址 (0x00400000) 分配时,它工作得很好。但这并不理想,因为该地址并不总是可用的,有时甚至已经被当前进程使用,具体取决于 ASLR。
相反,我必须使用这个通用代码使用从 VirtualAlloc() 获得的新地址重新定位图像。
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 和其他各种东西的更复杂的可执行文件无法正确加载或根本无法加载。
我的问题是,有没有更好的方法来进行图像重定位,或者我怎样才能始终为我的新 PE 图像保留地址 0x00400000。
谢谢。