我在使用 ReadProcessMemory 时遇到问题 我的代码是 64 位的,我可以读取任何 32 位进程的内存,但 ReadProcessMemory 总是失败,错误代码 299(部分读取)返回读取的 0 字节。
完成了我的研究,大多数答案都与权限有关,但我启用了调试令牌并以管理员身份运行,我在 PE 可选标头中读取 ImageBase 的地址
我尝试使用 VirtualQueryEx 检查页面状态并拒绝访问!
注意:代码可以在任何 32 位进程上完美运行。
任何想法可能是什么原因造成的?
HANDLE hProcess;
DWORD pid;
EnableDebugPriv();
pid=GetProcessByName("winmine.exe"); //32 bit apps work
//pid=GetProcessByName("notepad.exe"); //64 bit apps dont
hProcess = OpenProcess(PROCESS_ALL_ACCESS ,0, pid);
if(!hProcess)
{
printf("failed to acquire handle , Error %d \n" , GetLastError());
return FAILED;
}
//DEBUGGING
//DWORD address = 0x100000000; //64 notepad
DWORD address = 0x1000000; // 32 bit minsweeper
DWORD oldProtect=0;
printf("DEBUG pid %d - last err :%d \n" , GetProcessId(hProcess) , GetLastError() );
if(VirtualProtectEx(hProcess , (LPVOID)address,4096 /*pagesize for test*/ , PAGE_EXECUTE_READWRITE , &oldProtect))
{
cout <<"vp done \n";
}
else cout << " vp err :" << GetLastError() << endl;
PMEMORY_BASIC_INFORMATION pmbi = new MEMORY_BASIC_INFORMATION;
if(VirtualQueryEx(hProcess,(LPVOID)address,pmbi,sizeof(MEMORY_BASIC_INFORMATION)))
{
cout << "protection :" << pmbi->AllocationProtect << endl;
}
char value = 0;
SIZE_T * pbytes = new SIZE_T ;
ReadProcessMemory(hProcess,(LPCVOID)address ,&value,sizeof(value),pbytes);
cout << value << endl;
printf("Read status : %d ; bytes read %d \n",GetLastError() , *pbytes );
CloseHandle(hProcess);