首页
/ 攻克Unity逆向难题:Il2CppDumper虚函数表解析与结构体生成全指南

攻克Unity逆向难题:Il2CppDumper虚函数表解析与结构体生成全指南

2026-02-05 05:03:45作者:滑思眉Philip

你是否还在为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++结构体定义,极大简化了逆向分析工作。

生成流程

结构体生成器的工作流程主要包含以下步骤:

  1. 收集类型信息:遍历所有程序集和类型定义,建立类型名称与结构体名称的映射
  2. 处理泛型类:为泛型类实例生成特定的结构体定义
  3. 生成方法签名:解析方法参数和返回值类型,生成C风格的函数签名
  4. 输出结构体定义:将收集到的所有信息整理为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

项目结构中,与结构体生成相关的核心文件和目录包括:

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能够正确处理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生成结构体后,我们可以:

  1. il2cpp.h中找到PlayerController_o结构体定义
  2. 识别其虚函数表中的函数指针
  3. 在逆向工具中定位这些函数的实现
  4. 分析函数间的调用关系

通过这种方式,原本需要数小时的手动分析工作可以在几分钟内完成。

总结与展望

Il2CppDumper的结构体生成器是Unity il2cpp逆向分析的强大工具,它通过自动化解析和生成C++结构体,极大降低了逆向难度。核心优势包括:

  1. 精确还原il2cpp类结构和虚函数表
  2. 支持泛型类和方法的复杂场景
  3. 兼容多个Unity版本和平台
  4. 提供多种逆向工具的集成支持

项目仍在持续发展中,未来可能会加入更多高级功能,如自动生成函数调用图、更完善的泛型处理等。建议定期查看项目的README.md以获取最新信息。

希望本文能帮助你更好地利用Il2CppDumper进行Unity逆向分析。如果你有任何问题或发现bug,可以通过项目的issue系统反馈。

最后,不要忘记点赞、收藏本文,并关注项目更新,以便及时获取最新的使用技巧和功能介绍!

登录后查看全文
热门项目推荐
相关项目推荐