JSnow 2025-09-18 18:00 上海
看雪论坛作者ID:JSnow
在NewStarCTF2024的时候碰到了一道比较有意思的飞车游戏题目(AmazingGame),刚好最近在学习游戏逆向的相关,打算纯使用修改器实现加速,并且记录一下分析过程来与各位师傅交流。
工具的选择
首先来说一下工具的选择,这里我选择的是GG修改器。有些人可能会问问什么不选择功能更强大的CE呢?的确,相比GG修改器,CE更加强大,搜索数据更快,但是经过尝试CEserver远程桥接Android设备有一个比较致命的问题——无法暂停游戏。
我们即使使用了CEserver选择暂停游戏,Android端游戏仍在运行,更换其它游戏仍存在此问题。
当然我们也可以使用GG修改器暂停,CE去扫描,这里我打算直接使用GG修改器搜索。
GG修改器的设置
◆Jh (Java Heap)
◆描述: Java堆内存,特定于运行Java应用程序的环境(如Android)。
◆用途: 存储Java对象、数组和其他动态数据。由Java虚拟机(JVM)管理,通过垃圾回收机制自动清理。
我们打开apk,发现是纯Java层的游戏
所以我们应该选择Jh(Java Heap)数据段(Java堆内存,会用于存储我们的对象信息)
首先我们要在开始游戏前打开自动暂停游戏选项,这会让我们打开GG修改器窗口的时候暂停游戏,更有利于我们搜索数据,避免数据变化提高我们定位数据的难度。
游戏内存数据分析
直接搜索
首先我们来一局游戏,这时候根据经验其实我们会优先去寻找浮点型数据,因为速度,坐标这类数据在这类3D类游戏开发中主要会使用浮点数存储,但是我们可以先用DWORD搜一下试试。
可以看到我们当前角色的速度是282,我们首先使用GG修改器的精确搜索方法搜索游戏282(tips:搜索期间游戏一定需要是暂停状态,否则数据变化会增大我们的分析难度)
现在回到游戏之后操作一下再返回数据界面,游戏中我们的速度达到了122,但是发现我们的数据都没有发生变化,所以这里面不会有我们要找的值。
接下来我们尝试使用其他类型搜索数据,首选当然就是Float/Double了
在我们搜索float类型的数据的时候最好以范围的形式搜索,因为这里显示出来的速度是122,但是我们几乎不可能刚刚好让速度在浮点型的情况下到达122,所以为了避免数据遗漏我们还是给大一些的范围,像120~125这样。
我们搜索到了如下的数据
但是当我们拿到一定量的数据的时候,尽量避免通过直接修改的方式确认有效数据,因为我们在无法确认自己数据有效性的情况下盲目修改可能会导致游戏崩溃,我们如果重新打开游戏,我们的游戏数据地址都会重新加载(除了一些全局变量/代码段),我们之前搜索到的数据可能会全部丢失,导致我们功亏一篑。或者我们的某些修改可能触发一些游戏的保护机制。
但是这里很遗憾,我们搜索到的数据都是无效的,因为速度变成了122之后并没有让我们的任何一个数据变化为81
Double类型应该也是搜不出来有效数据的
加密数据的对抗
这时候我们就应该考虑数据的加密了,但是无论怎么加密,数据都是要变的(除非某些保护特别强的游戏,如果在native层可能还需要找call参数)
我们可以使用模糊搜索的方式,这是最低成本,最快捷的对抗加密数据的手段。GG修改器也为我们提供了这一功能。
我们使用float模糊搜索,这时候按理来说GG修改器界面会马上自动关闭,是因为数据太多了,这时候我们可以稍微让速度变化一下然后重新点开刚刚的模糊搜索按钮,然后选择数据对应的变化。
经过我们的反复筛选,我们确定了这个值会随我们的速度同步增减,如果有对数据比较敏感的师傅可能发现了,其实我们右下角显示的速度是这个数据的200倍,不确定的话可以多观察几次。
我们将其保存下来,然后可以进行修改,我们改成3,并且冻结。冻结是为了防止数据由于撞墙等行为被改写,让我们可以实现加速的目的。
(中间退了一下,导致游戏角色对象换了,所以我重新搜了一下地址会有所变化)
效果展示
靠着无与伦比的逆天速度我们轻松超过小小人机
https://www.123684.com/s/AEIrTd-PMmWd
后记
如果有师傅尝试实操一下就会发现,隔一段时间之后,我们的数据会被改回来,这是为什么呢?难道是被检测了吗?
其实应该是由于游戏存在某些机制,当遇到某些特殊情况,这时候会重新new一个对象,所以我们冻结的原数据会被拿到新的地方存储,这时由于我们只对开始的地址有冻结效果,所以这个新的地址就没有冻结效果了,我们可能需要借助其他方法(比如说Hook撞墙逻辑的代码)帮我们定位对象。而且后面会有不同的玩法,积分赛,撞墙时间长就输,需要的数据会很多,找起数据来会比较麻烦。
因为这是Java层的游戏,也很难下访问断点向上追指令
通杀方法:标志位
当时我做这道题的时候是筛选游戏状态标志位做的,0~3表示win,lose等状态,而且一些游戏开发的时候全局变量一般都是会离得比较近的,可以借助这一点快速筛选全局变量的范围和实现的功能
翻出来我当时的WP,感兴趣师傅们可以尝试实现:
附件:https://github.com/CTF-Archives/2024-newstar/releases/download/v1.0.0/ns24_misc.zip
*本文为看雪论坛优秀文章,由 JSnow 原创,转载请注明来自看雪社区
1.25折门票开售!
看雪·第九届安全开发者峰会(SDC 2025)
球分享
球点赞
球在看
点击阅读原文查看更多
