Gui*_*osa -3 c++ memory windows
我想从一个内存地址获取值,而不会崩溃程序.
这是我的代码:
int main(){
int *ptr=(int*)0x09D37570;
while(1){
system("cls");
cout<<(*ptr);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是这会导致程序崩溃,它会通过调用*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
Run Code Online (Sandbox Code Playgroud)
如果确实有效,你只需要一些随机数.事实上,如果你把它循环足够长,它最终会崩溃.然而,即使是一个问题,它甚至没有直接属于这里!
最大的问题是即使它具有相同的地址,它也不是相同的内存.这可能听起来令人困惑,但这是一个非常好的主题(http://en.wikipedia.org/wiki/Virtual_address_space).基本上,每个进程具有相同的地址值,但它们映射到实际内存中的不同区域.因此,您的硬编码地址仅适用于您的流程.
在Windows上,至少可以通过其他进程查看内存的一种方法是使用ReadProcessMemory.在页面上,您可以看到要求,例如拥有PROCESS_VM_READ您正在阅读的流程的权限.一定要检查GetLastError它是否也失败了.有一个小例子有点的位置.
请注意,VirtualQueryEx在调用之前ReadProcessMemory也是一件好事.
它可能有用,或者它可能没有用,但这是我所知道的在其他进程的内存空间中探索的最好的东西.如果你准备完成这个,那值得一试.