访问其他程序使用的内存

时间:2011-11-19 04:02:56

标签: c++ memory memory-management

今天我又有一个奇怪的问题(至少对我而言)。我正在尝试更多的指针和想法在我的脑海中引起如下:

守则(只是其中的一部分)

int * firefoxmemory = (char*) 0x11111111 //this is just an example of address.
*firefoxmemory = 200;

问题:

在上面的代码中,我尝试访问firefox使用的内存(我使用内存编辑器查看地址),之后更改其对应的值。但是当我尝试这样做时,我的程序崩溃了。

为什么这会发生在我的程序中?是否有一些特殊的代码用于防止第三方程序篡改其内存?或者它是由Windows和英特尔硬件DEP完成的?

如果DEP阻止了上述操作,为什么某些内存编辑软件仍然有用,比如可以改变内存中值的作弊引擎?

3 个答案:

答案 0 :(得分:13)

崩溃是因为0x11111111未指向应用内存空间中的有效地址。

至于作弊引擎,有几种方法可以访问另一个程序的内存:

1)在目标进程的内存空间中运行代码。有多种方法可以使用SetWindowsHookEx()CreateRemoteThread()将代码注入其他流程。

2)使用ReadProcessMemory()WriteProcessMemory()

答案 1 :(得分:4)

现代操作系统使用虚拟寻址 - 因此每个程序都拥有它认为相同的地址空间。 OS将其映射到实际内存地址。

因此,例如Firefox有一个位于0x100的字符串,你的程序也有一个位于0x100的字符串 - 这两个都是虚拟内存地址 - 操作系统/ CPU将这些地址映射到真实的物理RAM - 并且它们将它们与彼此 - 完全避免你描述的黑客技术。

答案 2 :(得分:0)

在win32中进程之间共享内存的另一种方法是使用内存映射文件:

http://msdn.microsoft.com/en-us/library/dd997372.aspx

但与ReadProcessMemory()WriteProcessMemory()类似,此方法需要支持2个流程。

如果进程没有提供执行任何权限,则没有合法的方法来读取进程的内存。它是所有现代操作系统中安全多处理的基础。