第 32 章 游戏逆向专项(Unity / Unreal / 手游)
游戏逆向的目标通常是:内购/验证绕过、外挂(透视/加速)、协议理解、防作弊对抗。游戏引擎决定一切——Unity 有 IL2CPP/Mono 两条路线,Unreal 有 UObject 反射体系,手游还有各种加固。
📍 知识点地图 | 主题:游戏逆向 | 前置:第10章 | 后续:— | 核心概念:Unity IL2CPP、Il2CppDumper、Unreal GObjects
32.1 游戏引擎分类学(先认引擎)
| 引擎 | 特征 | 逆向路线 |
|---|---|---|
| Unity Mono | 托管程序集(Assembly-CSharp.dll) | dnSpy 直读 |
| Unity IL2CPP | global-metadata.dat + 原生代码 | Il2CppDumper 恢复 |
| Unreal | UE4/UE5,UObject 反射 | 找 GObjects/GNames |
| Cocos2d-x | C++ + Lua/JS 脚本 | 脚本直读 + 原生 |
| Godot | GDScript | 资源包提取 |
| 自研引擎 | 无统一特征 | 按原生二进制 |
32.2 Unity 两大路线的关键差异(核心知识点)
Mono 模式(老版本/PC 游戏多):
游戏逻辑 = .NET 托管程序集(Assembly-CSharp.dll)
逆向 = dnSpy 直接反编译 = 几乎读源码
IL2CPP 模式(新版本/手游为主):
先把 C# 编译成 IL → 再翻译成 C++ 原生代码
产物: 原生二进制 + global-metadata.dat(元数据!)
逆向 = 用 Il2CppDumper 从元数据恢复类/方法/字符串 → 再 IDA 分析
IL2CPP 的"金钥匙"是 global-metadata.dat——只要它在,类结构、方法名、字段名、字符串全部可恢复。
32.3 Unity IL2CPP 逆向标准流程
Step 1: 识别模式
APK 内: libil2cpp.so + assets/bin/Data/Managed/Metadata/global-metadata.dat
PC 版: GameAssembly.dll + global-metadata.dat
Step 2: 提取元数据
Il2CppDumper global-metadata.dat libil2cpp.so -o out/
输出: dump.cs(类/方法/字段定义)+ 符号信息
Step 3: 定位逻辑
从 dump.cs 找目标类(内购验证/技能伤害/登录)
记录方法名 → 在 IDA/Ghidra 中按符号定位(Il2CppDumper 生成 IDA 脚本)
Step 4: 分析/修改
静态: IDA 反编译具体函数
动态: Frida Hook(按 Il2Cpp 方法地址)
修改: 内存修改器(GameGuardian 等)或 patch 二进制
Step 5: 验证
游戏中验证修改效果
32.4 Unreal 逆向(UObject 反射体系)
核心概念:
GObjects: 全局对象数组(所有 UObject 实例)
GNames: 全局名称表(所有名字字符串)
找到这两个符号 = 拿到全游戏的"数据库"
流程:
1. 识别: 特征字符串(UE4/UE5、Engine/Content 路径)
2. 定位 GObjects/GNames(IDA 搜索特征或公开偏移表)
3. 用 UnrealFinder/Dumper 工具恢复类结构
4. 分析目标逻辑(UFunction 反射调用可动态定位)
5. 动态: Frida/Unreal 注入 Hook UFunction
工具: UE4Dumper、UnrealFinder、FModel(资源查看)
32.5 手游专项
资源与配置
APK/IPA 内 assets 常存:
- Lua 脚本(lua 文件直读或编译后反编译)
- 配置表(Excel/JSON/二进制)
- 加密资源包(先找解密逻辑)
工具: AssetStudio(Unity 资源)、FModel(Unreal 资源)
外挂视角的常见目标
□ 内存修改: 数值搜索(CE/GameGuardian)→ 锁定/修改
□ 加速: 时间/速度相关字段
□ 透视: 渲染相关(视锥体/绘制调用)→ 通常要逆向渲染管线
□ 伤害计算: 找伤害函数 → 修改参数/绕过服务器校验
□ 协议: 客户端-服务器通信 → 抓包+协议逆向(第 24 章)
反作弊对抗
常见反作弊: 腾讯 ACE、网易易盾、TENCENT TP、BattlEye、EasyAntiCheat
对抗维度:
- 检测修改器 → 加密/混淆数值存储
- 检测调试器/Hook → 反调试(第 8 章)
- 服务器权威校验 → 客户端修改无效(只能改协议层)
- 反作弊驱动 → 内核对抗(第 27 章)
现实: 现代手游核心逻辑多在服务器,客户端逆向价值有限 → 先确认目标可逆性
32.6 游戏逆向决策树
游戏目标
├─ Unity? → 看 libil2cpp.so
│ ├─ 有 → IL2CPP → Il2CppDumper 恢复 → 分析
│ └─ 无(有 Assembly-CSharp.dll)→ Mono → dnSpy 直读
├─ Unreal? → 找 GObjects/GNames → 恢复 UObject → 分析
├─ Cocos? → 找 Lua/JS 脚本 → 脚本直读
├─ 自研引擎? → 原生逆向(第 3-8 章)
└─ 服务器权威? → 客户端逆向意义有限 → 转协议分析
32.7 练习与伦理
练习: 单机游戏修改(CE 搜索血量/金币)→ Unity 官方示例 → 开源游戏
红线: 只在你拥有/有授权的游戏上操作;不用于破坏他人游戏体验
动手练习
- 用 Unity 官方教程建一个简单游戏(含一个可修改数值),发布为 IL2CPP 版本,用 Il2CppDumper 恢复结构。
- 用 Cheat Engine 练习单机游戏数值修改,观察内存变化规律。
- 找一个 Unity 手游 APK,识别 Mono 还是 IL2CPP,分别演示两条路线。
- 用 AssetStudio 提取一个 Unity 游戏的资源包,看资源结构。
深入阅读
- 仓库:
skills/reverse-engineering/field-notes.md(Flutter/Unity 等二进制类型) - 仓库:
skills/reverse-engineering/languages-platforms.md(Android JNI/so 加载) - 仓库:
skills/reverse-engineering/kernel-driver-reverse.md(反作弊驱动的内核对抗) - 实战案例:
skills/field-journal/seed-014_unity-il2cpp-reverse.md(Unity IL2CPP 实战) - 仓库:
skills/field-journal/2026-05-15-cellular-pro-mumu-ksad-fragment-fix.md(移动游戏 SDK 案例)