Ishin 发表于 2021-10-9 15:03

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?我到底哪一步做错了?

小弟先在此谢谢各位!很疑惑。

wslans 发表于 2021-10-9 15:09

ReadProcessMemory(handle,(LPVOID)&address,&readValue,sizeof(address),0);
?sizeof(address)???

超级大碰碰 发表于 2021-10-9 15:18

读4个字节就好了

苏紫方璇 发表于 2021-10-9 15:27

目测应该这样
ReadProcessMemory(handle,(LPVOID)address,&readValue,sizeof(readValue),0);

少年持剑 发表于 2021-10-9 15:33

if(proId == 0)    这里判断用openprocess 得到的handle 更好
如果感觉写的没什么问题,遇到这种情况,可以在ReadProcessMemory 后面跟一个GetErrorLast来看看出现什么错误

你这里应该是ReadProcessMemory(handle,(LPVOID)&address,&readValue,sizeof(address),0);    里面的第二个参数出错了直接用address不要取地址

DEATHTOUCH 发表于 2021-10-9 15:35

对,read那边出错了,address本身就是一个地址,你加了&就等去传了address的地址进去

JuncoJet 发表于 2021-10-9 15:49

印象中,不支持32位程序读64位程序内存
需要 NtWow64ReadVirtualMemory64 NtWow64WriteVirtualMemory64

Ishin 发表于 2021-10-9 15:57

wslans 发表于 2021-10-9 15:09
ReadProcessMemory(handle,(LPVOID)&address,&readValue,sizeof(address),0);
?sizeof(address)???

哦哦!sizeof应该填写要读取对象的字节大小!因为我要读的是一个int,所以应该填sizeof(int)或者直接4!

Ishin 发表于 2021-10-9 15:59

苏紫方璇 发表于 2021-10-9 15:27
目测应该这样
ReadProcessMemory(handle,(LPVOID)address,&readValue,sizeof(readValue),0);

谢谢~!但是不知道为何我还是不行。64位程序的要修改的address我都设置成了long long类型了,也把address传了进去,返回的还是0\n 但是,如果我读取的是32位的程序,却能成功读取。

Ishin 发表于 2021-10-9 16:04

少年持剑 发表于 2021-10-9 15:33
if(proId == 0)    这里判断用openprocess 得到的handle 更好
如果感觉写的没什么问题,遇到这种情况,可 ...

谢谢。。我已经修改了!在32位程序中可以成功读取地址的值,但是在64位还是不行.....
页: [1] 2
查看完整版本: c++ 为什么读取64位进程内存失败?