攻克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系统反馈。
最后,不要忘记点赞、收藏本文,并关注项目更新,以便及时获取最新的使用技巧和功能介绍!
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0181- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
snackjson新一代高性能 Jsonpath 框架。同时兼容 `jayway.jsonpath` 和 IETF JSONPath (RFC 9535) 标准规范(支持开放式定制)。Java00