从零跑通 Il2CppDumper:Unity IL2CPP 逆向的完整流程与避坑指南
【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper
Il2CppDumper 是目前做 Unity 逆向时最主流的 IL2CPP 反编译辅助工具:它把global-metadata.dat(存放类型、方法、字段等 C# 元信息的二进制文件)和 IL2CPP 编译产物(如GameAssembly.dll、libil2cpp.so)一起解析,重建出完整的类型结构,并生成 IDA、Ghidra 脚本和结构体头文件。
为什么传统反编译工具在这里失效
用 IL2CPP 方式构建的 Unity 游戏,C# 代码会先转成 C++、再编译成本机机器码。这意味着 dnSpy 这类 .NET 反编译器拿到的只是一堆原生指令,完全看不懂业务逻辑。Il2CppDumper 解决的就是这个断层:不恢复代码体,但能把类、方法、字段的名称和签名全部还原出来,再配合逆向工具分析具体实现。
它目前能做到的几件事:
- 还原 DLL(不含代码体),可从中提取 Unity 的
MonoBehaviour和MonoScript - 支持 PE、ELF/ELF64、Mach-O、NSO(Switch)、WASM 五类可执行格式,覆盖 Unity 5.3 至 2022.2
- 生成 IDA/Ghidra/BinaryNinja 脚本和
il2cpp.h结构体头文件 - 支持载入从游戏内存 dump 出来的文件,用于绕过部分保护
如何从零开始安装
整个过程只需要 .NET 环境。先把仓库克隆下来,再用dotnet build编译:
git clone https://gitcode.com/gh_mirrors/il/Il2CppDumper cd Il2CppDumper dotnet build -c Release产物在bin/Release/net8.0/下,除了主程序,还会带上config.json和全部工具脚本,后面所有定制都在这个配置里完成,改完不用重新编译。
第一次运行:两个文件、一个输出目录
入口有两种。Windows 下直接双击运行会弹文件选择框,依次选 IL2CPP 可执行文件和global-metadata.dat即可;命令行方式适合批量处理,三个参数分别对应可执行文件、metadata 和输出目录:
Il2CppDumper.exe <executable-file> <global-metadata> <output-directory>参数顺序其实无所谓,程序会读文件头魔数自动判断哪个是global-metadata.dat(魔数0xFAB11BAF),剩下的就是可执行文件,目录参数则以/结尾。不指定输出目录时,结果直接写在程序所在目录。
📌 第一次跑最容易卡住的地方,恰恰是文件选错。global-metadata.dat一般在游戏的Unity/或UnityData/子目录里;IL2CPP 可执行文件则因平台而异:
| 平台 | 文件 |
|---|---|
| Windows | GameAssembly.dll(不是游戏主 exe) |
| Android | libil2cpp.so |
| iOS / macOS | UnityFramework |
| Switch | NSO 格式的主程序文件 |
| Web | .wasm文件 |
特别提醒 PC 平台:目标是GameAssembly.dll(或*Assembly.dll),选错游戏主程序就会触发"Can't use auto mode"的报错。另外 iOS 的胖二进制(同时含 32/64 位)会交互式提示输入 32 位或 64 位的编号,这种交互在纯命令行批处理时不方便,最好提前挑出单架构文件。
顺利跑完的终端输出会依次出现 metadata 版本、il2cpp 版本、Searching…、Dumping…、Generate struct…、Generate dummy dll…,最后打印 Done!。
输出文件都是干什么用的
运行结束后,输出目录里最有价值的东西分两类:给人看的和给逆向工具用的。
给人看的是.csdump 文件和DummyDll/文件夹。前者包含所有命名空间、类型、方法签名以及字段/方法偏移;后者是可被 dnSpy、ILSpy 直接打开的还原 DLL,结构树清晰,还能提取MonoBehaviour/MonoScript给 Unity 资产工具(如 UtinyRipper、UABE)使用。
给逆向工具用的是script.json(方法注册信息)、stringliteral.json(字符串字面量)和il2cpp.h(C++ 结构体头文件),以及按工具区分的脚本:ida.py、ida_with_struct.py、ghidra.py、ghidra_wasm.py,还有面向 BinaryNinja 的插件目录。标准工作流是把 IL2CPP 可执行文件、script.json、il2cpp.h放到同一目录,在 IDA 里执行对应的.py,方法体和结构体就会自动挂上名字和类型——ida_with_struct.py这类带后缀的变体就是在基础脚本之上额外应用了il2cpp.h的结构信息,省掉了手工对照偏移的麻烦。
用 config.json 调整行为
大部分开关控制"生成什么产物":GenerateDummyDll、GenerateStruct以及各Dump*项决定dump.cs里写不写方法、字段、属性、偏移、类型索引;DummyDllAddToken控制是否给成员标注 token;RequireAnyKey管不管结束后等待按键退出。改完重跑一遍即可生效。
🧩 真正影响解析行为的有三个,也是排障时最常碰的:
ForceIl2CppVersion置true后,程序按ForceVersion指定的版本解析可执行文件(metadata 仍用自身头部的版本)。某些低版本 il2cpp 自动识别会失败,比如安卓 20 的场景下把ForceVersion设成 16 才能正常工作。ForceDump强制把可执行文件当作内存 dump 处理。NoRedirectedPointer把 dump 文件中的指针视为未重定向,部分设备 dump 出来的文件需要打开这项。
实战:分析一个带保护的 Android 手游
以某款 IL2CPP 手游为例,把完整链路走一遍。先从设备拷出Unity/目录(内含libil2cpp.so和global-metadata.dat),跑第一次:
Il2CppDumper.exe libil2cpp.so global-metadata.dat ./out/这次直接报"metadata 不是有效文件"——metadata 被加密了。绕法是从运行中的游戏内存里 dump 一份libil2cpp.so(GameGuardian 即可完成),再把它喂给工具。程序会提示"Detected this may be a dump file",让你输入 dump 基址,输入0则强制继续;如果设备 dump 出的指针是重定向的,把NoRedirectedPointer置true再跑。成功后out/DummyDll/里能直接翻到目标逻辑类,再用ida.py+script.json把libil2cpp.so拖进 IDA,方法名和结构体都齐了。
批量处理多个游戏时,一条 for 循环就能搞定:
for game in ./games/*/; do name=$(basename "$game") Il2CppDumper.exe "$game/libil2cpp.so" "$game/global-metadata.dat" "./out/$name" done常见报错怎么排查
⚠️ 报错基本集中在四种情况,按顺序对一下号。
ERROR: Metadata file supplied is not valid metadata file.说明global-metadata.dat被加密或者拿错了文件。解密思路去相关逆向社区找,不建议自己硬啃;有 root 安卓设备的话,直接从内存 dump 是更省事的路径。
ERROR: Can't use auto mode to process file, try manual mode.十有八九是选错了可执行文件(PC 平台又拿了游戏主 exe)。程序内部的自动定位策略是 PlusSearch → Search → SymbolSearch 三级回退,全部失败才会进入手动模式,提示你手工输入CodeRegistration和MetadataRegistration两个地址——手动模式是兜底方案,正常流程不应该走到这里。
ERROR: This file may be protected.表示可执行文件本身加了保护,工具会尝试绕过简单的 PE 保护,但更稳妥的做法还是内存 dump 后再分析。
ERROR: il2cpp file not supported.则是文件格式没识别出来,回到"文件选对了吗"这一步重新确认;低版本 il2cpp 的解析异常则优先试ForceIl2CppVersion+ForceVersion组合。
以上工具请仅用于安全研究、技术学习和授权范围内的分析,不要用于破解商业游戏,分析前备份好原始文件。
下一步建议:把目标游戏的 IL2CPP 可执行文件和global-metadata.dat放到同一个目录,按上面的命令行格式跑一遍,从dump.cs开始读起。
【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考