简介Il2CppDumper-win-v6.7.46 是一款面向 Unity 逆向工程与游戏安全分析场景的元数据还原工具核心目标是帮助分析人员从 il2cpp 二进制中还原动态链接库结构信息不包含代码进而定位 MonoBehaviour 与 MonoScript 类为后续静态分析打下基础。工具覆盖范围广支持 ELF、Mach-O、PE、NSO 和 WASM 等主流可执行格式兼容 Unity 5.3 至 2020 版本还可读取内存转储得到的 libil2cpp.so 文件来绕过保护并能处理带简单保护壳的 PE 文件。压缩包共 11 个文件、约 10.7 兆字节由两个 Windows 可执行程序、八个 Python 脚本以及一个 JSON 配置组成脚本主要用于生成带结构体信息的 IDA/Ghidra 助手脚本、导出结构体头文件以及补充 wasm 分析能力可以显著减少人工逆向的重复操作。目前已有 1022 人学习下载适合逆向工程师、CTF 选手及游戏安全研究者用于 Unity 游戏逻辑还原与工具链整合。 拿到一个Unity游戏包本想着跟以前一样把Assembly-CSharp.dll丢进dnSpy里慢慢看逻辑结果解包出来的却是一个几百MB的native二进制文件和一个叫global-metadata.dat的东西没有以往那些热乎的托管DLL。相信不少刚接触Unity逆向的朋友都在这一步卡过。没错这就是IL2CPP打包方式的典型特征。而这次要聊的 Il2CppDumper-win-v6.7.46就是绕开这个坎的关键工具它的作用是在没有托管DLL的情况下把GameAssembly.dllWindows平台或libil2cpp.soAndroid平台配合global-metadata.dat重新还原出结构清晰的dump.cs和一堆可浏览的桩DLL文件。这篇文章会把这套东西掰开揉碎从为什么Unity会产出这种二进制元数据的组合讲起再带你把原理、实操、踩坑、进阶使用整个流程走一遍。适合正在做Unity游戏功能分析、安全研究、Mod开发或者单纯被IL2CPP搞得头大的同学参考。1. 为什么Unity游戏会变成二进制元数据两个文件1.1 Mono时代托管DLL随处可见的日子早年的Unity默认走Mono虚拟机C#代码编译成IL中间语言打包后就是一个一个的托管DLL其中游戏主逻辑通常叫Assembly-CSharp.dll。这种DLL是标准.NET程序集直接用dnSpy、ILSpy这些工具就能打开类名、方法名、甚至整个反编译源码都能看。对逆向来说那几乎是开卷考试。也正是因为太开卷游戏厂商越来越不爽——你辛辛苦苦写的算法、客户端校验逻辑、资源加密规则全被人一把梭翻个底朝天。再加上Mono的GC和JIT在某些平台确实有性能瓶颈IL2CPP就这么变成了大厂和加密需求强的游戏的主流选择。1.2 IL2CPP的编译链路C#到C再到机器码IL2CPP的字面意思就是IL to C。Unity在打包时先把C#源码编译成标准IL然后IL2CPP把IL转成C源码最后再由各平台的C编译器把这一大坨C编成原生机器码。这就导致一个结果最终产物里根本没有托管DLL你拿到的是一个纯native二进制——Windows上是GameAssembly.dllAndroid上是libil2cpp.so。里面是真实的机器指令想看逻辑可以但直接想还原出类结构、方法名难如登天。1.3 元数据的意义没有姓名的代码等于一堆乱码仅仅有native代码还不够游戏运行的时候总要知道有哪些类、类的字段怎么排、每个方法什么签名。这部分信息被单独抽出来放在了global-metadata.dat里。它保存了类型定义、方法签名、字段偏移、字符串字面量等元数据相当于整份代码的目录和索引。于是出现了这个现象Unity IL2CPP游戏的关键信息被拆分成了两份——文件内容能否直接看出逻辑GameAssembly.dll / libil2cpp.soIL2CPP生成的C再编译出的native指令看不出类和方法名只有一堆地址global-metadata.dat类型、方法、字段、字符串等元信息结构齐全但没有代码实现Assembly-CSharp.dll如有残留的托管程序集有些游戏没清干净但通常不再包含核心逻辑这两者必须配合使用二进制提供代码实现metadata提供代码的身份信息。Il2CppDumper做的就是把这个配合关系重新建立起来让你能对着地址谈方法名而不是面对一堵二进制墙。2. 它的工作原理解析metadata到底是字典还是正文2.1 一个不太恰当但很好懂的类比你可以把GameAssembly.dll想象成一本只有正文、没有目录、而且所有词句都涂掉了姓氏的书global-metadata.dat则是这本书的目录和索引手册。运行的时候游戏靠索引去正文里找到对应的实现Il2CppDumper拿到这两样东西之后做的事情就是解析索引手册把每一个词条和正文里的具体位置对应起来然后生成一份新的、部件齐全的档案——dump.cs。所以有件事要提前搞清楚dump.cs不是反编译器吐出来的C#源码它是一份完整的结构声明文件包含命名空间、类、字段带偏移量、方法声明带地址或偏移但方法体仍然是native机器码不会自动变回C#逻辑。想继续分析逻辑得拿着这份dump.cs去IDA或者Ghidra里对着找。2.2 Il2CppDumper具体做了什么IL2CPP运行时在启动时需要通过一些关键符号来初始化元数据比如Il2CppCodeRegistration、Il2CppMetadataRegistration这类结构体指针。这些符号在导出的二进制里往往有迹可循哪怕被strip过符号某些字符串引用或者初始化函数的特征仍然能暴露出来。Il2CppDumper的工作流程大致是读取global-metadata.dat按版本解析出类型定义、字段、方法、字符串池等数据块扫描目标二进制so或GameAssembly.dll定位IL2CPP运行时的关键注册结构从中拿到方法指针表、虚方法表等运行时信息把metadata里的方法索引和二进制里的方法地址一一对应生成包含地址与签名的映射表最后输出dump.cs完整结构声明、script.json结构化数据、DLL文件夹一堆用于静态分析的桩DLL。2.3 为什么生成的是桩DLL而不是直接还原逻辑很多人第一次看到输出目录里的DLL以为直接拖进dnSpy就能看代码了结果打开发现只有类声明、空方法体大呼就这。对就这。这些DLL本质上是补全了签名信息的空壳程序集作用不是反编译而是让dnSpy、ILSpy这类工具能正常浏览类和成员的声明结构方便你快速定位目标字段和方法真正实现的分析还是要回到native二进制上。这一步有一点特别值得说明由于Il2CppDumper生成方法签名时需要从二进制中读取虚表和方法指针信息能不能成功生成完整的DLL很大程度上取决于游戏是否对IL2CPP的注册结构做了手脚。这也是后面踩坑章节的核心。3. 完整实操流程从拿到目标文件夹到还原出可读结构3.1 环境准备我使用的版本是Il2CppDumper-win-v6.7.46Windows平台直接解压就能用不需要安装额外运行时。这款工具同时提供GUI和命令行模式日常分析用GUI足够如果要批量处理多个目标建议用命令行。解压后目录大概长这样Il2CppDumper-win-v6.7.46/ ├── Il2CppDumper.exe ├── Il2CppDumper.pdb ├── config.json └── ...config.json里可以配置一些解析选项比如是否输出DLL默认情况下只要解析成功dump.cs、script.json和DLL文件夹都会生成。3.2 获取并识别目标文件先去游戏安装目录或APK里把关键文件捞出来。Windows游戏找GameAssembly.dll和global-metadata.dat全球定位一般就在游戏根目录或Data目录下Android游戏通常从APK的lib/ /libil2cpp.so里拿二进制而global-metadata.dat在assets/bin/Data/Managed/Metadata或者assets/Data/Managed/Metadata下具体路径依Unity版本和打包配置略有差别。拿到的文件名不一定就叫global-metadata.dat有些魔改版会改成别的后缀甚至无后缀判断依据是文件头的magic。global-metadata.dat的前四个字节通常是AF 1B B1 FA不同Unity大版本可能略有改动。这个特征值得记一下很多时候拿到的文件没名字用Hex编辑器看一眼就清楚了。3.3 执行解析命令行模式直接一条指令Il2CppDumper.exe GameAssembly.dll global-metadata.dat output_dir参数顺序是二进制文件在前、metadata在后。如果直接双击exe进入GUI模式则按提示依次选择二进制文件、metadata文件、输出目录界面会显示解析日志。解析过程中日志会打印读取到的metadata版本号、类型数量、方法数量等关键信息。看到类似Gathered info和Done!的提示基本就成功了。如果报错可以参考后面踩坑部分的处理思路。3.4 检查输出结果解析成功后输出目录里会有三类核心产物dump.cs所有类、结构体、枚举、字段偏移、方法声明的全文这是后续查找目标的主要依据script.json结构化数据方便用脚本程序化地提取信息适合做批处理分析DLL文件夹桩DLL导入dnSpy等.NET工具中浏览结构用。拿实际项目来说我要找一个跟玩家属性相关的类直接在dump.cs里搜关键词就能定位到类名和字段偏移。字段偏移这个信息非常值钱做内存修改、注入工具或者外挂辅助开发时字段偏移虚表偏移就是整个技术方案的地基。Il2CppDumper把这些都给你整理好了省去了一大段手动dump内存的时间。4. 实际踩坑版本匹配、报错与防Dump机制4.1 metadata版本不匹配是最高频的报错Il2CppDumper对global-metadata.dat的版本有明确的兼容范围。Unity每次大版本升级metadata格式都可能调整如果手里游戏的metadata格式比工具支持的版本新解析阶段就会直接报版本不支持的错误。遇到这种情况优先检查工具是否有更新——IL2CPP新版本出来后Il2CppDumper社区跟进得很快升级工具版本是首选方案。如果游戏用的Unity版本很新、对应Dumper版本还没发布也可以试试Il2CppInspector作为备选工具它走的是另一套解析思路在某些新格式上能跟上。还有一个不得已的土办法把metadata文件头里的版本号改成低版本骗过程序但不保证后面数据区能正常解析只在个别小版本变动的时候碰巧能成。4.2 二进制被strip符号之后还能不能解析很多正式商用的IL2CPP游戏在编译native层时会开启strip符号选项把导出表里那些Il2Cpp开头的符号全部抹掉目的是增加逆向难度。Il2CppDumper面对这种目标时不再依赖导出符号而是尝试通过特征码在二进制里搜索关键数据结构比如虚表和元数据注册表。大部分情况下仍然能解析成功只是速度会慢一些而且偶尔会需要你从弹出的候选基地址里人工确认。如果你的目标在这一步卡住了在GUI界面里通常会有提示或者需要你选择多个候选地址。这时候建议拉出IDA看看候选地址附近是否存在指向字符串池的引用行为特征像不像IL2CPP初始化代码再决定选哪一个。4.3 metadata被加密或魔改怎么办有一部分游戏上了更强的保护对global-metadata.dat整体做了加密有些干脆在运行时动态解密到内存里落盘的metadata文件是密文直接用Il2CppDumper读出来的全是乱码。这种情况工具本身无解得先走一步脱壳或解密流程静态上找解密的XOR逻辑、AES Key动态上直接在运行中的进程内存里dump解密后的metadata。就我的经验来说在Windows平台用调试器在UnityPlayer.dll加载完成后对内存做扫描、拿到解密后的元数据是最快的路子。拿到干净的metadata之后再丢回Il2CppDumper配合原始的GameAssembly.dll后续流程就畅通了。4.4 路径和命令行小坑Win版本在命令行模式下路径里有中文或空格时偶尔会解析异常建议解析前先把目标文件放到一个纯英文路径下。GUI模式下这个问题基本不存在但命令行批处理时确实容易踩属于小概率但很烦的坑。另外如果命令行执行后窗口一闪而过多半是参数顺序错了或文件路径写错。可以先不加任何参数直接运行exeGUI模式下确认能正常打开再回命令行操作。5. dump.cs的正确打开方式从结构声明到动态分析5.1 读dump.cs时应该看什么dump.cs里的信息密度非常高但大多数时候你不用从头读。以查找玩家角色位置相关逻辑为例我一般这么用先用关键词定位类比如Player、Role、Character看字段声明里的偏移量注释找到位置字段Vector3类型通常是Position、LocalPosition之类对应的偏移顺着方法列表找到移动、同步、状态切换相关的方法名记住方法名和偏移回native二进制里定位。这里特别提一下文件中每个方法后面的注释里那个地址是方法在native二进制中的相对偏移RVA。在IDA里加载GameAssembly.dll时用这个RVA加上ImageBase就能直接跳到对应方法所在的代码段。5.2 配合IDA/Ghidra做代码级分析恢复了方法名和地址之后整个native二进制的可读性会发生质变。在IDA里把每个方法的地址标记好、重命名成dump.cs里的名字然后对关键方法逐个看反汇编伪代码。IL2CPP生成的C代码可读性比纯手写C好不少因为Unity在生成C源码时保留了非常多原始C#的结构痕迹——类名、方法名会出现在字符串池里常量、字段访问方式也能隐约对应回高级语言的表达。我在分析某个游戏的技能冷却逻辑时就是先在dump.cs里找到了技能数据类发现冷却时间字段的偏移再在IDA里找到修改该字段的函数最后通过交叉引用一路找到上层调用——整个过程比对着纯汇编大海捞针直观得多。5.3 script.json和脚本化批处理如果目标是批量分析多个游戏或者要从海量类里抽出特定规则的结构信息比如找出所有带Encrypt字样的方法手翻dump.cs太累了。script.json把这些数据都结构化存储了写几行脚本就能做筛选。我对这种方式的使用频率很高尤其要整理某类游戏通用结构的时候一条Python正则或JSON查询下去所有相关类一次性捞出来。举一个最简单场景你想知道游戏里哪些类跟网络协议相关直接把script.json里所有含Network、Packet、Proto关键字的类型列出来然后按需回到dump.cs查看字段偏移。整个过程不到一分钟完成。5.4 方向与合规提醒有一点大家心里要有数。Il2CppDumper本身是个中性的分析工具在漏洞研究、安全测试、技术学习、正版游戏Mod开发这些方向上非常有用。但拿它去拆商业游戏的联网验证、提取资源后二次分发或者做外挂既违背了工具的正当用途也容易给自己惹上实际的法律麻烦。我的原则很简单自己的学习目标、公开的样例程序、明确获得授权的项目怎么折腾都行别把手伸向没有授权的商业作品。回到工具本身。Il2CppDumper-win-v6.7.46这个版本在我近期处理过的Unity目标里解析成功率和生成的dump.cs完整度都很能打。如果你也卡在IL2CPP魔咒里照着上面的流程走一遍基本能把只见二进制不闻DLL的问题解决掉。真遇到版本不兼容或者metadata加密的硬茬不要只盯着一个工具——升级版本、上Il2CppInspector、动态dump内存三板斧下来多数防线都能绕过去。本文还有配套的精品资源点击获取