看雪学院 09月20日
使用GG修改器实现飞车游戏加速的逆向分析
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了如何利用GG修改器对一款Java层飞车游戏进行内存数据分析,以实现游戏加速。文章首先阐述了选择GG修改器而非CE的原因,并重点讲解了GG修改器中Java Heap(Jh)数据段的用途。通过一步步的搜索和分析,包括精确搜索、浮点数范围搜索,以及对抗加密数据的模糊搜索方法,最终定位到游戏速度的关键数据。作者分享了如何通过冻结修改后的数据来达到加速效果,并展示了实际操作的成果。此外,文章还探讨了游戏数据被重置的可能原因,并提到了使用Hook技术和分析游戏状态标志位等进阶方法,为游戏逆向学习者提供了宝贵的经验和思路。

🎮 **工具选择与环境设置**:文章选择GG修改器而非CE,主要原因是CE在远程桥接Android设备时存在无法暂停游戏的致命问题。GG修改器则允许在打开窗口时自动暂停游戏,便于数据搜索。对于纯Java层的游戏,应选择Java Heap(Jh)数据段进行分析,因为它存储Java对象和动态数据。

🔍 **内存数据分析与搜索策略**:首先尝试精确搜索浮点型数据(如速度),若无效,则尝试以范围形式搜索Float/Double类型数据,以避免因显示精度问题而遗漏关键地址。在搜索过程中,强调游戏暂停的重要性,以减小数据变动带来的干扰。作者指出,直接修改数据确认有效性存在风险,可能导致游戏崩溃或触发保护机制。

🛡️ **对抗加密数据与模糊搜索**:当直接搜索无效时,需考虑数据加密。GG修改器的模糊搜索功能是对抗加密数据的便捷手段。通过让速度数据发生变化,然后利用GG修改器进行模糊搜索,并根据数据变化筛选,最终可以定位到与速度同步增减的关键数据。此方法成本低且效率高。

💡 **实现加速与数据冻结**:成功定位到速度的关键数据后,作者发现该数据实际显示的游戏速度是其200倍。通过将其修改为期望值(如3)并进行冻结,可以实现游戏加速。冻结的目的是防止游戏因碰撞等因素导致数据被改写,从而维持加速状态。

⚠️ **数据被重置的分析与进阶思路**:文章指出,游戏数据可能在一段时间后被改回,这通常是由于游戏机制在特定情况下会重新创建对象,导致之前冻结的地址失效。此时,可能需要借助Hook技术来定位新对象的地址,或分析游戏状态标志位来辅助定位和控制游戏行为。对于Java层游戏,直接下断点追指令较为困难。

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)

球分享

球点赞

球在看

点击阅读原文查看更多

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

GG修改器 游戏逆向 内存分析 Java Heap 加速 GG Modifier Game Reverse Engineering Memory Analysis Speed Hack
相关文章