逆向工程实战手册 第 32 章

第 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 官方示例 → 开源游戏
红线: 只在你拥有/有授权的游戏上操作;不用于破坏他人游戏体验

动手练习

  1. 用 Unity 官方教程建一个简单游戏(含一个可修改数值),发布为 IL2CPP 版本,用 Il2CppDumper 恢复结构。
  2. 用 Cheat Engine 练习单机游戏数值修改,观察内存变化规律。
  3. 找一个 Unity 手游 APK,识别 Mono 还是 IL2CPP,分别演示两条路线。
  4. 用 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 案例)