2022-12-19 09:42:58
使用ImHex分析Unity资源二进制格式可通过其Pattern模式编程实现,该模式支持自定义数据结构解析二进制文件。以下是具体步骤和关键实现方法:
1. Pattern模式基础Unity的二进制文件(SerializedFile)由文件头(Header)和数据段(Data)组成:
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]; } // 其他字段...};
每个对象数据的类型由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;避免重复计算(如缓存globalObjectIndex和globalObjectClassType)。
使用函数封装重复逻辑(如align函数处理对齐)。

ImHex的Pattern模式通过编程定义数据结构,可高效解析Unity二进制文件。关键点包括:
通过以上方法,可完整解析Unity二进制文件的文件头和数据段,实现结构化数据提取和分析。