我想从我拥有的内存地址中获取值,而不会使程序崩溃。
这是我的代码:
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
它是否也失败了。这里有一个小例子。
请注意,在调用之前, VirtualQueryEx也是一件好事ReadProcessMemory
。
它可能有效,也可能无效,但这是我所知道的在其他进程的内存空间中闲逛的最好的东西。如果您打算完成此任务,那么值得一试。
每个进程都有自己的内存空间,不同进程的同一个地址映射不同的物理地址,那样做是没有意义的。
如果您在 Linux 上,您可以使用gdb
附加到进程,并在某个时间点按 Ctrl-C,然后检查内存。命令是x
,所以
x 0x09D37570
你应该也可以
print *(int*)0x09D37570;
使用gdb
,您处于进程的受保护内存空间中。
如果没有操作系统,您正在尝试做的事情确实有效。如果您正在开发没有虚拟内存地址的固件,这是获取内存的正确方法。
https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html