繁体   English   中英

如何从内存地址获取值?

[英]How can I get the value from a memory address?

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

这是我的代码:

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

但这会使程序崩溃,它通过调用 *ptr 崩溃,为什么会这样? 我怎样才能毫无问题地获得价值?

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

如果担心你自己的过程,你必须拥有那段记忆。 你用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 这里有一个小例子。

请注意,在调用ReadProcessMemory之前, VirtualQueryEx也是一件好事。

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

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

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

x 0x09D37570

你也应该能够做到

print *(int*)0x09D37570;

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM