攻克Unity逆向难题:Il2CppDumper虚函数表解析与结构体生成全指南
你是否还在为Unity游戏的il2cpp二进制文件逆向分析而烦恼?函数调用关系不清晰、类结构难以还原、虚函数表解析复杂?本文将带你使用Il2CppDumper的结构体生成器,轻松解决这些问题,让il2cpp逆向分析效率提升10倍。
读完本文你将掌握:
- 理解Unity il2cpp虚函数表(Virtual Function Table,VFT)的结构与作用
- 使用Il2CppDumper生成精确的C++结构体定义
- 解析泛型类与方法的结构体表示
- 将生成的结构体应用于实际逆向分析场景
il2cpp虚函数表解析基础
il2cpp是Unity使用的一种将C#代码编译为C++代码再进行原生编译的技术,它会将C#类转换为C++结构体,其中虚函数表是实现多态的关键机制。在il2cpp中,每个类都包含一个指向虚函数表的指针,该表存储了类的所有虚函数地址。
虚函数表结构
Il2CppDumper通过分析二进制文件中的元数据和代码注册信息,还原出类的虚函数表结构。核心代码位于Il2CppDumper/Il2Cpp/Il2CppClass.cs,其中定义了Il2CppCodeRegistration结构体,包含了方法指针、反向P/Invoke包装器等关键信息。
public class Il2CppCodeRegistration
{
[Version(Max = 24.1)]
public ulong methodPointersCount;
[Version(Max = 24.1)]
public ulong methodPointers;
[Version(Min = 22)]
public ulong reversePInvokeWrapperCount;
[Version(Min = 22)]
public ulong reversePInvokeWrappers;
// 更多字段...
}
这个结构体记录了il2cpp运行时注册的所有方法指针,是解析虚函数表的基础数据来源。
类型系统基础
il2cpp使用Il2CppTypeEnum枚举定义了所有可能的数据类型,包括基本类型、数组、泛型实例等。这些类型信息对于正确解析虚函数参数和返回值至关重要。
public enum Il2CppTypeEnum
{
IL2CPP_TYPE_VOID = 0x01,
IL2CPP_TYPE_BOOLEAN = 0x02,
IL2CPP_TYPE_CHAR = 0x03,
// 基本类型...
IL2CPP_TYPE_CLASS = 0x12,
IL2CPP_TYPE_ARRAY = 0x14,
IL2CPP_TYPE_GENERICINST = 0x15,
// 更多类型...
}
结构体生成器工作原理
Il2CppDumper的结构体生成器是解析虚函数表的核心工具,位于Il2CppDumper/Outputs/StructGenerator.cs。它通过分析元数据和代码注册信息,自动生成C++结构体定义,极大简化了逆向分析工作。
生成流程
结构体生成器的工作流程主要包含以下步骤:
- 收集类型信息:遍历所有程序集和类型定义,建立类型名称与结构体名称的映射
- 处理泛型类:为泛型类实例生成特定的结构体定义
- 生成方法签名:解析方法参数和返回值类型,生成C风格的函数签名
- 输出结构体定义:将收集到的所有信息整理为C++头文件
核心入口函数是WriteScript方法,它协调了整个生成过程:
public void WriteScript(string outputDir)
{
var json = new ScriptJson();
// 生成唯一名称
for (var imageIndex = 0; imageIndex < metadata.imageDefs.Length; imageIndex++)
{
// 处理每个程序集的类型定义...
}
// 处理泛型类...
// 处理函数...
// 生成输出文件...
}
结构体生成示例
以下是生成器处理类方法的核心代码,它解析方法参数、生成函数签名,并处理泛型方法实例:
var methodEnd = typeDef.methodStart + typeDef.method_count;
for (var i = typeDef.methodStart; i < methodEnd; ++i)
{
var methodDef = metadata.methodDefs[i];
var methodName = metadata.GetStringFromIndex(methodDef.nameIndex);
var methodPointer = il2Cpp.GetMethodPointer(imageName, methodDef);
if (methodPointer > 0)
{
// 生成方法签名...
var signature = $"{returnType} {FixName(methodFullName)} (";
// 处理参数...
// 添加到输出...
}
// 处理泛型实例函数...
}
使用结构体生成器的完整步骤
1. 准备工作
确保你已经克隆了Il2CppDumper仓库:
git clone https://gitcode.com/gh_mirrors/il/Il2CppDumper.git
项目结构中,与结构体生成相关的核心文件和目录包括:
- Il2CppDumper/Outputs/StructGenerator.cs:结构体生成器主类
- Il2CppDumper/Il2Cpp/Il2CppClass.cs:il2cpp类型系统定义
- Il2CppDumper/Outputs/StructInfo.cs:结构体信息模型
2. 生成结构体定义
运行Il2CppDumper,指定Unity游戏的GameAssembly.dll(或其他平台对应的二进制文件)和global-metadata.dat文件:
Il2CppDumper.exe GameAssembly.dll global-metadata.dat -o output
生成器会在输出目录中创建以下关键文件:
il2cpp.h:包含所有类和结构体定义的C++头文件script.json:方法和元数据信息的JSON文件stringliteral.json:字符串字面量信息
3. 解析生成的虚函数表
在生成的il2cpp.h文件中,每个类都有对应的结构体定义,例如:
struct MonoBehaviour_o {
struct Component_o _base;
int32_t m_Enabled;
// ...其他字段
};
虚函数表通过函数指针数组表示,结构体生成器会自动为每个类生成对应的函数指针声明。
4. 应用于逆向分析
生成的结构体可以直接用于IDA Pro、Ghidra等逆向工具中,帮助你快速识别类方法、理解函数调用关系。例如,在Ghidra中导入il2cpp.h文件,可以获得更准确的函数签名和类型信息。
项目还提供了针对不同逆向工具的插件:
- Il2CppDumper/Il2CppBinaryNinja/:Binary Ninja插件
- Il2CppDumper/ida.py:IDA Pro脚本
高级技巧:处理复杂场景
泛型类与方法的解析
Il2CppDumper能够正确处理C#泛型类型和方法,生成对应的特化结构体。核心代码位于WriteScript方法中处理泛型实例的部分:
foreach (var il2CppType in il2Cpp.types.Where(x => x.type == Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST))
{
var genericClass = il2Cpp.MapVATR<Il2CppGenericClass>(il2CppType.data.generic_class);
var typeDef = executor.GetGenericClassTypeDefinition(genericClass);
// 生成泛型实例结构体名称...
}
版本兼容性处理
il2cpp在不同Unity版本中结构有所变化,结构体生成器通过版本属性灵活处理这些差异:
public class Il2CppCodeRegistration
{
[Version(Max = 24.1)]
public ulong methodPointersCount;
[Version(Max = 24.1)]
public ulong methodPointers;
[Version(Min = 22)]
public ulong reversePInvokeWrapperCount;
// ...其他版本相关字段
}
这确保了生成器能够支持从旧版本到最新版本的Unity游戏。
实际应用案例
假设我们正在分析一个Unity游戏,需要了解MonoBehaviour的派生类PlayerController的虚函数调用流程。使用Il2CppDumper生成结构体后,我们可以:
- 在
il2cpp.h中找到PlayerController_o结构体定义 - 识别其虚函数表中的函数指针
- 在逆向工具中定位这些函数的实现
- 分析函数间的调用关系
通过这种方式,原本需要数小时的手动分析工作可以在几分钟内完成。
总结与展望
Il2CppDumper的结构体生成器是Unity il2cpp逆向分析的强大工具,它通过自动化解析和生成C++结构体,极大降低了逆向难度。核心优势包括:
- 精确还原il2cpp类结构和虚函数表
- 支持泛型类和方法的复杂场景
- 兼容多个Unity版本和平台
- 提供多种逆向工具的集成支持
项目仍在持续发展中,未来可能会加入更多高级功能,如自动生成函数调用图、更完善的泛型处理等。建议定期查看项目的README.md以获取最新信息。
希望本文能帮助你更好地利用Il2CppDumper进行Unity逆向分析。如果你有任何问题或发现bug,可以通过项目的issue系统反馈。
最后,不要忘记点赞、收藏本文,并关注项目更新,以便及时获取最新的使用技巧和功能介绍!
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00