从零跑通 Il2CppDumper:Unity IL2CPP 逆向的完整流程与避坑指南 从零跑通 Il2CppDumperUnity IL2CPP 逆向的完整流程与避坑指南【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumperIl2CppDumper 是目前做 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、NSOSwitch、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 可执行文件则因平台而异平台文件WindowsGameAssembly.dll不是游戏主 exeAndroidlibil2cpp.soiOS / macOSUnityFrameworkSwitchNSO 格式的主程序文件Web.wasm文件特别提醒 PC 平台目标是GameAssembly.dll或*Assembly.dll选错游戏主程序就会触发Cant 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.hC 结构体头文件以及按工具区分的脚本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控制是否给成员标注 tokenRequireAnyKey管不管结束后等待按键退出。改完重跑一遍即可生效。 真正影响解析行为的有三个也是排障时最常碰的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.soGameGuardian 即可完成再把它喂给工具。程序会提示Detected this may be a dump file让你输入 dump 基址输入0则强制继续如果设备 dump 出的指针是重定向的把NoRedirectedPointer置true再跑。成功后out/DummyDll/里能直接翻到目标逻辑类再用ida.pyscript.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: Cant 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 的解析异常则优先试ForceIl2CppVersionForceVersion组合。以上工具请仅用于安全研究、技术学习和授权范围内的分析不要用于破解商业游戏分析前备份好原始文件。下一步建议把目标游戏的 IL2CPP 可执行文件和global-metadata.dat放到同一个目录按上面的命令行格式跑一遍从dump.cs开始读起。【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考