游戏逆向实战:我要飞得更高

引言:一个手残党的自我救赎

作为一个玩《空洞骑士》连第一关boss都要死二十次的手残党,我深知“跳跃高度不够”意味着什么——意味着你永远够不到别人轻松上去的平台,意味着你总是在敌人面前差那么一点距离。

最近,我发现新版的 Cheat Engine 多了一个内置的教程游戏(Tutorial Games),一共三关。前两关都是常规的数值搜索练习,轻松拿下。但第三关,是一个平台跳跃小游戏——没错,就是我最不擅长的类型。

于是我决定:打不过,就逆向它。

平台跳跃小游戏:目标与困境

第三关的游戏很简单:主角可以左右移动和跳跃,目标是进入右下角的门。

但门一开始是上锁的,需要把场景中所有红色平台踩成绿色才能解锁。

听起来不难?问题是:

  • 平台之间有移动的敌人来回巡逻
  • 主角跳跃高度很低
  • 不支持二段跳
  • 跑得没有敌人快

对于高手来说,这不过是走位练习。但对于我这种手残党——试了七八次,全被敌人撞死。

既然游戏不让我好过,那我只好让游戏“不好过”了。

逆向分析:从X轴找到Y轴

第一步:定位角色坐标

做过2D游戏开发的朋友都知道,角色的位置由X轴(水平)Y轴(垂直)两个浮点数(float)控制。跳跃的本质,就是修改Y轴坐标。

但Y轴在跳跃过程中变化太快,直接用CE搜索很麻烦。我的经验是:

大多数游戏中,Y轴坐标的内存地址就在X轴地址附近。

所以我们可以先找X轴——左右移动角色时,X轴会持续变化,搜索起来轻松得多。

操作步骤

  1. 用 Cheat Engine 附加游戏进程
  2. 扫描类型选择浮点数(float)
  3. 左右移动角色,反复搜索“变化的数值”
  4. 经过几轮筛选,最终锁定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坐标”变得更大。有三种改法:

  1. 改 a3(变大 → 减得更多 → 跳得更高)
  2. 改 1000(改小 → 除以更小的数 → 跳跃幅度变大)✅最简单
  3. 改 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轴瞬移突破敌人封锁

核心收获:

  1. 利用内存布局(X轴和Y轴相邻)可以快速定位未知数据
  2. IDA Pro 的 F5 反编译功能是理解汇编逻辑的利器
  3. 修改一个全局常量(1000 → 300)就能产生质的飞跃
  4. 逆向分析的乐趣在于:【加粗】规则由你制定【加粗结束】

下期预告

这次我们改的是“跳跃高度”,下次我打算挑战更复杂的修改——

《修改空洞骑士:突破12格护符槽限制,实现“全都要”》

如果你也喜欢这种游戏逆向的内容,欢迎在评论区告诉我:

你最想修改哪款游戏的什么设定?

说不定下一个教程,就是为你量身定制的。

感谢阅读,我们下期见!