看雪学院 09月18日
游戏加速器:GG修改器在飞车游戏中的应用
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了如何使用GG修改器实现飞车类游戏的加速功能。作者详细讲解了工具选择、GG修改器的Java堆内存(Jh)设置、游戏内存数据分析(包括精确搜索和范围搜索浮点型/双精度型数据)以及对抗加密数据的模糊搜索技巧。文章通过实际操作演示了如何找到并修改游戏速度,并分享了冻结数据以维持加速效果的方法。最后,作者提到了游戏可能存在的对象重置机制导致冻结失效的问题,以及使用标志位作为通用方法的思路,并提供了相关CTF题目WP的下载链接。

🎮 **工具选择与设置**: 文章推荐使用GG修改器进行游戏逆向分析,并解释了为何在Android环境下选择Java堆内存(Jh)作为数据搜索区域。同时,强调了开启“自动暂停游戏”选项的重要性,以便在搜索数据时保持游戏状态稳定,降低数据变化带来的干扰。

🔍 **游戏内存数据分析**: 作者首先尝试使用DWORD类型精确搜索游戏中的速度值,但未找到有效数据。随后,转向使用浮点型(Float/Double)数据类型进行范围搜索,并指出在搜索浮点型数据时,设定一个合理的范围(如120~125)能更有效地避免数据遗漏。文章提醒,在未确认数据有效性前,应避免盲目修改,以免导致游戏崩溃或触发保护机制。

🛡️ **对抗加密数据与通用方法**: 面对可能存在的加密数据,文章介绍了GG修改器提供的模糊搜索功能,这是一种低成本且快捷的对抗加密数据的方式。通过反复筛选和观察数据变化,作者成功定位到与游戏速度同步增减的加密数据,并将其修改为所需速度。此外,文章还提及了“标志位”作为一种通用方法,用于筛选游戏状态(如win/lose),并可借助全局变量的存储特性来快速定位目标。

💡 **注意事项与进阶思路**: 文章指出,即使冻结了数据,游戏中的对象重置机制也可能导致冻结失效。在这种情况下,可能需要借助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)

# 往期推荐

无"痕"加载驱动模块之傀儡驱动 (上)

为 CobaltStrike 增加 SMTP Beacon

隐蔽通讯常见种类介绍

buuctf-re之CTF分析

物理读写/无附加读写实验

球分享

球点赞

球在看

点击阅读原文查看更多

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

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

FishAI

FishAI

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

联系邮箱 441953276@qq.com

相关标签

GG修改器 游戏逆向 游戏加速 内存修改 Java堆内存 模糊搜索 CTF GG Modifier Game Reverse Engineering Game Acceleration Memory Modification Java Heap Fuzzy Search CTF
相关文章