资讯动态

Il2CppDumper v6.7.46:Unity IL2CPP元数据恢复核心工具

发布时间:2026/10/18 10:01:33 来源:尧图企业网站定制
简介Il2CppDumper-win-v6.7.46 是一款面向Unity逆向分析工程师与安全研究人员的成熟IL2CPP逆向工具集专为还原Unity原生构建il2cpp产物中的类型结构与元数据而设计适用于Unity 5.3至2020版本的Androidlibil2cpp.so、WindowsPE、iOSMach-O、SwitchNSO及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.46Unity游戏逆向的「解包起点」不是万能钥匙但缺它连门都敲不开你刚拿到一个 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和 ASLRv6.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.hC 结构体定义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 导出解密后的内存镜像后再喂给 DumperC 代码还原❌ 不支持不生成 C 源码不还原Il2CppInvoker调用链不处理内联汇编这是Il2CppInspector或UnityDecompiler的领域Dumper 只管元数据层资源解包❌ 不支持不处理assets.car、sharedassets0.assets等资源文件需搭配AssetStudio或UABE使用3. 完整操作流程从下载到生成 dummy.dll一步不跳过3.1 准备工作确认输入文件结构与 Unity 版本线索在启动 Dumper 前必须明确两件事你的目标文件是什么Unity 版本是多少常见误区是直接把Game.exe丢进去——这是错的。Il2CppDumper 的核心输入是GameAssembly.dllUnity 2018.3或libil2cpp.soAndroid或GameAssembly.dylibmacOSWindows 平台一定是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参数1GameAssembly.dll的绝对路径必须参数2global-metadata.dat的绝对路径必须。该文件位于Data/Managed/或Data/Il2cppOutput/是元数据的二进制镜像。若找不到说明 Unity 版本较新2020.3元数据已嵌入GameAssembly.dll本身此时参数2留空或填nullIl2CppDumper.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.jsonUTF-8 编码的 JSON 文件包含全部元数据的树形结构。可用 VS Code JSON 插件展开浏览搜索name: LoginManager快速定位类。il2cpp.hC 头文件定义了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, Version4.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 0x8Bgzip或0x5A 0x58 0x5A 0x58ZSTD说明被压缩若是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.15f1v6.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(rD:\output\script.json, r, encodingutf-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(fFound {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、TokenmethodDefinitions[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, encodingutf-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) # 过滤掉泛型后缀如 List1和系统命名空间 if in name or name.startswith(System.) or name.startswith(UnityEngine.): continue # 添加类定义 puml fclass {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, encodingutf-8) as f: f.write(puml) print(fPlantUML generated: {output_path}) generate_puml(rD:\output\script.json, rD:\output\class-diagram.puml)运行后VS Code 中右键class-diagram.puml→ 「Preview PlantUML」一张清晰的类图就出来了LoginManager继承自MonoBehaviour实现了IAuthHandler内部有m_HttpClient字段……这种宏观视图是dummy.dll永远给不了的。从那以后我每次拿到新的GameAssembly.dll都强制走一遍Il2CppDumperscript.json分析流程哪怕只是扫一眼stringLiterals。它不保证破解成功但能瞬间告诉你「这个客户端值不值得深挖」——如果连stringLiterals都空或者typeDefinitions少于 100 个基本可以判断是重度加固或 Native 为主及时止损。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑