Unity IL2CPP 逆向实战指南:如何用 Il2CppDumper 三步还原出可读的类结构

发布时间:2026/8/21 16:39:50
Unity IL2CPP 逆向实战指南:如何用 Il2CppDumper 三步还原出可读的类结构 Unity IL2CPP 逆向实战指南如何用 Il2CppDumper 三步还原出可读的类结构【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper深夜十一点你终于从网盘拖下一个热门手游的 APK满怀期待地解压、翻目录在lib/arm64-v8a/里找到了libil2cpp.so又在assets/bin/Data/里找到了global-metadata.dat。你把这两个文件丢给 Il2CppDumper回车——屏幕上只留下一行冷冰冰的英文报错。搜遍论坛帖子都说这是经典问题可没有一个人告诉你下一步该点哪里。别急着把工具扔进回收站。这行报错的背后藏着 Unity IL2CPP 编译模式的全部秘密C# 代码被编译成了原生机器码类型信息则被单独锁进元数据文件里形成逆向路上的双重黑盒。而 Il2CppDumper 正是那个负责开锁翻译的工具。这篇文章从报错现场讲起带你一步步走到还原成功。原理速览一句话搞懂这台逆向翻译机Il2CppDumper 的核心工作可以压缩成一句话吃进两份二进制文件吐出一本完整的类户口簿——类名、方法签名、字段、继承关系全部按可读格式列出来。打个比方它就像在核对一本被撕碎的电话簿global-metadata.dat是姓名和号码libil2cpp.so是每个人的住址函数指针工具的工作就是拿着号码簿去逐个核对住址把谁住在哪里重新拼装起来。注意它只还原目录不还原正文——代码逻辑仍以原生机器码的形式躺在二进制里需要配合反汇编工具去读。这也是后面所有技巧的出发点。好消息是这套机制对几乎所有主流格式通吃ELF安卓、Mach-OiOS、PEWindows、NSOSwitch以及 WebAssembly覆盖 Unity 5.3 到 2022.2。原理讲清楚了接下来就动手试试。上手三步曲从零跑到第一次成功还原第一关环境准备——凑齐两个输入文件目标解开游戏安装包拿到libil2cpp.so与global-metadata.dat这两份输入并准备好 Il2CppDumper 本体。操作步骤# 1. 克隆工具本体运行需要 .NET 运行时 git clone https://gitcode.com/gh_mirrors/il/Il2CppDumper # 2. 解压 APK 安装包以 7-Zip 为例 7z x game.apk -oextracted_apk # 3. 定位安卓平台的游戏二进制确认它真实存在 cd extracted_apk/lib/arm64-v8a/ ls libil2cpp.so # 4. 定位元数据文件 cd ../../assets/bin/Data/ ls global-metadata.dat成功标志两个文件都静静躺在预期目录里再用hexdump -C libil2cpp.so | head -1看一眼前 4 个字节是7f 45 4c 46ELF 魔数说明文件格式没认错。小贴士如果你在折腾 PC 版游戏请忘掉.so——Windows 平台 IL2CPP 的可执行文件叫GameAssembly.dll或*Assembly.dll拿安卓教程硬套只会收获新一轮报错。第二关首个实战任务——跑通一次完整还原目标用命令行三参数的方式执行一次还原得到 dump.cs、DummyDll 等首批产物。操作步骤# 命令行用法可执行文件 元数据文件 输出目录 Il2CppDumper.exe libil2cpp.so global-metadata.dat output程序会自动进入 auto 模式先读元数据再扫描二进制里的函数注册表把两边对应起来。Windows 下偷懒也可以直接双击 exe用弹出的文件对话框依次选中两个文件。成功标志终端依次打印Metadata Version、Il2Cpp Version、Searching...、Dumping...、Done!output目录里出现DummyDll文件夹、dump.cs、ida.py、ghidra.py、il2cpp.h、script.json等文件。用 dnSpy 打开DummyDll里的Assembly-CSharp.dll左侧导航树里已经能看到命名空间和类名。小贴士如果看到ERROR: Metadata file supplied is not valid metadata file.先别怀疑路径拼错了——九成是元数据被加密处理方法在文末避坑问答里。第三关参数调优——用 config.json 定制输出细节目标看懂config.json里每个开关的作用按需裁剪输出避免生成一堆用不上的文件。操作步骤打开工具目录下的config.json按注释调整{ GenerateDummyDll: true, // 是否生成伪 DLL纯类型信息 DumpMethod: true, // dump.cs 里是否输出方法 DumpFieldOffset: true, // 是否输出字段偏移分析内存布局用 DummyDllAddToken: true, // 是否给伪 DLL 附加 token RequireAnyKey: true, // 结束时是否需要按键退出脚本化时关掉 ForceIl2CppVersion: false, // 旧版本解析失败时改为 true ForceVersion: 16, // 配合上一项指定解析器版本 ForceDump: false // 强制把输入当作内存 dump 文件处理 }成功标志保存后重新运行dump.cs的体积和内容随开关变化——比如关掉DumpFieldOffset行数立刻缩水一截。小贴士动手改配置前先复制一份原文件备份。把config.json折腾到工具无法启动的惨案我是见过的别问我是怎么知道的。效率进阶让工具为你打工的 3 个玩法跑通一次只是开始真正拉开差距的是批量化和联动能力。下面三个玩法按难度递增挑一个适合你的上手。玩法一脚本化批量还原。把单次操作封装成循环一次处理十几个安装包# 批量处理脚本Linux/macOS自动解压并逐一还原 for apk in apks/*.apk; do name$(basename $apk .apk) 7z x $apk -owork/$name -y /dev/null sowork/$name/lib/arm64-v8a/libil2cpp.so metawork/$name/assets/bin/Data/global-metadata.dat dotnet Il2CppDumper.dll $so $meta out/$name done配合把RequireAnyKey设为false脚本就能无人值守地跑完整夜。玩法二与 IDA/Ghidra 联动让反汇编看得懂。还原出的il2cpp.h和ida_with_struct.py/ghidra.py不是摆设在反汇编工具里跑一下脚本它会把函数地址、类名、结构体一次性注入工程窗口里的sub_xxxx会摇身变成PlayerController_Update汇编阅读体验直接上一个台阶。玩法三程序化调用绕开命令行。工具的核心逻辑封装在 Utils/Il2CppExecutor.cs 里如果你要写自定义导出工具可以直接引用这个类在内存里拿到 metadata 与 il2Cpp 对象后再自行加工自由度比命令行高得多。避坑问答新手最常踩的 5 个坑Q1报Metadata file supplied is not valid metadata file是文件选错了吗大概率不是选错而是元数据被加密了。先确认你给的就是assets/bin/Data/下的原始文件若确认无误说明游戏做了保护需要从游戏内存中 dump 出解密后的数据再喂给工具。注意这类加解密问题不在工具的职责范围内不要在 issues 里求破解。Q2报Cant use auto mode to process file, try manual mode接下来怎么办自动搜索失败。先确认平台选对了PC 端用GameAssembly.dll/*Assembly.dll再尝试在config.json里开ForceIl2CppVersion并指定ForceVersion回退解析器版本最后才轮到手动模式——按提示输入CodeRegistration和MetadataRegistration两个十六进制地址。Q3提示This file may be protected怎么绕过说明libil2cpp.so被加壳保护了。常规做法是借助 GameGuardian 之类的工具在游戏运行期间从内存里 dump 一份libil2cpp.so然后用ForceDump加载按提示输入 dump 地址即可绕过大部分保护。Q4生成的 Dummy DLL 里看不到函数实现是工具坏了吗不是这是设计如此。伪 DLL 只含类型信息——类名、方法签名、字段——不包含 IL 代码想看逻辑得去反汇编层配合玩法二提到的 IDA/Ghidra 脚本。Q5换了个新版本游戏后突然解析失败为什么以前能用IL2CPP 的格式随 Unity 版本不断演化。启动日志里的Metadata Version会告诉你当前元数据的版本号先核对它是否在工具支持范围内5.3 ~ 2022.2再考虑用ForceIl2CppVersion回退到旧版解析器。结尾升华从会用工具到理解方法论工具能帮你还原结构但真正的逆向能力在于三点思维把还原结果当地图而不是答案。Dummy DLL 告诉你村庄在哪反汇编才能告诉你村里在干什么两者永远要配合使用。先校验输入再怪工具。文件格式、Unity 版本、加密状态——这三件事占据了八成以上的报错根源排查顺序永远从输入开始。保护与对抗是动态的。学会内存 dump、版本回退这些软手段比死记参数更经得起时间考验。想继续深挖可以顺着 Il2Cpp/Metadata.cs 和 Il2Cpp/Il2Cpp.cs 研究元数据的二进制布局或了解运行时抓取数据的技术方案那将是另一片天地。最后提醒一句逆向分析请务必在法律与软件许可允许的范围内进行把技术用在学习与研究自己拥有权限的软件上这条路才能走得长远。【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻