吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2473|回复: 16
收起左侧

[求助] c++ 为什么读取64位进程内存失败?

[复制链接]
Ishin 发表于 2021-10-9 15:03
本帖最后由 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?我到底哪一步做错了?

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


屏幕截图 2021-10-09 145821.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wslans 发表于 2021-10-9 15:09
ReadProcessMemory(handle,(LPVOID)&address,&readValue,sizeof(address),0);
?sizeof(address)???
超级大碰碰 发表于 2021-10-9 15:18
苏紫方璇 发表于 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的地址进去

免费评分

参与人数 1吾爱币 +1 收起 理由
Ishin + 1 谢谢@Thanks!

查看全部评分

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位还是不行.....

点评

你的程序编译的是不是64位,如果你的程序是32位的,需要用楼上大佬回复的api读取64程序  详情 回复 发表于 2021-10-9 16:05
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 21:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表