内存地址是否会发生变化,如何动态发现它们?

时间:2011-12-16 17:14:11

标签: c++ process memory-address

我正在编写一个访问另一个进程内存的简单程序。我一直在使用内存编辑器来查找我希望程序检索并使用ReadProcessMemory函数的变量的地址。到目前为止,没有任何问题,但我不确定值的地址是否可能会根据正在运行其他程序的环境而改变。

除了对节目本身的改动外,我应该关注这个吗?我注意到我的内存编辑器保存了相对于.exe位置的地址(例如program.exe + 198F6C),我很乐意这样实现我的程序,但我找不到任何方法来检索当前的C ++中program.exe的地址。

4 个答案:

答案 0 :(得分:5)

是的,他们改变了。

每次启动时,操作系统都会将进程加载到不同的偏移量中,每次运行代码时,使用newmalloc分配的任何内容都很可能会获得不同的地址。

答案 1 :(得分:2)

这里有两个问题:进程内存空间中变量的位置,以及进程在物理内存中的位置。第一个应该关注你,第二个不应该。

局部变量(以及全局/静态变量)将具有与内存中程序位置相同的 relative 地址。动态分配的变量(new / malloc)每次都会有不同的地址。

当我说“内存”时,我指的是特定进程的虚拟内存空间:一个进程中的地址0x100在另一个进程中不等于0x100,并且通常与RAM中的单元号0x100不同。 实际的地址通常不是很有趣,因为ReadProcessMemory和你的内存编辑器只能使用那些相对地址。您不需要program.exe的位置。

如果您对局部变量感兴趣,那么每次都可以依赖ReadProcessMemory返回有意义的结果。如果你需要动态分配的内存,你需要找到一个本地指针,从中获取已分配内存的地址,然后再次调用ReadProcessMemory。

答案 2 :(得分:1)

是的,他们会改变。编写一个程序,输出几个变量的内存地址并运行几次。您的输出应该每次都不同,尤其是在其他机器上。

答案 3 :(得分:0)

对于同一内存区域的多次访问,您也会遇到并发问题。

正确的顺序 - W1a,W1b,R1a,R1b,W2a,W2b,R2a,R2b 订单错误 - W1a,W1b,R1a,W2a,W2b,R1b,R2a,R2b

要解决此问题,您需要查看IPC,处理器间通信: http://en.wikipedia.org/wiki/Inter-process_communication