3

我在使用 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);
4

2 回答 2

3

只是MEMORY_BASIC_INFORMATION这样使用是不正确的。根据远程进程是 32 位还是 64 位,您应该使用 useMEMORY_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;
}
于 2013-11-19T10:35:33.553 回答
1

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

于 2013-11-20T07:30:27.740 回答