【问题标题】:C++ read memory address with pointer+offsetC ++用指针+偏移量读取内存地址
【发布时间】:2016-12-30 23:18:22
【问题描述】:

我正在尝试读取应该是数字 20 的进程的地址。我确定该地址位于 dll 基本偏移量 + 偏移量为 10 的数字。我正在使用

ReadProcessMemory(phandle, (void*)address, &number, sizeof(number), 0);

读取特定地址。我的问题是如何正确搜索位于“57B86F68”+ 10 偏移的地址?

【问题讨论】:

  • 请记住,除非您禁用它,否则您可能必须处理 ASLR。 en.wikipedia.org/wiki/Address_space_layout_randomization
  • 这有点令人困惑。您是在寻找地址 0x57b86f68 + 10 还是在寻找存储在该位置的地址(或其他类型的值)?无论哪种方式,您都不需要搜索任何内容。
  • @drescherjm,我确保通过代码获取基地址,因此据我所知,这不是问题。
  • @molbdnilo 很抱歉造成混淆,因此在某个位置有一个静态指针。我找到了这个位置,它指向一个地址,偏移量为 10 的地址是我要读取的值。我不确定我怎么能做到这一点。例如,我正在读取地址 a,它指向 b。我不是试图获得 b + 10 的值,有没有简单的方法可以做到这一点?
  • @Jack 在调用ReadProcessMemory 后调用GetLastError 以获取有关ReadProcessMemory 失败原因的更多信息。检查你的OpenProcess 标志,PROCESS_VM_READ 也应该在那里。

标签: c++ memory process


【解决方案1】:

如果您的 phandle 是一个进程句柄并授予 PROCESS_VM_READ 访问权限,则您可以从句柄中读取数据:

ReadProcessMemory(phandle, (void*)(0x57B86F68 + 0x10), &number, sizeof(number), 0);

要获得进程句柄的正确访问权限,请检查您的 OpenProcess 标志,PROCESS_VM_READ 应该在那里。

如果它仍然不起作用,事情就会复杂得多。你应该翻译你的virtual address to physical address,然后通过kernel mode直接访问内存。

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    相关资源
    最近更新 更多