如何从一个进程中读取内存?操作系统不同吗?


11

作为一个经验丰富的Web开发人员,但还是一个新手“低级”程序员,对于我来说,这些东西仍然有些巫毒。

我很好奇一个人怎么会开始寻找一个内存块,然后读取它(例如,在我的游戏中读取计时器)?这在OS / OS版本方面是否有所不同?

Answers:


14

从某种意义上讲,这可以说是一个比较棘手的问题,甚至是一个复杂的问题。但为了简化一点:

考虑您的示例“ 在地雷游戏中读取计时器 ”:

第一步是找到内存地址通常使用称为内存编辑器的工具(在某些情况下,调试器也会这样做)完成该工具,该工具可以使用各种方法来查找变量在进程内存中的位置。常见的方法是在目标进程的存储空间中查找某个值(例如计时器的值),然后更改目标值(例如提前计时器)并再次查找匹配项。此过程将在每次迭代中固定候选项,直到只剩下确切的变量为止。只需在内存编辑器中单击鼠标即可在进程的内存空间中获取该变量的地址。

第二步是修改该特定地址中的数据如何完成此操作取决于操作系统。在Windows中,有一个名为WinAPI的调用WriteProcessMemory,可用于将预定义的数据写入目标进程的内存空间内的给定地址。在我们的示例中,您将使用此函数用自己想要的值覆盖目标进程中的timer变量,从而有效地更改游戏中的timer。

在实践中,您必须找到目标进程的进程ID,然后将流氓进程附加到目标进程以获得修改其内存空间的能力。这是一项微不足道的任务,但是对回答问题没有帮助,因此我将其作为练习留给读者。;)


每次进程运行时,变量的位置都一样吗?
brunoqc 2015年

1
@brunoqc不,几乎可以肯定不。
2013年

2

操作系统完全不同。有些根本不允许您这样做,并且您必须具有某种方法来知道所需数据在目标内存空间中的位置。

这是在Linux上执行操作的方法:https : //unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux


什么操作系统不允许它?看来您至少可以在Linux和Windows下做到这一点
Eva

@Evan每个操作系统都必须允许(出于安全原因而受限制)用于远程过程内存修改的方式,以进行调试。但是,请注意,例如由于安全原因而导致的权限不匹配,可能会使它无法读/写更高特权进程的进程内存。一个很好的例子是,不要让具有来宾用户特权的进程以管理员权限读取/写入进程的内存,因为这可能会损害整个系统,并且是来宾用户直接获得管理特权的直接方式。系统。
zxcdw 2012年

1

操作系统为应用程序提供了一定范围的内存。通常,应用程序必须请求内存,但是由于语言的原因,该功能可能会被程序员所忽略。

诸如C之类的语言允许针对特定大小的块请求,而诸如C ++,C#和Java之类的其他语言则允许通过使用诸如关键字的请求new。每种语言都有多种分配内存的方法,因此这只是一个简短的概述。可以显式地或通过垃圾收集器将内存释放回OS。

在应用程序中访问内存取决于其分配方式。C和C ++最著名的是使用指针的概念来指示/跟踪内存的位置。否则,将通过创建的类或变量来处理内存访问。

大多数时候,您不必担心程序中特定的内存访问。语言结构和OS有效地消除了您的顾虑。

您在游戏中使用计时器的示例很好地说明了您无需担心基础内存分配。您将有一个代表计时器的变量,您只需从该变量中读取。

我的答案与编写应用程序时有关,而zxcdw的答案与访问属于另一个应用程序的内存有关。您的LMGTFY术语将是“调试”和“逆向工程”,以进一步探究该主题。

一些其他阅读:

  • Wikipedia上有关计算机内存的文章将为您提供有关内容的不错的概述。
  • 然后查看有关内存映射I / O的Wikipedia文章,以更深入地了解正在进行的欺骗。
  • 最后,查看有关虚拟内存的文章,以更好地了解每个操作系统与其他操作系统之间如何处理内存映射。

很好的答案,虽然可以,但是在这种情况下,我更关心的是从我自己没有编写的应用程序中读取内存。我将在15次代表后立即投票;)
伊娃(Eva

@Evan-一定要阅读有关虚拟内存的文章。这将使您更好地了解正在进行的映射。您必须了解映射才能挑选应用程序。大多数调试器将允许您附加到正在运行的进程,该进程将使您可以查看应用程序的说明和内存。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.