2012-09-14 40 views
1

我试图做的是读取一个静态地址,它指向一个具有某些值的动态地址。但是,如果我尝试读取静态地址,它总是返回0.它被读取的唯一方法是如果我将调试器附加到作弊引擎中的动态地址。但是,我只读取动态地址来读取它并没有问题。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

只是为了澄清。

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

如果我打开了作弊引擎和地址0x74EA46D8点添加到的地址列表。然后右键单击它并按“查找访问此地址的方式”,它可以突然被读取。启用S​​eDebugPrivelege不会执行任何操作。

动态地址可被读取为正常,而不必调试privelege(只要我手动它键入地址或欺骗发动机调试地址,以便静态地址可以被读取)

它在此结构方式:

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

动态地址,包含我试图读取的值。如果我手动定义动态地址,这就好了。但是,如果我不这样做失败,因为new_address是0,除非见上面。

编辑5

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

但我希望其他人会从我的错误中学习:P

+1

是什么让你觉得'0x74EA46D8'是对的? –

+0

如果我使用作弊引擎来调试它所持有的地址,它会被读取很好 – thabubble

+0

这是x86还是x64? –

回答

1

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

+0

地址==静态地址, new_address ==动态地址 - 如果我定义它,这个读取就好了 – thabubble

+0

它是系统DLL中函数的静态地址吗?用“地址”来判断它在哪里。 –

+0

不确定,但为什么我可以在作弊引擎调试它指向的地址时读取它? – thabubble