【问题标题】:Breaking down a ReadProcessMemory function that reads multiple offsets分解读取多个偏移量的 ReadProcessMemory 函数
【发布时间】:2015-04-02 23:05:16
【问题描述】:

我正在尝试逐步找出最合乎逻辑的读取偏移量的方法,这是我目前正在处理的代码。

    DWORD BaseOFFSET = 0x000000;
    DWORD address2 = ReadProcessMemory(pHandle, (void*)(BaseOFFSET + 0x50),0, sizeof(DWORD), 0); //50 doors down in baseoffset
    DWORD address3 = ReadProcessMemory(pHandle, (void*)(address2 + 0x0500),0, sizeof(DWORD), 0); // address 3 is address2 + another 500 doors down the line
    DWORD address4 = ReadProcessMemory(pHandle, (void*)(address3 + 0x140),0, sizeof(DWORD), 0); // and so on...
    DWORD address5 = ReadProcessMemory(pHandle, (void*)(address4 + 0x100), 0, sizeof(DWORD), 0); //Final offset is stored in address5

因为我知道最终地址中存储了一个浮点数,所以我将使用它来计算地址中的值

float* Data = (float*)(&address5);
    if (Data != nullptr)
        Sleep(2000);
    cout << *Data << std::endl;

我在那里有睡眠(2000),因为它是一个长循环,检查地址中的值以查看它是否改变,并且取决于改变我会做不同的事情。代码编译并运行良好,但返回的值错误,当我在循环中 cout 时得到 0。

【问题讨论】:

  • 您可能需要参考the documentation 获取 ReadProcessMemory。它不返回读取的值,您使用不当。
  • 我很惊讶代码没有崩溃。输出参数不是可选的,您传递的是 NULL。

标签: c++ winapi


【解决方案1】:

首先,您使用 ReadProcessMemory 错误。它返回 0 表示失败,1 表示成功。你得到零是因为它失败了,可能是因为你为输出指针传递了一个空 (0),这不是可选的。

其次,您不能直接使用来自另一个进程的指针(就像您在示例中尝试使用 *Data 一样)。您需要使用获得的外部指针调用ReadProcessMemory,以在其他进程的上下文中读取指向的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多