使用ImHex分析Unity资源二进制格式

使用ImHex分析Unity资源二进制格式
最新回答
舟遥客

2022-12-19 09:42:58

使用ImHex分析Unity资源二进制格式可通过其Pattern模式编程实现,该模式支持自定义数据结构解析二进制文件。以下是具体步骤和关键实现方法:

1. Pattern模式基础
  • 功能:通过编程定义字段类型和偏移量,将二进制数据解析为结构化信息。
  • 示例:定义一个4字节整数testInt,从偏移量0x00开始解析:s32 testInt @ 0x00;
2. Unity二进制文件结构

Unity的二进制文件(SerializedFile)由文件头(Header)数据段(Data)组成:

  • 文件头:包含元数据大小、文件大小、版本号、数据偏移量等字段。
  • 数据段:存储序列化的对象数据,格式不固定,需根据类型动态解析。
3. 解析文件头(Header)
  • 大端模式处理:Unity文件头使用大端存储,需用be修饰符指定解析方式:struct Header { be u32 metadataSize; be u32 fileSize; be u32 version; be u32 dataOffset;};Header header @ 0x00;
  • 字段对齐与填充

    bool bigEndian后需填充3字节以保持4字节对齐:

    bool bigEndian;padding[3];

    动态计算填充字节数(如ObjectInfo需4字节对齐):

    fn align(u32 alignment) { u32 pos = $; // 当前解析位置 u32 mod = pos % alignment; return mod == 0 ? 0 : alignment - mod;};struct ObjectInfo { padding[align(4)]; s64 pathID; // 其他字段...};
  • 动态数组解析

    数组长度由前缀字段指定(如typeCount决定TypeInfo数组长度):

    struct Header { // 其他字段... u32 typeCount; TypeInfo types[typeCount];};
  • 条件字段解析

    当classID == 114时,额外解析16字节的scriptID:

    struct TypeInfo { u32 classID; if (classID == 114) { char scriptID[16]; } // 其他字段...};

4. 解析数据段(Data)
  • 数据位置:从header.dataOffset开始,包含多个对象数据。
  • 动态类型匹配

    每个对象数据的类型由header.objects[i].typeID决定,需通过match语句动态选择解析结构:

    s32 globalObjectIndex = -1;u32 globalObjectClassType;fn NextObjectTypeID(ref Header header) { globalObjectIndex += 1; s32 typeIDIndex = header.objects[globalObjectIndex].typeID; globalObjectClassType = header.types[typeIDIndex].classID;};struct ObjectData { NextObjectTypeID(header); match(globalObjectClassType) { (ClassType::GameObject): GameObject data; (ClassType::Transform): Transform data; // 其他类型... };};ObjectData data[header.objectCount] @ header.dataOffset;
  • 继承关系支持:ImHex允许结构体继承,可用于解析具有继承关系的对象(如GameObject、Transform等)。
5. 调试与优化
  • 调试功能:利用ImHex的调试工具排查脚本错误(如语法错误、解析位置偏差)。
  • 性能优化

    避免重复计算(如缓存globalObjectIndex和globalObjectClassType)。

    使用函数封装重复逻辑(如align函数处理对齐)。

6. 注意事项
  • 文件打开模式:ImHex默认以读写模式打开文件,分析时需关闭文件以避免冲突(如Unity生成资源失败)。
  • 项目模式:可通过项目模式保存Pattern脚本,但需手动重新加载文件。
总结

ImHex的Pattern模式通过编程定义数据结构,可高效解析Unity二进制文件。关键点包括:

  • 大端模式处理:使用be修饰符。
  • 动态字段解析:通过条件语句和match实现。
  • 对齐与填充:动态计算填充字节数。
  • 调试与优化:利用工具排查错误并提升性能。

通过以上方法,可完整解析Unity二进制文件的文件头和数据段,实现结构化数据提取和分析。