c++ 为什么读取64位进程内存失败?
本帖最后由 Ishin 于 2021-10-9 15:07 编辑# ReadProcessMemory和WriteProcessMemory
```
#include<iostream>
#include<windows.h>
using namespace std;
int main(){
HWND hwnd = FindWindow(NULL,"This is the Title");
if(!hwnd){
cout << "Cannot find the window!" << endl;
Sleep(3000);
exit(-1);
} else{//找到窗口句柄
cout << "Window Found!" << endl; }
DWORD proId;
GetWindowThreadProcessId(hwnd,&proId);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,proId);
if(proId == 0){
cout << "Cannot obtain process" << endl;
Sleep(3000);
exit(-2);
} else{
cout << "obtain the process!"<< endl;
int readValue = 0;
long long address = 0x7FF687599008;
cout << "Reading the memory of the process!" << endl;
ReadProcessMemory(handle,(LPVOID)&address,&readValue,sizeof(address),0);
cout << " the value is: "<<readValue << endl;
//输出的值readValue总是0?!!!
}
}
}
```
# !!问题来了!!:
## 为什么我去读取地址的值的时候,cout输出的值总是0?我到底哪一步做错了?
小弟先在此谢谢各位!很疑惑。
ReadProcessMemory(handle,(LPVOID)&address,&readValue,sizeof(address),0);
?sizeof(address)??? 读4个字节就好了 目测应该这样
ReadProcessMemory(handle,(LPVOID)address,&readValue,sizeof(readValue),0); if(proId == 0) 这里判断用openprocess 得到的handle 更好
如果感觉写的没什么问题,遇到这种情况,可以在ReadProcessMemory 后面跟一个GetErrorLast来看看出现什么错误
你这里应该是ReadProcessMemory(handle,(LPVOID)&address,&readValue,sizeof(address),0); 里面的第二个参数出错了直接用address不要取地址 对,read那边出错了,address本身就是一个地址,你加了&就等去传了address的地址进去 印象中,不支持32位程序读64位程序内存
需要 NtWow64ReadVirtualMemory64 NtWow64WriteVirtualMemory64 wslans 发表于 2021-10-9 15:09
ReadProcessMemory(handle,(LPVOID)&address,&readValue,sizeof(address),0);
?sizeof(address)???
哦哦!sizeof应该填写要读取对象的字节大小!因为我要读的是一个int,所以应该填sizeof(int)或者直接4! 苏紫方璇 发表于 2021-10-9 15:27
目测应该这样
ReadProcessMemory(handle,(LPVOID)address,&readValue,sizeof(readValue),0);
谢谢~!但是不知道为何我还是不行。64位程序的要修改的address我都设置成了long long类型了,也把address传了进去,返回的还是0\n 但是,如果我读取的是32位的程序,却能成功读取。 少年持剑 发表于 2021-10-9 15:33
if(proId == 0) 这里判断用openprocess 得到的handle 更好
如果感觉写的没什么问题,遇到这种情况,可 ...
谢谢。。我已经修改了!在32位程序中可以成功读取地址的值,但是在64位还是不行.....
页:
[1]
2