【问题标题】:Accessing memory used by other program访问其他程序使用的内存
【发布时间】:2012-01-01 18:29:53
【问题描述】:

今天我又有一个奇怪的问题(至少对我来说是这样)。我正在尝试更多的指针和一个想法,如下所示:

代码(只是其中的一部分)

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

问题:

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

为什么我的程序会出现这种情况? Firefox 是否使用了一些特殊代码来防止第 3 方程序篡改其内存?还是由 Windows 和 Intel 硬件 DEP 完成?

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

【问题讨论】:

  • 你不能像那样访问另一个进程的内存(好吧,除非你正在编程 AmigaOS)。
  • 操作系统会阻止程序访问彼此的内存。这行不通。如果要在程序之间访问内存,则需要共享内存之类的东西。
  • 你可以使用windows函数来检查不同程序的内存,你不能只是取消引用它
  • 为什么作弊引擎可以访问内存并改变值??
  • 只有 amigaOS 允许这个操作??我可以在 linux 下做吗??

标签: c++ memory memory-management


【解决方案1】:

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

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

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

2) 使用ReadProcessMemory()WriteProcessMemory()

【讨论】:

  • 这意味着windows努力通过使用无用的虚拟地址来防止黑客攻击,因为有方法可以规避它
  • 虚拟寻址并不是为了防止黑客攻击。它允许操作系统更好地管理物理内存,并确保崩溃的进程不会影响其他进程。例如,在 Windows 95 中引入虚拟寻址之前,崩溃的进程可能会破坏整个操作系统。 Windows API 专门公开了用于访问内存、分配/释放内存以及跨进程边界运行代码的函数,因此它不会试图阻止黑客攻击。
【解决方案2】:

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

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

【讨论】:

  • 为什么作弊引擎可以访问内存并改变值??
  • 这将取决于运行该操作的用户(又名 root)。这对于保护系统的 root 用户以阻止此类黑客攻击非常重要。
  • 如果它使用虚拟地址,这意味着我的程序只能访问它自己的虚拟空间,但是为什么上面的程序会崩溃,因为我没有访问firefox的物理地址空间,而是它只是我的程序的虚拟空间??除此之外,我仍然不明白作弊引擎如何设法绕过预防并能够直接访问进程(例如 firefox)并更改其值,因为作弊引擎只是一个程序,就像程序一样我写。
  • Windows 是一个特殊的孩子。 msdn.microsoft.com/en-us/library/windows/desktop/…
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-08-16
    • 2011-08-26
    • 2011-02-06
    • 2015-05-15
    • 2010-12-31
    • 2017-11-18
    • 1970-01-01
    • 2017-10-12
    • 2014-10-23
    相关资源
    最近更新 更多