用途:Unity IL2CPP 会把 C# 编译为原生代码,类名与方法名从二进制中剥离,但保留在 global-metadata.dat 中。本技能用于恢复原生函数地址与原始 C# 名称的对应关系,便于在 IDA/Ghidra 中分析。
关键文件:iOS 原生二进制位于 Frameworks/UnityFramework.framework/UnityFramework,Android 位于 lib/{arch}/libil2cpp.so;元数据位于 Data/Managed/Metadata/global-metadata.dat(iOS)或 assets/bin/Data/Managed/Metadata/global-metadata.dat(Android)。
工具选择:推荐 Il2CppDumper,Unity 6+(metadata v39)需使用 v39 分支 https://github.com/roytu/Il2CppDumper(branch: v39),支持 v24–v39;原版 https://github.com/Perfare/Il2CppDumper 仅支持到 v29。替代方案 Cpp2IL(https://github.com/SamboyCoding/Cpp2IL)支持 v39,但生成的 dummy DLL 缺少 [Address] 属性,更适合 C# 源码重建而非 IDA 导入。
使用方式:解压 IPA/APK 后定位二进制与元数据;用 xxd -l 8 "$METADATA" 查看前 8 字节判断版本(如 af1b b1fa 2700 0000 表示版本 0x27=39)。克隆并构建 v39 分支:git clone -b v39 https://github.com/roytu/Il2CppDumper.git,cd Il2CppDumper,DOTNET_ROLL_FORWARD=LatestMajor dotnet build -c Release,再以 DOTNET_ROLL_FORWARD=LatestMajor dotnet run --project Il2CppDumper/Il2CppDumper.csproj -c Release --framework net8.0 -- "$BINARY" "$METADATA" output_dir 运行。
输出与导入:成功后在输出目录生成 script.json(函数地址、名称、签名)、dump.cs(含 RVA/VA 的 C# 类转储)、il2cpp.h(C 结构体定义)和 ida_py3.py。IDA 中打开二进制,将 script.json 与 ida_py3.py 放同目录,通过 File → Script file 运行脚本自动重命名函数,可选加载 il2cpp.h 导入结构体;Ghidra 使用 ghidra.py 或 ghidra_with_struct.py。
限制与注意:需二进制与元数据来自同一构建,否则输出为空;非交互模式下退出码 134 属正常;macOS 上若被 SIGKILL(退出码 137)需 codesign -s - <binary>;script.json 中 Address 为十进制,需转十六进制供 IDA 使用。