第二十三课:逆向工程中的字符串处理

字符串,说白了就是游戏里的「人话」。

你看到的角色名字、对话文本、物品说明、按钮标签……全是字符串。在逆向工程里,字符串往往是突破口。我做过不少游戏修改,十有八九是从一个字符串引用顺藤摸瓜,找到关键代码的。

这一课,我们就来聊聊怎么在游戏内存里定位、识别、修改字符串。

字符串在内存中的两种形态

游戏里字符串主要有两种存储方式:ASCIIUnicode。搞混了,你搜半天也搜不到。

类型 编码方式 每个字符占用 常见场景
ASCII 单字节编码 1 字节 英文游戏、配置文件、日志
Unicode (UTF-16) 双字节编码 2 字节 中文游戏、现代游戏引擎

关键区别:ASCII 字符串每个字符占 1 字节,Unicode 字符串每个字符占 2 字节。在 Cheat Engine 里搜索时,选错类型就什么都搜不到。

我个人习惯是:先试 ASCII,搜不到再换 Unicode。因为很多游戏虽然界面显示中文,但底层字符串还是用 ASCII 存的——尤其是那些老游戏。

在 Cheat Engine 中搜索字符串

操作其实很简单,但有几个坑要注意。

搜索 ASCII 字符串

打开 Cheat Engine,附加进程后,在「值」输入框里直接输入你要找的文本。比如输入 health,然后点击「首次扫描」。CE 默认就是搜索 ASCII 字符串。

// 搜索步骤
1. 附加游戏进程
2. 值类型选择「字符串」
3. 输入 "health"
4. 点击「首次扫描」
5. 在游戏里改变血量,再次扫描
6. 找到唯一地址

搜索 Unicode 字符串

如果 ASCII 搜不到,试试 Unicode。在 CE 里,值类型选「字符串」后,勾上「Unicode」选项。比如搜中文「生命值」,必须用 Unicode 模式。

小技巧:不确定是 ASCII 还是 Unicode 时,可以同时开两个扫描窗口,一个搜 ASCII,一个搜 Unicode。我经常这么干,省时间。

查找字符串引用

找到字符串地址只是第一步。真正有价值的是:谁在引用这个字符串?

比如你找到了「生命值」这个字符串在内存里的地址。但你想知道游戏代码里哪一段在读取它——这样才能找到修改血量的逻辑。

在 CE 里,右键点击找到的地址,选择「找出是什么访问了这个地址」。然后让游戏运行一下,CE 就会列出所有访问这个字符串的代码指令。

// 查找字符串引用的步骤
1. 右键字符串地址
2. 选择「找出是什么访问了这个地址」
3. 在弹出的窗口里点击「启用」
4. 回到游戏,触发相关操作
5. CE 会记录下访问该地址的指令
6. 分析这些指令,找到关键代码

注意:有些游戏会动态分配字符串内存,每次启动地址都不一样。这时候你需要用「指针扫描」或者「特征码搜索」来定位。

修改游戏中的文本

找到字符串地址后,修改就很简单了。直接双击 CE 里的值,输入你想要的新文本就行。

但这里有个坑:新文本不能比原文本长

为什么?因为原字符串在内存里占用的空间是固定的。如果你把「生命值」改成「超级无敌生命值」,长度超了,会覆盖掉后面其他数据,轻则显示乱码,重则游戏崩溃。

经验法则:修改文本时,新文本长度 ≤ 原文本长度。如果一定要加长,需要先找到更大的内存空间,然后修改指针指向新地址——这个操作复杂一些,后面课程会讲。

实战案例:修改游戏中的对话文本

我记得有一次改一个 RPG 游戏,想把 NPC 的对话改成搞笑内容。流程是这样的:

  1. 用 CE 搜索 NPC 说的第一句话(ASCII 模式)
  2. 找到地址后,右键「找出是什么访问了这个地址」
  3. 触发对话,CE 捕获到一条 mov ecx, [eax+04] 指令
  4. 顺着这条指令往上找,发现了一个对话 ID 表
  5. 修改对话 ID 对应的字符串,游戏里就变了

整个过程大概花了 20 分钟。嗯,改完之后我自己都笑了——NPC 开始说冷笑话了。

字符串处理的常见陷阱

做多了你就会发现,字符串处理看起来简单,但坑不少。

  • 字符串拼接:有些游戏不会把完整字符串存在一个地方,而是分段拼接。比如「你获得了」+「100」+「金币」。这时候你搜「你获得了100金币」是搜不到的。
  • 加密字符串:一些反作弊强的游戏,会对字符串做简单加密,比如 XOR 或者 Base64。你看到的内存数据是乱码,需要先解密。
  • 动态生成:有些字符串是运行时动态生成的,不在静态数据段里。这种字符串每次地址都变,需要用特征码或者 Hook 来抓。

避坑指南:我曾经花了一下午找一句对话,怎么都搜不到。后来发现游戏用了 UTF-8 编码,而 CE 默认的 Unicode 是 UTF-16。换成 UTF-8 搜索,一下就找到了。所以,搜不到的时候,换个编码试试。

知识体系图

下面这张图总结了字符串处理的整体流程,从搜索到修改,每一步的关键点都在里面。

字符串处理知识体系 ASCII 字符串(1字节/字符) Unicode 字符串(2字节/字符) Cheat Engine 字符串搜索(值类型选择 + Unicode 选项) 查找字符串引用(找出访问了这个地址) 直接修改(长度 ≤ 原长度) 指针重定向(长度 > 原长度)

总结

字符串处理是逆向工程里最直观、最容易上手的切入点。你不需要懂汇编,不需要会反编译,只要会搜字符串、改字符串,就能做出很多有意思的修改。

但别小看它。字符串背后往往藏着游戏的核心逻辑——对话系统、物品系统、任务系统……顺着字符串引用往上追,你就能摸到代码的骨架。

嗯,这一课的内容就到这。记住:搜不到就换编码,改不了就找指针。多试几次,手感就来了。


公众号:蓝海资料掘金营,微信deep3321