Answers:
从某种意义上讲,这可以说是一个比较棘手的问题,甚至是一个复杂的问题。但为了简化一点:
考虑您的示例“ 在地雷游戏中读取计时器 ”:
第一步是找到内存地址。通常使用称为内存编辑器的工具(在某些情况下,调试器也会这样做)完成该工具,该工具可以使用各种方法来查找变量在进程内存中的位置。常见的方法是在目标进程的存储空间中查找某个值(例如计时器的值),然后更改目标值(例如提前计时器)并再次查找匹配项。此过程将在每次迭代中固定候选项,直到只剩下确切的变量为止。只需在内存编辑器中单击鼠标即可在进程的内存空间中获取该变量的地址。
第二步是修改该特定地址中的数据。如何完成此操作取决于操作系统。在Windows中,有一个名为WinAPI的调用WriteProcessMemory
,可用于将预定义的数据写入目标进程的内存空间内的给定地址。在我们的示例中,您将使用此函数用自己想要的值覆盖目标进程中的timer变量,从而有效地更改游戏中的timer。
在实践中,您必须找到目标进程的进程ID,然后将流氓进程附加到目标进程以获得修改其内存空间的能力。这是一项微不足道的任务,但是对回答问题没有帮助,因此我将其作为练习留给读者。;)
操作系统完全不同。有些根本不允许您这样做,并且您必须具有某种方法来知道所需数据在目标内存空间中的位置。
这是在Linux上执行操作的方法:https : //unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux
操作系统为应用程序提供了一定范围的内存。通常,应用程序必须请求内存,但是由于语言的原因,该功能可能会被程序员所忽略。
诸如C之类的语言允许针对特定大小的块请求,而诸如C ++,C#和Java之类的其他语言则允许通过使用诸如关键字的请求new
。每种语言都有多种分配内存的方法,因此这只是一个简短的概述。可以显式地或通过垃圾收集器将内存释放回OS。
在应用程序中访问内存取决于其分配方式。C和C ++最著名的是使用指针的概念来指示/跟踪内存的位置。否则,将通过创建的类或变量来处理内存访问。
大多数时候,您不必担心程序中特定的内存访问。语言结构和OS有效地消除了您的顾虑。
您在游戏中使用计时器的示例很好地说明了您无需担心基础内存分配。您将有一个代表计时器的变量,您只需从该变量中读取。
我的答案与编写应用程序时有关,而zxcdw的答案与访问属于另一个应用程序的内存有关。您的LMGTFY术语将是“调试”和“逆向工程”,以进一步探究该主题。
一些其他阅读: