游戏逆向实战:我要飞得更高
引言:一个手残党的自我救赎
作为一个玩《空洞骑士》连第一关boss都要死二十次的手残党,我深知“跳跃高度不够”意味着什么——意味着你永远够不到别人轻松上去的平台,意味着你总是在敌人面前差那么一点距离。
最近,我发现新版的 Cheat Engine 多了一个内置的教程游戏(Tutorial Games),一共三关。前两关都是常规的数值搜索练习,轻松拿下。但第三关,是一个平台跳跃小游戏——没错,就是我最不擅长的类型。
于是我决定:打不过,就逆向它。
平台跳跃小游戏:目标与困境
第三关的游戏很简单:主角可以左右移动和跳跃,目标是进入右下角的门。
但门一开始是上锁的,需要把场景中所有红色平台踩成绿色才能解锁。
听起来不难?问题是:
- 平台之间有移动的敌人来回巡逻
- 主角跳跃高度很低
- 不支持二段跳
- 跑得没有敌人快
对于高手来说,这不过是走位练习。但对于我这种手残党——试了七八次,全被敌人撞死。
既然游戏不让我好过,那我只好让游戏“不好过”了。
逆向分析:从X轴找到Y轴
第一步:定位角色坐标
做过2D游戏开发的朋友都知道,角色的位置由X轴(水平)和Y轴(垂直)两个浮点数(float)控制。跳跃的本质,就是修改Y轴坐标。
但Y轴在跳跃过程中变化太快,直接用CE搜索很麻烦。我的经验是:
大多数游戏中,Y轴坐标的内存地址就在X轴地址附近。
所以我们可以先找X轴——左右移动角色时,X轴会持续变化,搜索起来轻松得多。
操作步骤
- 用 Cheat Engine 附加游戏进程
- 扫描类型选择浮点数(float)
- 左右移动角色,反复搜索“变化的数值”
- 经过几轮筛选,最终锁定X轴地址
找到X轴地址后,在内存查看器中查看附近的内存区域——果然,Y轴坐标就在+4字节的偏移位置。
第二步:找到修改Y轴的指令
右键点击Y轴地址,选择“找出是什么改写了这个地址”,然后让角色跳一下。
CE 捕获到了写入指令:
"gtutorial-x86_64.exe"+43B69 - F3 44 0F11 48 28 - movss [rax+28],xmm9这条指令的意思是:将 xmm9 寄存器的值写入 [rax+28],而这个地址正是Y轴坐标。
但光看汇编不够直观——我们需要理解这段逻辑的全貌。这时候就该IDA Pro出场了。
第三步:用IDA反编译,看懂跳跃逻辑
打开 IDA Pro,加载游戏 exe,跳转到 0x100043B69 这个地址,然后按下F5反编译。
原本晦涩的汇编变成了清晰的 C 伪代码:
// 关键代码片段 *(_QWORD *)(a1 + 104) += a3; y_axis = *(float *)(*(_QWORD *)(a1 + 40) + 40LL); v6 = y_axis - (double)a3 / 1000.0 * *(float *)(a1 + 120);| 变量 | 含义 |
|---|---|
| v5 | 当前Y轴坐标 |
| a3 | 传入的参数(可能是速度或力度) |
| 1000.0 | 一个固定除数 |
| a1 + 0x120 | 一个倍率参数(暂时未知) |
这个公式翻译成人话就是:
新Y坐标 = (旧Y坐标 - 参数/1000) × 倍率
我们的目标是让角色跳得更高,也就是让“新Y坐标”变得更大。有三种改法:
- 改 a3(变大 → 减得更多 → 跳得更高)
- 改 1000(改小 → 除以更小的数 → 跳跃幅度变大)✅最简单
- 改 a1+0x120 的值(目前未知,暂不动)
第四步:实战修改——将1000改成300
从 IDA 中可以看到,1000 这个值来自一个全局静态变量:
divsd xmm0, cs:qword_1002B4E60这个 qword_1002B4E60 的地址是固定的,我们直接用Cheat Engine查看这个地址的值:
将其修改为500,回到游戏跳一下——明显高了。
再改成300——
成功了!现在我可以轻松踩完所有平台。
结果:你以为这就完了?
我把所有平台踩绿了,门也开了。
然后我发现——
敌人堵在门口。
这游戏的作者显然预料到了玩家会修改跳跃高度,专门设计了这个“物理拦截”。这难不倒我们,因为我们已经解锁了X轴修改能力——
我直接把自己瞬移进门。
过关。
总结与思考
这次逆向分析,我们完成了:
| 步骤 | 工具 | 目标 |
|---|---|---|
| ① 定位X轴坐标 | Cheat Engine | 找到角色水平位置 |
| ② 推导Y轴地址 | 内存查看器 | 利用内存布局找到垂直位置 |
| ③ 捕获写入指令 | CE + 断点 | 找到修改Y轴的代码 |
| ④ 反编译分析 | IDA Pro | 理解跳跃计算公式 |
| ⑤ 修改全局变量 | CE | 将除数从1000改为300 |
| ⑥ 最终过关 | CE + X轴瞬移 | 突破敌人封锁 |
核心收获:
- 利用内存布局(X轴和Y轴相邻)可以快速定位未知数据
- IDA Pro 的 F5 反编译功能是理解汇编逻辑的利器
- 修改一个全局常量(1000 → 300)就能产生质的飞跃
- 逆向分析的乐趣在于:【加粗】规则由你制定【加粗结束】
下期预告
这次我们改的是“跳跃高度”,下次我打算挑战更复杂的修改——
《修改空洞骑士:突破12格护符槽限制,实现“全都要”》
如果你也喜欢这种游戏逆向的内容,欢迎在评论区告诉我:
你最想修改哪款游戏的什么设定?
说不定下一个教程,就是为你量身定制的。
感谢阅读,我们下期见!