Il2CppDumper 使用指南:用两个文件逆向 Unity IL2CPP 游戏
【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper
你手里有一款 Unity 游戏,C# 代码已被 IL2CPP 编译成 C++。你拿到的只有GameAssembly.dll或libil2cpp.so,传统 C# 反编译器对这种二进制无能为力——类名、方法、字段信息全都藏在二进制和元数据里。Il2CppDumper 就是为这种情况准备的逆向工具:给它 IL2CPP 可执行文件和global-metadata.dat,它能还原全部类型、方法签名和字段定义(不含方法体代码),并顺带生成可直接导入 IDA、Ghidra、Binary Ninja 的脚本和结构体头文件。
它支持 PE、ELF、ELF64、Mach-O、NSO、WASM 六种可执行格式,覆盖 Windows、Android、iOS/macOS、Switch 和 Web 平台,兼容 Unity 5.3 至 2022.2 的元数据版本(新版 il2cpp 支持也在持续跟进)。
环境准备与安装
你只需要 .NET 6.0 或 8.0 运行时,源码用 CLI 直接编译,没有额外的依赖步骤:
git clone https://gitcode.com/gh_mirrors/il/Il2CppDumper cd Il2CppDumper dotnet build -c Release编译完成后,可执行文件位于Il2CppDumper/bin/Release/net8.0/目录。在 Windows 上双击它可进入交互模式(弹出文件选择框);在 Linux/macOS 上则走命令行。
第一次完整运行:输入两个文件,得到一个输出目录
先记住一条命令行格式,后面所有场景都从它展开:
Il2CppDumper.exe <可执行文件> <global-metadata.dat> <输出目录>以 Windows 版游戏为例,三个参数分别是什么:
- 可执行文件——各平台对应的文件不一样:Windows 是
GameAssembly.dll或*Assembly.dll(注意不是游戏主程序 exe);Android 是libil2cpp.so;iOS/macOS 是 UnityFramework 内的二进制;Switch 是 NSO 格式的主程序文件;Web 是.wasm文件。 - 元数据文件——
global-metadata.dat,通常在游戏目录的Data/Managed/下,Android 在il2cpp_data/下。 - 输出目录——省略则输出到程序当前目录。
程序会根据文件头自动识别格式,不需要你手动声明。如果它判断出你喂的是一个内存 dump 文件(比如 ELF),会提示你输入内存基地址;交互模式下 Mach-O Fat 二进制还会让你选 32 位或 64 位。
运行完成后,输出目录里有什么
跑完之后按使用顺序看这几组文件,比孤立地记住文件名更容易上手:
- DummyDll/:还原出的程序集文件夹,用 dnSpy 或 ILSpy 打开,能逐类查看类型、方法、字段和特性。方法体是空的,只有签名。这个文件夹也是提取
MonoBehaviour/MonoScript引用的来源,资产提取工具常依赖它。 - dump.cs:全部元数据的文本版,方法偏移、字段偏移都在里面,适合直接
grep定位目标方法。 - il2cpp.h:C++ 结构体头文件,描述全部类的内存布局。
- script.json + ida.py / ghidra.py / Il2CppBinaryNinja/:把
script.json配合对应脚本导入逆向工具,方法地址会自动命名、类型自动应用。WASM 目标用ghidra_wasm.py。 - ida_with_struct.py / ghidra_with_struct.py:在 IDA 或 Ghidra 里读取
il2cpp.h并套用结构体信息。 - stringliteral.json:全部字符串字面量清单,搜字符串定位代码时很实用。
报错了怎么办
ERROR: Metadata file supplied is not valid metadata file.说明global-metadata.dat选错了,或者游戏对它做了加密混淆。先确认文件本身是否拿对;如果文件确实被加密,这个程序不负责解密,去找未加密的来源或对应的解密方案。Android 场景下,有 root 设备可以直接从内存里取未加密的文件来绕过。
ERROR: This file may be protected.可执行文件带保护。用 GameGuardian 一类的工具从游戏内存中 dump 出libil2cpp.so,再交给 Il2CppDumper 加载,按提示输入基地址,可绕过大部分保护。已 root 的设备同样有专门方案可绕几乎全部保护。
ERROR: Can't use auto mode to process file, try manual mode.自动搜索注册入口失败了。最常见的原因是选错可执行文件——Windows 平台必须是*Assembly.dll。若确认文件没错,程序接下来会提示手动输入 CodeRegistration 和 MetadataRegistration 两个地址,通过其他方式(调试器断点等)拿到后填入即可继续。
从能用到用好
💡 所有行为开关都在可执行文件旁边的config.json里,日常最常动的是三组:
- 强制版本:低版本 il2cpp 的二进制可能选不对解析器,把
ForceIl2CppVersion设为true,再用ForceVersion指定版本号,例如 Android v20 的二进制设成 16 才能正常工作。 - dump 文件:加载内存 dump 时把
ForceDump设为true强制识别;部分设备 dump 出的文件还需NoRedirectedPointer为true,把指针当未重定向处理。 - 输出控制:
DumpMethod、DumpField、DumpMethodOffset等决定 dump.cs 里输出哪些信息;GenerateDummyDll、GenerateStruct、GenerateScript控制对应产物是否生成;DummyDllAddToken控制是否附带 token。
批量处理一批游戏,套一层循环就行:
for game in ./games/*; do ./Il2CppDumper "$game/GameAssembly.dll" \ "$game/Data/Managed/global-metadata.dat" \ "./output/$(basename "$game")" done谁适合用它
- 安全研究员:先还原类型与方法全貌,再回 IDA 定位验证、反作弊相关逻辑。
- 游戏机制学习者:用 ILSpy 浏览 DummyDll,看类层次和方法签名,理解一款游戏的整体结构。
- 资产工具链用户:从 DummyDll 提取
MonoBehaviour/MonoScript的引用信息,喂给资源提取工具。
边界与提醒
⚠️ 工具的 il2cpp 版本必须与目标游戏匹配,解析不到关键数据时优先尝试ForceVersion参数。另外请只把逆向结果用于安全研究、学习和个人用途,遵守相关平台的服务条款,分析前备份原始文件。
下一步
当你能走通"两个文件 → 输出目录 → 导入 IDA"这条链路,基本流程就通了。接下来挑一个体积较小的 IL2CPP 游戏,把从 dump 到逆向工具里看见函数名的完整流程亲手做一遍。
【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考