【问题标题】:ReadProcessMemory() returns 0 for static addressesReadProcessMemory() 为静态地址返回 0
【发布时间】:2012-09-08 00:07:14
【问题描述】:

我尝试做的是读取指向具有某些价值的动态地址的静态地址。但是,如果我尝试读取静态地址,它总是返回 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);

我什至尝试获得调试权限,但这并没有做任何事情。我不知道问题是什么,因为我对 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 指向的地址添加到地址列表中。然后右键单击它并按“找出访问此地址的内容”它可以一下子被读取。启用 SeDebugPrivelege 什么都不做。

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

它的结构是这样的:

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

动态地址,包含我要读取的值。如果我手动定义动态地址,这会很好。但如果我不这样做,它会失败,因为 new_address 为 0,除非见上文。

编辑 5

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

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

【问题讨论】:

  • 是什么让你认为0x74EA46D8 是对的?
  • 如果我使用作弊引擎来调试它所持有的地址就可以了
  • ReadProcessMemory 的返回值是多少,如果为假,GetLastError 会说什么?
  • 所以第一次调用ReadProcessMemory的GetLastError为0,第二次是299,还是第一次调用前后都有?
  • 我把GetLastError放在"ReadProcessMemory(phandle,(void*)address,&new_address,sizeof(new_address),0);"之后,第一次(程序启动后第一次运行)错误码是0 , ReadProcessMemory 返回 0。第二次和之后的每次 GetLastError 返回 299,ReadProcessMemory 返回 0。

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


【解决方案1】:

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

【讨论】:

  • address == 静态地址,new_address == 动态地址 -- 如果我定义它,这个读起来就好了
  • 是系统DLL中函数的静态地址吗?从address 来看,它就在那里。
  • 不确定,但是为什么在作弊引擎调试它指向的地址时我可以读取它?
  • @thabubble 你能检查一下ReadProcessMemory 是否返回 FALSE 吗?如果是,那么您可以致电GetLastError。我假设读取失败并且 new_address 只是具有您之前分配的值。
  • 好的,然后立即进行搜索并将页面添加为书签。还要为顶级 MSDN 搜索页面添加书签,可能还有 Debugging Reference 页面。您将需要能够反复找到所有这些。
猜你喜欢
  • 2021-01-15
  • 2014-03-06
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多