Il2CppDumper 完整指南:10 分钟还原 Unity IL2CPP 游戏的类结构
2026/9/22 21:11:06 网站建设 项目流程

Il2CppDumper 完整指南:10 分钟还原 Unity IL2CPP 游戏的类结构

【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper

你拿到的游戏目录里有GameAssembly.dllglobal-metadata.dat两个文件,但用 dnSpy、ILSpy 这类 .NET 反编译工具打开前者只会一片空白。这是 IL2CPP 编译的结果——Unity 把 C# 代码先转成 C++ 再编译成原生二进制,普通反编译器已经读不懂它。Il2CppDumper 就是干这件事的:它解析这两个文件,把游戏的类、字段、方法、结构体信息还原出来,并生成能导入 IDA、Ghidra、Binary Ninja 的分析脚本。写 Unity 游戏想反查接口、做安全研究、学习游戏架构的人,都用得上它。下面按"装好 → 跑通 → 用输出 → 排错"的顺序讲一遍。

IL2CPP 让反编译器失效,Il2CppDumper 补上这一环

先解释两个关键词。IL2CPP 是 Unity 的编译链路:C# 代码经中间层转成 C++,再由编译器产出 PE(Windows 可执行文件格式)、ELF(Linux/Android 可执行文件格式)、Mach-O(macOS/iOS 可执行文件格式)等原生二进制。global-metadata.dat是 Unity 随游戏一起打包的元数据文件(位于Assets/il2cpp_data/Metadata),里面存着类型名、方法名、字段等"骨架"信息,但不含代码本身。

Il2CppDumper 的工作分三步:

  • global-metadata.dat,拿到全部类型、方法、字段的定义
  • 定位二进制里的代码注册表,把每个方法对应到实际地址
  • 把两者拼起来输出:dump.cs、可反编译的 DummyDll、供逆向工具用的脚本

它支持 Unity 5.3 到 2022.2 的版本区间,覆盖下面这些平台的可执行文件:

平台文件格式文件位置
WindowsPE游戏根目录的GameAssembly.dll
AndroidELF / ELF64libs/arm64-v8a/libil2cpp.so
iOS / macOSMach-O主程序中的UnityFramework
Nintendo SwitchNSO主程序文件(工具会自动解压)
WebWebAssembly.wasm文件

各格式的识别与解析逻辑分别放在 ExecutableFormats 目录的PE.csElf.csMacho.csNSO.csWebAssembly.cs等文件里,想深入看实现可以从这里入手。

安装 Il2CppDumper:克隆、编译、拿到可执行文件

工具基于 .NET 开发,需要 .NET 6.0 或 8.0 SDK。下面命令的作用是把源码克隆到本地:

git clone https://gitcode.com/gh_mirrors/il/Il2CppDumper cd Il2CppDumper

编译 Release 版本并产出可执行文件:

dotnet build -c Release

编译完成后,可执行文件在Il2CppDumper/bin/Release/net8.0/下,连同config.jsonida.pyghidra.py等脚本一起拷出即可使用。如果不想自己编译,也可以直接下载发行版(Release)里预编译好的压缩包,解压即用,两者行为一致。

第一次运行:两个文件加一个输出目录

命令行用法只有三个参数——可执行文件、global-metadata.dat、输出目录:

Il2CppDumper.exe <executable-file> <global-metadata> <output-directory>

参数顺序无所谓,程序会按文件头魔数自动判断哪个是 metadata(Program.cs里通过0xFAB11BAF识别),第三个参数是目录就当作输出目录。

以 Windows 版游戏为例,假设游戏放在D:\Games\MyGame,运行:

Il2CppDumper.exe "D:\Games\MyGame\GameAssembly.dll" "D:\Games\MyGame\Il2CppData\global-metadata.dat" D:\out

正常时控制台会依次打印:

  • Metadata Version: xxx——识别出的 Unity 版本
  • Il2Cpp Version: xx——选用的二进制解析器版本
  • Searching...——自动搜索代码注册表
  • Dumping...Done!——开始写出结果

如果自动搜索失败,程序会退到手动模式,提示你输入CodeRegistrationMetadataRegistration两个十六进制基址,从 IDA 里搜il2cpp_codegen相关字符串即可定位。另外程序会检测输入是否是内存 dump 出来的文件,若是会要求输入 dump 基址,这一节后面报错章节细讲。

看懂输出:dump.cs、DummyDll 和 il2cpp.h

输出全部落在你指定的目录里,各文件分工如下:

文件作用
dump.cs最核心的文本:所有类、字段、方法、偏移的文本转储,直接搜索用
DummyDll/还原出的 .NET 程序集,代码体为空,但类型签名完整
script.json方法地址表,供 ida.py / ghidra.py / Binary Ninja 插件消费
il2cpp.hC++ 结构体头文件,描述游戏对象在内存里的布局
stringliteral.json所有字符串字面量,方便全局搜文案

两个主要用法:

  • 只想知道类和方法长什么样:打开DummyDll里的 DLL,用 dnSpy、ILSpy 浏览。这是还原的"空壳"程序集,但命名空间、继承关系、方法签名都真实可用;它还能配合 UtinyRipper、UABE 提取MonoBehaviourMonoScript
  • 要看内存布局:读il2cpp.h。做内存修改、定位对象字段偏移时,这个头文件比任何反编译都准。

生成逻辑在 Outputs 目录:Il2CppDecompiler.cs负责dump.csStructGenerator.cs负责结构体和 JSON,DummyAssemblyExporter.cs负责 DummyDll。

把 Il2CppDumper 接进 IDA、Ghidra 或 Binary Ninja

dump.cs能告诉你"有什么",但看不到函数具体怎么实现。要看实现,得把方法地址灌进逆向工具,这正是那批 Python 脚本干的事。

逆向工具脚本 / 插件用法
IDAida.py(IDA 7.x 用ida_py3.py在 IDA 里运行,自动导入script.json建函数
IDAida_with_struct.py额外读取il2cpp.h,把结构体应用进 IDA
Ghidraghidra.py在 Ghidra 脚本窗口运行
Ghidraghidra_wasm.py配合 wasm 插件分析.wasm目标
Binary NinjaIl2CppBinaryNinja插件目录放到插件目录加载

脚本放在项目根目录:Il2CppDumper/ida.py、Il2CppDumper/ghidra.py、Il2CppDumper/Il2CppBinaryNinja。标准流程是:先用 Il2CppDumper 生成输出 → 在 IDA/Ghidra 里打开游戏的GameAssembly.dlllibil2cpp.so→ 运行对应脚本 → 所有方法名、结构体自动就位,然后按名字跳转分析。

config.json 里真正有用的几个开关

所有行为开关集中在 Il2CppDumper/config.json,按需改完再跑即可。默认配置大致如下:

{ "GenerateDummyDll": true, "GenerateStruct": true, "ForceIl2CppVersion": false, "ForceVersion": 16, "ForceDump": false, "NoRedirectedPointer": false }
配置项什么时候用
DumpMethod/DumpField/DumpFieldOffset等 7 项控制dump.cs里写不写对应信息,嫌文件大就关
GenerateDummyDll/GenerateStruct不想生成的产物就设false
DummyDllAddToken是否在 DummyDll 里保留 token 注释
RequireAnyKey结束后是否按任意键退出
ForceIl2CppVersion+ForceVersion老版本 il2cpp 二进制识别不准时强制指定解析器版本
ForceDump程序没识别出是内存 dump 文件时,强制按 dump 处理
NoRedirectedPointer部分设备 dump 出的文件指针未重定向,需设true

ForceIl2CppVersion是最常被忽略的一项。比如 Android 上 Unity 2020 版本的目标,可能需要把ForceVersion改成16才能正确解析(metadata 版本不受影响,只影响二进制解析器的选择)。

遇到三种报错和内存 dump 文件怎么办

这是新手卡得最多的地方,按报错逐条对照。

1.ERROR: Metadata file supplied is not valid metadata file.

选错了文件,或global-metadata.dat被游戏加密了。先用十六进制编辑器确认文件头是BAAF11BA(小端)。若确实被加密,解密工作超出本工具范围,作者也明确拒绝为此提 issue;root 过的安卓设备可以配合作者的 Zygisk 项目从内存中拿到未加密内容。

2.ERROR: Can't use auto mode to process file, try manual mode.

自动搜索注册表失败。先确认 PC 目标选的是GameAssembly.dll*Assembly.dll,而不是 exe 本体。确认无误就按提示手动输入两个基址,或带着样本去项目 issues 反馈。

3.ERROR: This file may be protected.

二进制被加了保护壳。通用解法:在游戏运行时用内存修改工具(如 GameGuardian)把libil2cpp.so从进程内存里 dump 出来,再用 Il2CppDumper 加载这个 dump 文件,可绕过大部分保护。

内存 dump 文件会多一步交互。程序检测到 ELF 文件可能是 dump 产物时,会打印Detected this may be a dump file.并要求输入 dump 基址(十六进制),输入0则强制继续。此时ForceDumpNoRedirectedPointer两个配置项就派上用场了,含义见上一节的表。

用 Il2CppDumper 批量处理多个游戏

一次分析一个游戏很快,但如果你有十几款游戏要过一遍,逐个手动跑就受不了了。命令行接口就是为脚本化的,下面脚本的作用是把./games/下每个游戏子目录里的两个文件依次送进工具:

#!/bin/bash for d in ./games/*/; do name=$(basename "$d") Il2CppDumper.exe "$d/GameAssembly.dll" \ "$d/Il2CppData/global-metadata.dat" \ "./output/$name" done

注意各游戏目录结构可能不同(Android 的 so 在libs/下、metadata 路径也不同),建议先用find或目录约定统一一下。每款游戏的输出独立放在output/<游戏名>/,方便后续用dump.cs做跨游戏的文本检索。

最后

Il2CppDumper 的价值在于:它把"IL2CPP 游戏没法反编译"变成了"先还原骨架,再进逆向工具看实现"。按上面顺序走一遍——装好、跑通、接进 IDA——就能进入日常分析节奏。提醒一句法律边界:本内容仅面向安全研究与学习,分析对象应限于你有授权或有合法依据的软件,避免触碰商业游戏的服务条款。

【免费下载链接】Il2CppDumperUnity il2cpp reverse engineer项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询