【问题标题】:How can I get the value from a memory address?如何从内存地址中获取值?
【发布时间】:2012-07-05 10:21:14
【问题描述】:

我想从我拥有的内存地址中获取值,而不会使程序崩溃。

这是我的代码:

int main(){
    int *ptr=(int*)0x09D37570;
    while(1){
        system("cls");
        cout<<(*ptr);
    }
    return 0;
}

但是程序崩溃了,调用 *ptr 就崩溃了,为什么会这样呢?我怎样才能毫无问题地获得价值?

【问题讨论】:

  • 对于初学者来说,它必须是你的记忆。
  • 为什么会这样?这可能是因为该内存地址根本没有映射。你是从哪里弄来的?你怎么知道它是一个有效的地址?你想做什么?
  • 我是从作弊引擎得到的,是真实的内存地址
  • 您需要使用某种特定于平台的接口来验证您拥有的地址。
  • ReadProcessMemory 如果你在 Windows 上的话。

标签: c++ windows memory


【解决方案1】:

您正在获取一个硬编码的地址,并希望它保持您看到的值。但是,这样做有几个问题:

如果担心自己的过程,你必须拥有那段记忆。你用new 或类似的东西分配的东西最好抢了那个地址,否则不知道会发生什么。例如:

int *someAddress = new int (5);
int *somePtr = someAddress; //point to same address as newed
int someInt = *somePtr; //someInt is 5
++somePtr; //uh-oh, now we've left what we newed; it might not be allocated
someInt = *somePtr; //there's no telling if that memory was ok to use

如果它确实有效,您只会得到一些随机数。事实上,如果你循环足够长的时间,它最终会崩溃。然而,即使是一个问题,它甚至不直接属于这里!

最大的问题是即使它有相同的地址,它也不是相同的内存。这听起来可能令人困惑,但这是一个非常棒的话题 (http://en.wikipedia.org/wiki/Virtual_address_space)。基本上,每个进程都有相同的地址值,但它们映射到实际内存中的不同区域。因此,您的硬编码地址仅适用于您的进程。

至少在 Windows 上查看其他进程内存的一种方法是使用ReadProcessMemory。在页面上,您可以看到要求,例如对您正在读取的进程拥有PROCESS_VM_READ 权限。如果它也失败了,请务必检查GetLastError。有一个小例子here

请注意,VirtualQueryEx 也是在调用 ReadProcessMemory 之前查看的好方法。

它可能有效,也可能无效,但这是我所知道的在其他进程的内存空间中探索的最好的东西。如果您打算完成此任务,值得一试。

【讨论】:

    【解决方案2】:

    每个进程都有自己的内存空间,同一个地址在不同进程中映射不同的物理地址,那样做是没有意义的。

    【讨论】:

      【解决方案3】:

      如果您在 Linux 上,您可以使用gdb 附加到进程,然后在某个时间点按 Ctrl-C,然后检查内存。命令是x,所以

      x 0x09D37570
      

      你应该也可以这样做

      print *(int*)0x09D37570;
      

      使用gdb,您处于进程的受保护内存空间中。

      如果没有操作系统,您正在尝试做的事情确实工作。如果您正在开发固件,它获取内存的正确方法,没有虚拟内存地址。

      https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html

      【讨论】:

        猜你喜欢
        • 2018-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-18
        • 2018-05-25
        • 1970-01-01
        相关资源
        最近更新 更多