Il2CppDumper 完整指南:10 分钟还原 Unity IL2CPP 游戏的类结构
【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper
你拿到的游戏目录里有GameAssembly.dll和global-metadata.dat两个文件,但用 dnSpy、ILSpy 这类 .NET 反编译工具打开前者只会一片空白。这是 IL2CPP 编译的结果——Unity 把 C# 代码先转成 C++ 再编译成原生二进制,普通反编译器已经读不懂它。Il2CppDumper 就是干这件事的:它解析这两个文件,把游戏的类、字段、方法、结构体信息还原出来,并生成能导入 IDA、Ghidra、Binary Ninja 的分析脚本。写 Unity 游戏想反查接口、做安全研究、学习游戏架构的人,都用得上它。下面按"装好 → 跑通 → 用输出 → 排错"的顺序讲一遍。
IL2CPP 让反编译器失效,Il2CppDumper 补上这一环
先解释两个关键词。IL2CPP 是 Unity 的编译链路:C# 代码经中间层转成 C++,再由编译器产出 PE(Windows 可执行文件格式)、ELF(Linux/Android 可执行文件格式)、Mach-O(macOS/iOS 可执行文件格式)等原生二进制。global-metadata.dat是 Unity 随游戏一起打包的元数据文件(位于Assets/il2cpp_data/Metadata),里面存着类型名、方法名、字段等"骨架"信息,但不含代码本身。
Il2CppDumper 的工作分三步:
- 读
global-metadata.dat,拿到全部类型、方法、字段的定义 - 定位二进制里的代码注册表,把每个方法对应到实际地址
- 把两者拼起来输出:
dump.cs、可反编译的 DummyDll、供逆向工具用的脚本
它支持 Unity 5.3 到 2022.2 的版本区间,覆盖下面这些平台的可执行文件:
| 平台 | 文件格式 | 文件位置 |
|---|---|---|
| Windows | PE | 游戏根目录的GameAssembly.dll |
| Android | ELF / ELF64 | libs/arm64-v8a/libil2cpp.so |
| iOS / macOS | Mach-O | 主程序中的UnityFramework |
| Nintendo Switch | NSO | 主程序文件(工具会自动解压) |
| Web | WebAssembly | .wasm文件 |
各格式的识别与解析逻辑分别放在 ExecutableFormats 目录的PE.cs、Elf.cs、Macho.cs、NSO.cs、WebAssembly.cs等文件里,想深入看实现可以从这里入手。
安装 Il2CppDumper:克隆、编译、拿到可执行文件
工具基于 .NET 开发,需要 .NET 6.0 或 8.0 SDK。下面命令的作用是把源码克隆到本地:
git clone https://gitcode.com/gh_mirrors/il/Il2CppDumper cd Il2CppDumper编译 Release 版本并产出可执行文件:
dotnet build -c Release编译完成后,可执行文件在Il2CppDumper/bin/Release/net8.0/下,连同config.json、ida.py、ghidra.py等脚本一起拷出即可使用。如果不想自己编译,也可以直接下载发行版(Release)里预编译好的压缩包,解压即用,两者行为一致。
第一次运行:两个文件加一个输出目录
命令行用法只有三个参数——可执行文件、global-metadata.dat、输出目录:
Il2CppDumper.exe <executable-file> <global-metadata> <output-directory>参数顺序无所谓,程序会按文件头魔数自动判断哪个是 metadata(Program.cs里通过0xFAB11BAF识别),第三个参数是目录就当作输出目录。
以 Windows 版游戏为例,假设游戏放在D:\Games\MyGame,运行:
Il2CppDumper.exe "D:\Games\MyGame\GameAssembly.dll" "D:\Games\MyGame\Il2CppData\global-metadata.dat" D:\out正常时控制台会依次打印:
Metadata Version: xxx——识别出的 Unity 版本Il2Cpp Version: xx——选用的二进制解析器版本Searching...——自动搜索代码注册表Dumping...→Done!——开始写出结果
如果自动搜索失败,程序会退到手动模式,提示你输入CodeRegistration和MetadataRegistration两个十六进制基址,从 IDA 里搜il2cpp_codegen相关字符串即可定位。另外程序会检测输入是否是内存 dump 出来的文件,若是会要求输入 dump 基址,这一节后面报错章节细讲。
看懂输出:dump.cs、DummyDll 和 il2cpp.h
输出全部落在你指定的目录里,各文件分工如下:
| 文件 | 作用 |
|---|---|
dump.cs | 最核心的文本:所有类、字段、方法、偏移的文本转储,直接搜索用 |
DummyDll/ | 还原出的 .NET 程序集,代码体为空,但类型签名完整 |
script.json | 方法地址表,供 ida.py / ghidra.py / Binary Ninja 插件消费 |
il2cpp.h | C++ 结构体头文件,描述游戏对象在内存里的布局 |
stringliteral.json | 所有字符串字面量,方便全局搜文案 |
两个主要用法:
- 只想知道类和方法长什么样:打开
DummyDll里的 DLL,用 dnSpy、ILSpy 浏览。这是还原的"空壳"程序集,但命名空间、继承关系、方法签名都真实可用;它还能配合 UtinyRipper、UABE 提取MonoBehaviour、MonoScript。 - 要看内存布局:读
il2cpp.h。做内存修改、定位对象字段偏移时,这个头文件比任何反编译都准。
生成逻辑在 Outputs 目录:Il2CppDecompiler.cs负责dump.cs,StructGenerator.cs负责结构体和 JSON,DummyAssemblyExporter.cs负责 DummyDll。
把 Il2CppDumper 接进 IDA、Ghidra 或 Binary Ninja
dump.cs能告诉你"有什么",但看不到函数具体怎么实现。要看实现,得把方法地址灌进逆向工具,这正是那批 Python 脚本干的事。
| 逆向工具 | 脚本 / 插件 | 用法 |
|---|---|---|
| IDA | ida.py(IDA 7.x 用ida_py3.py) | 在 IDA 里运行,自动导入script.json建函数 |
| IDA | ida_with_struct.py | 额外读取il2cpp.h,把结构体应用进 IDA |
| Ghidra | ghidra.py | 在 Ghidra 脚本窗口运行 |
| Ghidra | ghidra_wasm.py | 配合 wasm 插件分析.wasm目标 |
| Binary Ninja | Il2CppBinaryNinja插件目录 | 放到插件目录加载 |
脚本放在项目根目录:Il2CppDumper/ida.py、Il2CppDumper/ghidra.py、Il2CppDumper/Il2CppBinaryNinja。标准流程是:先用 Il2CppDumper 生成输出 → 在 IDA/Ghidra 里打开游戏的GameAssembly.dll或libil2cpp.so→ 运行对应脚本 → 所有方法名、结构体自动就位,然后按名字跳转分析。
config.json 里真正有用的几个开关
所有行为开关集中在 Il2CppDumper/config.json,按需改完再跑即可。默认配置大致如下:
{ "GenerateDummyDll": true, "GenerateStruct": true, "ForceIl2CppVersion": false, "ForceVersion": 16, "ForceDump": false, "NoRedirectedPointer": false }| 配置项 | 什么时候用 |
|---|---|
DumpMethod/DumpField/DumpFieldOffset等 7 项 | 控制dump.cs里写不写对应信息,嫌文件大就关 |
GenerateDummyDll/GenerateStruct | 不想生成的产物就设false |
DummyDllAddToken | 是否在 DummyDll 里保留 token 注释 |
RequireAnyKey | 结束后是否按任意键退出 |
ForceIl2CppVersion+ForceVersion | 老版本 il2cpp 二进制识别不准时强制指定解析器版本 |
ForceDump | 程序没识别出是内存 dump 文件时,强制按 dump 处理 |
NoRedirectedPointer | 部分设备 dump 出的文件指针未重定向,需设true |
ForceIl2CppVersion是最常被忽略的一项。比如 Android 上 Unity 2020 版本的目标,可能需要把ForceVersion改成16才能正确解析(metadata 版本不受影响,只影响二进制解析器的选择)。
遇到三种报错和内存 dump 文件怎么办
这是新手卡得最多的地方,按报错逐条对照。
1.ERROR: Metadata file supplied is not valid metadata file.
选错了文件,或global-metadata.dat被游戏加密了。先用十六进制编辑器确认文件头是BAAF11BA(小端)。若确实被加密,解密工作超出本工具范围,作者也明确拒绝为此提 issue;root 过的安卓设备可以配合作者的 Zygisk 项目从内存中拿到未加密内容。
2.ERROR: Can't use auto mode to process file, try manual mode.
自动搜索注册表失败。先确认 PC 目标选的是GameAssembly.dll或*Assembly.dll,而不是 exe 本体。确认无误就按提示手动输入两个基址,或带着样本去项目 issues 反馈。
3.ERROR: This file may be protected.
二进制被加了保护壳。通用解法:在游戏运行时用内存修改工具(如 GameGuardian)把libil2cpp.so从进程内存里 dump 出来,再用 Il2CppDumper 加载这个 dump 文件,可绕过大部分保护。
内存 dump 文件会多一步交互。程序检测到 ELF 文件可能是 dump 产物时,会打印Detected this may be a dump file.并要求输入 dump 基址(十六进制),输入0则强制继续。此时ForceDump和NoRedirectedPointer两个配置项就派上用场了,含义见上一节的表。
用 Il2CppDumper 批量处理多个游戏
一次分析一个游戏很快,但如果你有十几款游戏要过一遍,逐个手动跑就受不了了。命令行接口就是为脚本化的,下面脚本的作用是把./games/下每个游戏子目录里的两个文件依次送进工具:
#!/bin/bash for d in ./games/*/; do name=$(basename "$d") Il2CppDumper.exe "$d/GameAssembly.dll" \ "$d/Il2CppData/global-metadata.dat" \ "./output/$name" done注意各游戏目录结构可能不同(Android 的 so 在libs/下、metadata 路径也不同),建议先用find或目录约定统一一下。每款游戏的输出独立放在output/<游戏名>/,方便后续用dump.cs做跨游戏的文本检索。
最后
Il2CppDumper 的价值在于:它把"IL2CPP 游戏没法反编译"变成了"先还原骨架,再进逆向工具看实现"。按上面顺序走一遍——装好、跑通、接进 IDA——就能进入日常分析节奏。提醒一句法律边界:本内容仅面向安全研究与学习,分析对象应限于你有授权或有合法依据的软件,避免触碰商业游戏的服务条款。
【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考