C++ ReadProcessMemory()为静态地址返回0

C++ ReadProcessMemory()为静态地址返回0,c++,visual-c++,readprocessmemory,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 <

我要做的是读取一个静态地址,它指向一个动态地址,这个地址包含一些值。但是如果我尝试读取静态地址,它总是返回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);
等等

编辑3 读取的字节数为4

编辑4

我只是想澄清一下

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

如果我打开作弊引擎并将地址0x74EA46D8点添加到地址列表中。然后右键点击它并按“查找访问此地址的内容”,它可以被突然读取。启用SedebugPrivilege不起任何作用

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

它的结构是这样的:

静态地址指向我试图读取的地址,除非如上所述,否则返回0作为“新地址”

动态地址,包含我试图读取的值。如果我手动定义动态地址,这就可以了。但如果我不这样做,它就会失败,因为新的_地址是0,除非如上所述

编辑5

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



但我希望其他人能从我的错误中吸取教训:你不是在读不同的地址吗<代码>地址!=新地址
(void*)address
-是您开始阅读的地址。

您不是从不同的地址阅读吗<代码>地址!=新地址
(void*)address
-是您开始读取的地址。

是什么让您认为
0x74EA46D8
是正确的?如果我使用作弊引擎调试它所保留的地址,它的读取就很好了ReadProcessMemory的返回值是多少,如果是false,GetLastError会说什么?那么对ReadProcessMemory的第一次调用的GetLastError是0,第二次是299,或者是在第一次调用之前和之后?我把GetLastError放在“ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);”之后,第一次(程序启动后第一次运行)错误代码是0,ReadProcessMemory返回0。第二次,每次GetLastError返回299,ReadProcessMemory返回0。你怎么会认为
0x74EA46D8
是对的?如果我使用作弊引擎调试它所持有的地址,读起来很好ReadProcessMemory的返回值是多少,如果是false,GetLastError会说什么?那么对ReadProcessMemory的第一次调用的GetLastError是0,第二次是299,或者是在第一次调用之前和之后?我把GetLastError放在“ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);”之后,第一次(程序启动后第一次运行)错误代码是0,ReadProcessMemory返回0。第二次,每次之后GetLastError返回299,ReadProcessMemory返回0.address==静态地址,new_address==动态地址——如果我在系统DLL中定义它是函数的静态地址,这个就可以了?从
address
判断,它在某处。不确定,但为什么在调试它指向的地址时我可以读取它?@thabubble您能检查
ReadProcessMemory
是否返回FALSE吗?如果有,你可以打电话。我假设读取失败,并且新的_地址只是具有您先前分配给它的值。好的,现在执行搜索并将页面添加到书签中。还可以将顶级MSDN搜索页面以及调试参考页面添加为书签。您需要能够重复地找到所有这些地址。地址==静态地址,新地址==动态地址--如果我在系统DLL中定义它是函数的静态地址,那么这个地址就可以了?从
address
判断,它在某处。不确定,但为什么在调试它指向的地址时我可以读取它?@thabubble您能检查
ReadProcessMemory
是否返回FALSE吗?如果有,你可以打电话。我假设读取失败,并且新的_地址只是具有您先前分配给它的值。好的,现在执行搜索并将页面添加到书签中。还可以将顶级MSDN搜索页面以及调试参考页面添加为书签。您需要能够反复找到所有这些。
BOOL x = ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);
cout << x << " " << GetLastError() << "\n";
1 0
1 299
1 299
1 299