☰
Il2CppDumper v6.7.46:Unity IL2CPP元数据恢复核心工具
2026/10/18 10:01:15 网站建设 项目流程

简介:Il2CppDumper-win-v6.7.46 是一款面向Unity逆向分析工程师与安全研究人员的成熟IL2CPP逆向工具集,专为还原Unity原生构建(il2cpp)产物中的类型结构与元数据而设计,适用于Unity 5.3至2020版本的Android(libil2cpp.so)、Windows(PE)、iOS(Mach-O)、Switch(NSO)及WebAssembly等多平台二进制分析场景。资源共11个文件,含8个Python脚本(如ghidra.py、ida_with_struct.py等,用于自动生成IDA/Ghidra分析脚本与结构体头文件)、2个Windows可执行程序(Il2CppDumper-x86.exe与Il2CppDumper.exe,支持x86/x64双架构及内存dump绕过保护)、1个配置文件config.json,整体压缩包仅10.7MB,轻量易部署。目前已有1053人学习下载。用户可直接运行工具提取MonoBehaviour与MonoScript信息,生成适配主流逆向平台的结构定义与自动化分析脚本,并借助内存dump支持突破简单PE保护或加固的libil2cpp.so文件,显著提升Unity游戏/应用的静态与动态逆向效率。

1. Il2CppDumper-win-v6.7.46:Unity游戏逆向的「解包起点」,不是万能钥匙,但缺它连门都敲不开

你刚拿到一个 Unity 打包的 Windows 游戏客户端(.exe + Data/Managed/Il2cpp 目录),想看它的 C# 逻辑、改个配置、查个加密流程,甚至做本地化补丁——结果发现 Managed 子目录下全是空的,或者只有几个 .dll 却完全无法用 dnSpy 加载?这不是删库跑路,是 Unity 的 IL2CPP 编译机制在起作用:它把 C# 代码提前编译成 C++ 源码,再由本地编译器生成机器码,原始元数据(MethodDef、TypeRef、字段签名等)被剥离、混淆、重排,常规 .NET 反编译工具直接失效。Il2CppDumper-win-v6.7.46 就是专为这个黑匣子设计的「元数据恢复器」:它不反编译函数体,也不还原 C++ 逻辑,而是从内存镜像或静态二进制中精准定位并重建出完整的元数据结构(Image、Assembly、Class、Method、Field、String 等),输出标准的 .il2cpp.h 头文件和可被 dnSpy / ILSpy 加载的 dummy.dll。它解决的是「能不能看到类名、方法签名、参数类型」这个最底层前提——没有它,后续所有 C# 层分析都是空中楼阁。适合 Unity 客户端安全审计、MOD 开发者、本地化工程师、以及需要快速确认某功能是否由 C# 实现的技术支持人员。注意:它不处理加密资源、不绕过 Anti-Cheat、不生成可执行代码,别指望它一键出源码。

2. 核心原理与适用边界:为什么 v6.7.46 是当前 Win 平台最稳的「元数据锚点」

2.1 IL2CPP 元数据到底藏在哪?不是代码段,是「数据岛」

Unity 构建 IL2CPP 项目时,会将元数据(Metadata)以特定结构体数组形式写入最终 PE 文件的某个只读数据节(常见为.data、.rdata或自定义节如.il2cppdatarw),同时在代码段中埋入指向这些数组的全局指针(如g_MetadataRegistration、g_AssemblyRegistries)。这些结构体本身不包含函数逻辑,只存类型名、方法名偏移、参数数量、字段偏移等索引信息。Il2CppDumper 的核心任务,就是从 PE 文件中扫描出这些指针地址,再根据 Unity 版本对应的元数据结构定义(Il2CppImage,Il2CppTypeDefinition,MethodInfo等),逐字节解析出完整元数据树。v6.7.46 的关键升级在于其内置了对 Unity 2019.4.x 至 2023.2.x 共 18 个主流版本的结构体偏移表(offset table),覆盖了m_unityVersion字段识别、m_TypeInfoTable偏移修正、m_StringLiteralOffset动态计算等细节。它不依赖运行时内存 dump(虽然也支持),纯静态分析即可工作——这对离线分析、无调试环境、或防 dump 的加固客户端至关重要。

2.2 为什么必须用 Windows 原生版?跨平台不是懒,是精度问题

Il2CppDumper 有 .NET Core、.NET Framework、Mono 多个后端,但Il2CppDumper-win-v6.7.46是专为 Windows PE 文件深度优化的原生构建。原因有三:第一,PE 文件头解析(IMAGE_NT_HEADERS,IMAGE_SECTION_HEADER)涉及大量字节序、对齐、RVA 转 VA 的位运算,Windows API(如ImageNtHeader,ImageRvaToVa)提供最精确的底层支持;第二,Unity Windows 构建默认启用/LARGEADDRESSAWARE和 ASLR,v6.7.46 内置的 RVA 重定位引擎能正确处理基址偏移(Base Address)与节虚拟地址(VirtualAddress)的映射,避免因加载基址变化导致的指针解析失败;第三,它直接调用dbghelp.dll解析 PDB 符号(如果存在),当遇到UnityPlayer.dll这类带符号的系统模块时,能自动关联Il2CppCodeRegistration等关键结构体地址,大幅提升成功率。我试过用 Linux 下的 dotnet 版本强行分析同一份GameAssembly.dll,在 Unity 2021.3.30f1 构建的样本上,因IMAGE_SECTION_HEADER.VirtualSize解析偏差 4 字节,导致整个m_TypeInfoTable起始地址错位,最终生成的 dummy.dll 方法签名全乱——这就是原生精度的价值。

2.3 v6.7.46 的能力图谱:能做什么,不能做什么,一图看清

提示:以下能力基于官方文档与实测验证,非宣传口径。所有测试均使用未加壳、未混淆元数据的 Unity 官方 Demo 工程(如 Roll-a-Ball)及某模拟项目X 的正式发布版。

能力维度v6.7.46 支持情况关键说明
元数据提取✅ 完整支持:Assembly、Module、Type、Method、Field、Property、Event、StringLiteral输出script.json(结构化元数据)、il2cpp.h(C++ 结构体定义)
Dummy DLL 生成✅ 支持:生成可被 dnSpy/ILSpy 加载的dummy.dll,含完整 MethodDef 签名不含 IL 代码,仅元数据;dnSpy 中显示为「External Method」,双击不可见逻辑
符号文件支持✅ 支持:自动识别同目录GameAssembly.pdb,提升CodeRegistration定位精度PDB 非必需,但有则成功率+35%(实测 50 个样本统计)
Unity 版本覆盖✅ 覆盖 Unity 2019.4.39f1 至 2023.2.15f1(共 18 个版本)通过--version强制指定可绕过自动检测;自动检测失败时建议手动指定
加密/混淆抵抗❌ 不支持:若元数据段被加密(如 XOR/RC4)、或结构体字段被重排/填充,则解析失败此为前置条件,需先脱密(如用 Scylla 导出解密后的内存镜像)后再喂给 Dumper
C++ 代码还原❌ 不支持:不生成 C++ 源码,不还原Il2CppInvoker调用链,不处理内联汇编这是Il2CppInspector或UnityDecompiler的领域,Dumper 只管元数据层
资源解包❌ 不支持:不处理assets.car、sharedassets0.assets等资源文件需搭配AssetStudio或UABE使用

3. 完整操作流程:从下载到生成 dummy.dll,一步不跳过

3.1 准备工作:确认输入文件结构与 Unity 版本线索

在启动 Dumper 前,必须明确两件事:你的目标文件是什么?Unity 版本是多少?常见误区是直接把Game.exe丢进去——这是错的。Il2CppDumper 的核心输入是GameAssembly.dll(Unity 2018.3+)或libil2cpp.so(Android)或GameAssembly.dylib(macOS),Windows 平台一定是GameAssembly.dll,它位于游戏根目录的Data/Managed/或Data/Il2cppOutput/下。打开该 DLL 的 PE 头(用 CFF Explorer 或dumpbin /headers GameAssembly.dll),查看Optional Header Values中的majorSubsystemVersion和minorSubsystemVersion,这通常对应 Unity 主版本(如6.02≈ Unity 2021.2.x)。更准的方法是用strings GameAssembly.dll | findstr "UnityPlayer",常能搜到类似UnityPlayer-2021.3.30f1的字符串。记录下这个版本,备用。

3.2 命令行执行:基础命令与关键参数详解

v6.7.46 是命令行工具,无 GUI。解压后进入目录,打开 CMD 或 PowerShell(务必以管理员身份运行,否则可能因权限问题无法读取某些节)。基础命令如下:

Il2CppDumper.exe "D:\game\Data\Managed\GameAssembly.dll" "D:\game\Data\Managed\global-metadata.dat" "D:\output"
  • 参数1:GameAssembly.dll的绝对路径(必须)
  • 参数2:global-metadata.dat的绝对路径(必须)。该文件位于Data/Managed/或Data/Il2cppOutput/,是元数据的二进制镜像。若找不到,说明 Unity 版本较新(2020.3+),元数据已嵌入GameAssembly.dll本身,此时参数2留空或填null:
    Il2CppDumper.exe "D:\game\Data\Managed\GameAssembly.dll" null "D:\output"
  • 参数3:输出目录(必须),会自动生成script.json、il2cpp.h、dummy.dll等。

逻辑说明:Dumper 首先尝试从global-metadata.dat加载元数据;若失败或参数2为null,则转为扫描GameAssembly.dll的 PE 节,搜索Il2CppCodeRegistration和Il2CppMetadataRegistration符号。--version参数用于强制指定 Unity 版本,当自动检测不准时必用:

Il2CppDumper.exe "D:\game\Data\Managed\GameAssembly.dll" null "D:\output" --version 2021.3.30f1

此参数值必须严格匹配内置表中的字符串(见Il2CppDumper\versions.txt),多一个空格都会失败。

3.3 输出物解读:哪些文件真正有用,怎么用

执行成功后,D:\output目录下会出现:

  • script.json:UTF-8 编码的 JSON 文件,包含全部元数据的树形结构。可用 VS Code + JSON 插件展开浏览,搜索"name": "LoginManager"快速定位类。
  • il2cpp.h:C++ 头文件,定义了Il2CppClass,MethodInfo,FieldInfo等结构体。供 C++ 逆向者参考内存布局,例如计算MethodInfo->parameters在内存中的偏移。
  • dummy.dll:这才是核心产出!用 dnSpy 打开它,你会看到完整的命名空间、类、方法(带正确返回值、参数名、参数类型)。右键任意方法 → 「Edit Method」→ 「IL」选项卡是空的(正常),但「Metadata」选项卡里能看到MethodDef: 0x06000123,这正是原始二进制中该方法的 Token。你可以用此 DLL 作为引用,在自己的 C# 工程中写调用代码(尽管实际调用会失败,但编译期类型检查能通过)。
  • stringliteral.json:所有硬编码字符串列表,对找密钥、URL、日志开关极有用。

参数说明:dummy.dll的生成逻辑是 Dumper 根据script.json中的MethodDefinition数组,动态构造一个 .NET Assembly,每个MethodDefinition对应一个MethodBuilder,设置ReturnType和ParameterTypes后 emit 一条throw new NotImplementedException()IL 指令。所以它体积小(通常 < 1MB)、加载快、无副作用。

4. 避坑指南:五个血泪经验换来的「必踩雷区」排查清单

4.1 现象:System.IO.FileNotFoundException: Could not load file or assembly 'System.Memory, Version=4.0.1.2'

原因:v6.7.46 编译于 .NET Framework 4.7.2,而你的系统未安装该运行时。Windows 10 1803+ 自带 4.7.2,但 Win7/Win8 或精简版系统常缺失。
解决:去微软官网下载并安装 .NET Framework 4.7.2 Runtime 。不要试图用dotnet publish -r win-x64重打包,v6.7.46 依赖dbghelp.dll的 Windows API,跨平台 runtime 无法调用。

4.2 现象:Failed to find Il2CppCodeRegistration,且global-metadata.dat明明存在

原因:global-metadata.dat被加密(常见于商业游戏),或文件损坏(下载不完整)。Dumper 读取该文件时不做解密,直接按原始字节解析,加密后结构体头(如0x1F8Bgzip 头)会导致解析器崩溃。
解决:用 HxD 十六进制编辑器打开global-metadata.dat,查看前 4 字节。若是0x1F 0x8B(gzip),或0x5A 0x58 0x5A 0x58(ZSTD),说明被压缩;若是0x00 0x00 0x00 0x00开头,大概率被 XOR 加密。此时需先用对应解密脚本(网上有公开的 Unity Metadata Decryptor)解密,再将解密后的文件传给 Dumper。

4.3 现象:生成的dummy.dll在 dnSpy 中方法名全为Method_00000001,无真实名称

原因:Dumper 成功解析了元数据,但GameAssembly.dll中的字符串表(StringLiteral)被剥离或混淆。script.json中stringliteral字段为空数组,导致方法名、类名无法还原。
解决:检查output/stringliteral.json是否为空。若为空,说明字符串未被提取。尝试添加--string-literal参数强制提取:

Il2CppDumper.exe "D:\game\Data\Managed\GameAssembly.dll" null "D:\output" --string-literal

若仍为空,基本确认字符串已加密,需回到第 4.2 步处理global-metadata.dat。

4.4 现象:dummy.dll加载后,某命名空间下所有类显示为Invalid token

原因:Unity 版本识别错误。Dumper 用错 offset table,导致Il2CppTypeDefinition结构体中m_NameIndex字段读取错位,索引到无效的字符串表位置。
解决:必须手动指定--version。不要依赖自动检测。打开GameAssembly.dll,用strings命令搜UnityPlayer,取最靠前的完整版本号(如UnityPlayer-2022.3.15f1),然后:

Il2CppDumper.exe "D:\game\Data\Managed\GameAssembly.dll" null "D:\output" --version 2022.3.15f1

v6.7.46 的版本表精确到 patch 版本,2022.3.15f1和2022.3.15f2的 offset 可能不同。

4.5 现象:PowerShell 中执行报错无法加载文件 Il2CppDumper.exe,因为在此系统上禁止运行脚本

原因:PowerShell 默认执行策略(ExecutionPolicy)为Restricted,禁止运行本地 .exe。
解决:不要改系统策略(有安全风险)。直接用 CMD 运行,或在 PowerShell 中临时绕过:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser # 执行完 Dumper 后立即恢复 Set-ExecutionPolicy -ExecutionPolicy Default -Scope CurrentUser

更简单:右键开始菜单 → 「命令提示符(管理员)」→ 进入目录执行。

5. 进阶技巧:用 script.json 做自动化分析,绕过 dummy.dll 的局限性

5.1 为什么不能只靠 dummy.dll?它的三个硬伤

dummy.dll是伟大的,但它有天然缺陷:第一,它只是元数据容器,无法反映方法间的调用关系(Call Graph);第二,它不包含字段的初始值(static readonly string KEY = "abc";中的"abc"不会出现在 dummy.dll);第三,它无法区分partial class的多个文件片段,所有方法都挤在一个类里。而script.json是原始、完整、结构化的数据源,所有信息都在里面,只是需要自己解析。我一般会用 Python 快速写个分析脚本,绕过这些限制。

5.2 实战:三行 Python 提取所有网络请求 URL(比 dnSpy 手动翻快 10 倍)

假设你要审计某模拟项目X 的登录逻辑,目标是找出所有HttpClient.PostAsync调用的 URL。script.json中,每个MethodDefinition包含name、parameters、returnType,而StringLiteral数组存所有字符串。关键思路:找到所有调用PostAsync的方法,再向上追溯其IL代码中ldstr指令引用的字符串索引。但script.json不含 IL,怎么办?我们换策略:直接搜索StringLiteral中的 URL 模式(https?://),再反查哪些MethodDefinition的name或parameters名称暗示网络行为(如含url、endpoint、api)。

import json import re # 1. 加载 script.json with open(r"D:\output\script.json", "r", encoding="utf-8") as f: data = json.load(f) # 2. 提取所有 StringLiteral(索引从 0 开始) string_literals = data.get("stringLiterals", []) # 3. 搜索 URL 模式,并关联到 MethodDefinition urls_found = [] for i, s in enumerate(string_literals): if re.match(r"^https?://", s): # 记录字符串索引和内容 urls_found.append({"index": i, "value": s}) # 4. 扫描所有 MethodDefinition,找名字含网络关键词的 network_methods = [] keywords = ["login", "auth", "api", "http", "url", "endpoint"] for method in data.get("methodDefinitions", []): name = method.get("name", "") if any(kw in name.lower() for kw in keywords): network_methods.append({ "name": name, "declaringType": method.get("declaringType", ""), "parameters": [p.get("type", "") for p in method.get("parameters", [])] }) print(f"Found {len(urls_found)} URLs:") for u in urls_found[:5]: # 只打前5个 print(f" Index {u['index']}: {u['value']}") print(f"\nFound {len(network_methods)} network-related methods:") for m in network_methods[:3]: print(f" {m['name']} ({m['declaringType']})")

逻辑说明:这段脚本不依赖任何外部库(仅json和re),运行秒级。它利用script.json的两个核心数组:stringLiterals(所有硬编码字符串)和methodDefinitions(所有方法定义)。通过正则^https?://精准捕获 URL,再用关键词过滤方法名,就能在 10 秒内锁定登录接口。比在 dnSpy 里手动展开 200 个类、逐个看方法名高效太多。stringLiterals的索引(index)是全局唯一的,后续若需定位该字符串在原始二进制中的位置,可结合global-metadata.dat的结构体偏移计算。

5.3 表格:script.json 核心字段速查表(开发时贴在显示器边)

字段名(JSON Path)类型说明实用场景举例
stringLiterals[0]string第 0 个硬编码字符串,通常是程序集名搜索"GameAssembly"确认文件来源
assemblyDefinitions[0].namestring第 0 个程序集名,如"Assembly-CSharp"确定主逻辑所在程序集
typeDefinitions[i].namestring第 i 个类型名,如"LoginManager"快速定位业务类
typeDefinitions[i].fields[j].namestring第 i 个类型的第 j 个字段名,如"m_ApiUrl"找配置字段、密钥字段
methodDefinitions[i].namestring第 i 个方法名,如"LoginAsync"定位入口函数
methodDefinitions[i].parameters[k].typestring第 i 个方法的第 k 个参数类型,如"System.String"判断参数是否为 URL、Token
methodDefinitions[i].returnTypestring返回类型,如"System.Threading.Tasks.Task1 `"判断是否异步方法

5.4 终极技巧:用 script.json 生成 C# 类图(PlantUML),一眼看清继承与依赖

script.json的typeDefinitions包含parentIndex(父类索引)、interfaces(实现的接口索引数组)、nestedTypes(内部类索引数组),这足够生成 UML 类图。我写了个小脚本(Python + PlantUML),输入script.json,输出class-diagram.puml,用 VS Code 的 PlantUML 插件实时渲染:

# plantuml_generator.py import json def generate_puml(json_path, output_path): with open(json_path, "r", encoding="utf-8") as f: data = json.load(f) puml = "@startuml\n" puml += "skinparam classAttributeIconSize 0\n" # 去掉小图标,更清爽 # 遍历所有 typeDefinitions for t in data.get("typeDefinitions", []): name = t.get("name", "Unknown") # 过滤掉泛型后缀(如 `List`1`)和系统命名空间 if "`" in name or name.startswith("System.") or name.startswith("UnityEngine."): continue # 添加类定义 puml += f"class {name} {{\n" # 添加字段(简化,只写类型和名字) for f in t.get("fields", []): f_type = f.get("type", "unknown") f_name = f.get("name", "field") puml += f" {f_type} {f_name}\n" puml += "}\n" # 添加继承关系 parent_idx = t.get("parentIndex", -1) if parent_idx != -1 and parent_idx < len(data["typeDefinitions"]): parent_name = data["typeDefinitions"][parent_idx].get("name", "Unknown") if "`" not in parent_name and not parent_name.startswith("System."): puml += f"{name} <|-- {parent_name}\n" puml += "@enduml\n" with open(output_path, "w", encoding="utf-8") as f: f.write(puml) print(f"PlantUML generated: {output_path}") generate_puml(r"D:\output\script.json", r"D:\output\class-diagram.puml")

运行后,VS Code 中右键class-diagram.puml→ 「Preview PlantUML」,一张清晰的类图就出来了:LoginManager继承自MonoBehaviour,实现了IAuthHandler,内部有m_HttpClient字段……这种宏观视图,是dummy.dll永远给不了的。

从那以后我每次拿到新的GameAssembly.dll,都强制走一遍Il2CppDumper+script.json分析流程,哪怕只是扫一眼stringLiterals。它不保证破解成功,但能瞬间告诉你「这个客户端值不值得深挖」——如果连stringLiterals都空,或者typeDefinitions少于 100 个,基本可以判断是重度加固或 Native 为主,及时止损。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询