今天我又有一个奇怪的问题(至少对我而言)。我正在尝试更多的指针和想法在我的脑海中引起如下:
int * firefoxmemory = (char*) 0x11111111 //this is just an example of address.
*firefoxmemory = 200;
在上面的代码中,我尝试访问firefox使用的内存(我使用内存编辑器查看地址),之后更改其对应的值。但是当我尝试这样做时,我的程序崩溃了。
为什么这会发生在我的程序中?是否有一些特殊的代码用于防止第三方程序篡改其内存?或者它是由Windows和英特尔硬件DEP完成的?
如果DEP阻止了上述操作,为什么某些内存编辑软件仍然有用,比如可以改变内存中值的作弊引擎?
答案 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个流程。
如果进程没有提供执行任何权限,则没有合法的方法来读取进程的内存。它是所有现代操作系统中安全多处理的基础。