我想将自己的ImageBase设置为0x2000000,然后将另一个EXE程序读取到其ImageBase中,当然通常是0x400000,但是当我使用VirtualAlloc申请空间时,它总是失败,GetLastError为0x1e7(487),当然,我也尝试仅加载ntdll.dll程序,同样失败,该如何解决?
下面的部分代码:
DWORD dwImageBase = pNtHeader->OptionalHeader.ImageBase;
LPVOID lpImageBuff = ::VirtualAlloc((PVOID)(dwImageBase), pNtHeader->OptionalHeader.SizeOfImage, MEM_RESERVE, PAGE_READWRITE);
if (NULL == lpImageBuff)
{
::MessageBox(NULL,_T("Application for ImageBase failed!!!"),_T("ERROR"),MB_ICONSTOP | MB_OK);
return;
}
答案 0 :(得分:0)
0x1e7是ERROR_INVALID_ADDRESS
您尝试保留内存的地址已被使用-您自己的图像。
请参阅SysInternals工具VMmap。
将VirtualAlloc用于MEM_RESERVE或MEM_RESERVE的常用方法| MEM_COMMIT,将第一个参数使用0。这使API可以选择虚拟地址空间的空闲区域。