64位进程上的ReadProcessMemory总是返回错误299

ReadProcessMemory on a 64 bit proces always returns Error 299

本文关键字:返回 错误 ReadProcessMemory 进程 64位      更新时间:2023-10-16

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);

这样使用MEMORY_BASIC_INFORMATION是不正确的。根据远程进程是32位还是64位,您应该使用MEMORY_BASIC_INFORMATION32MEMORY_BASIC_INFORMATION64(如MSDN备注部分所述)。

结构的大小和布局将根据是32位还是64位进程而有所不同。只要使用MEMORY_BASIC_INFORMATION,您就可以期望远程进程使用当前进程使用的任何布局。

为了测试远程进程是32位还是64位,您可以使用IsWow64Process函数,如下所示:

bool is64BitProcess(HANDLE hProcess)
{
    const bool is64BitOS = sizeof(void *) == 8 || IsWow64Process(GetCurrentProcess());
    return is64BitOS ? IsWow64Process(hProcess)
                     : false;
}

因此,经过一些调试和研究,发现问题出在ASLR上,所以我读错了,感谢您的帮助:)