跳转至

高级内存扫描

在游戏源代码中,每块数据都有一个冷静、精心计算的定义。然而,当游戏运行时,所有这些数据汇聚在一起,创造出新的东西。玩家只体验到美丽的风景、震撼的声音和激烈的冒险;驱动这些体验的数据则无关紧要。

考虑到这一点,想象黑客甲开始拆解他最喜欢的游戏,想用机器人自动化一些无聊的部分。他对内存还没有完整理解,对他来说,数据不过是一堆假设。他想:「我有 500 生命值,所以我可以告诉 Cheat Engine 查找值为 500 的 4 字节整数来找到生命值地址。」黑客甲对数据有准确的理解:它只是在特定位置(地址)用定义的结构(类型)存储的信息(值)。

现在想象黑客乙,她已经从里到外理解了游戏;她知道玩游戏如何改变内存中的状态,数据对她不再有任何秘密。她知道数据的每个已定义属性都可以根据它的用途确定。与黑客甲不同,黑客乙对数据的理解超越了单个变量声明的界限:她考虑数据的用途和用法。在本节中,我们将讨论这两点。

游戏中的每块数据都有用途,游戏的汇编代码必须在某个时刻引用这块数据来实现这个用途。找到使用一块数据的独特代码,就意味着找到一个与版本无关的标记,它在游戏更新中持续存在,直到数据被移除或用途改变。让我告诉你为什么这很重要。