访问其他程序使用的内存

car*_*995 8 c++ memory memory-management

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

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

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

问题:

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

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

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

Rem*_*eau 13

它崩溃了,因为0x11111111它没有指向应用程序内存空间中的有效地址.

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

1)在目标进程的内存空间内运行代码.有多种方法可以使用SetWindowsHookEx()或将代码注入另一个进程CreateRemoteThread().

2)使用ReadProcessMemory()WriteProcessMemory()

  • 虚拟寻址并不意味着防止黑客入侵.它允许操作系统更好地管理物理内存,并确保崩溃的进程不会影响其他进程.例如,在Windows 95中引入虚拟寻址之前,崩溃的进程可能会占用整个操作系统.Windows API专门公开了访问内存,分配/释放内存以及跨进程边界运行代码的功能,因此它不会试图阻止黑客入侵. (10认同)

Adr*_*ish 7

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

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

  • 为什么作弊引擎可以访问内存并更改值? (6认同)