ReadProcessMemory()为静态地址返回0

时间:2012-09-14 19:50:37

标签: c++ visual-c++ readprocessmemory

我尝试做的是读取一个静态地址,该地址指向一个具有某些价值的动态地址。但是,如果我尝试读取静态地址,它总是返回0.读取它的唯一方法是将调试器附加到作弊引擎中的动态地址。但是,只读取动态地址,我就没有问题。

DWORD address = 0x74EA46D8;
int value = 0;
int new_address = 0;
DWORD pid;
HWND hwnd;
hwnd = FindWindow(NULL,L"HackMe.exe");
if(!hwnd) {
    cout <<"Window not found!\n";
    cin.get();
} else {
    GetWindowThreadProcessId(hwnd,&pid);

    HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,pid);
    if(!phandle) {
        cout <<"Could not get handle!\n";
        cin.get();
    } else {
        while(1) {
            ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);
            cout << new_address << "\n"; //Always print 0
            //int new_address = 0x2ECA40B0; //This works if I uncomment this
            ReadProcessMemory(phandle,(void*)new_address,&value,sizeof(value),0);

我甚至尝试过调试privelege,但这没有做任何事情。我不知道问题是什么,因为我对C ++很新。任何帮助表示赞赏。

谢谢。

修改

GetLastError()首先返回0,然后返回299

修改2

BOOL x = ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);
cout << x << " " << GetLastError() << "\n";

返回

1 0
1 299
1 299
1 299

等等

编辑3 读取的字节数为4。

编辑4

只是澄清一下。

使用ReadProcessMemory()从0x74EA46D8直接读取返回0。

如果我打开作弊引擎并将地址0x74EA46D8添加到地址列表中。然后右键单击它并按下“找出访问该地址的内容”,它可以突然读取。启用S​​eDebugPrivelege不会执行任何操作。

动态地址可以正常读取,无需调试privelege(只要我手动输入地址或作弊引擎调试地址,以便可以读取静态地址)

它的结构是这样的:

指向我尝试读取的地址的静态地址,除非见上文,否则返回0作为“新地址”。

动态地址,包含我正在尝试阅读的值。如果我手动定义动态地址,这样就可以了。但是如果我不这样做,因为new_address为0,除非见上文。

编辑5

最后我发现了问题,之前的地址错了。该地址是作弊引擎的一部分,实际地址为0x013CD878,偏移量为0x4B0。这就是为什么它不起作用的原因,除非我调试它。

但我希望其他人能从我的错误中吸取教训:P

1 个答案:

答案 0 :(得分:1)

你在不同的地址读书吗? address != new_address(void*)address - 是您开始阅读的地址。