Dungeon Siege 3 *.OAF 格式分析
探索未知事物,比玩游戏本身要有趣的多。
上一篇提到,有一些现成的工具可以用来提取、压缩OAF文件,不过还是想对文件结构能有更精确的了解。经过一番分析,有了以下结果,不过仍有部分未知,有待继续研究。
DS3的OAF文件基本可以分为四部分:file header, zlib stream offset table, zlib stream, file name and tree structure table
1). File header. 文件头。
0×0: 3 bytes. 即被称为magic number或者signature的部分,’OAF’
0×3: 9 bytes. 未知。当然这一部分也可能是文件签名的一部分。
0xC: 4 bytes. File name table entry offset. 保存文件名表的入口偏移。
0×10: 4 bytes. 未知。
0×14: 4 bytes. Entry number,表项数目。zlib数据流包含的压缩包数目应该与文件名数目相等,否则无法匹配。
0×18: 4 bytes. 未知。感觉像是某种校验。
2). Zlib stream offset table. zlib数据流偏移表。
每个表项都指向文件中具体一个压缩包的未知,表项长度为0×14个byte。容易算出来,这部分的长度应该是 0×14 bytes * 表项数,出于对齐的考虑,这部分结束后可能有若干字节补零。
每个表项的结构如下:
0×0: 4 bytes. zlib压缩包起始偏移。
0×4: 4 bytes. 未知。感觉上可能是与压缩算法有关的参数。
0×8: 4 bytes. Raw data size. 未压缩数据的大小。
0xC: 4 bytes. Packed data size. 压缩后数据的大小。如果为0则说明这一表项指向的数据没用压缩。
0×10: 4 bytes. 未知。感觉有可能是未压缩数据的某种校验。
3). Zlib stream. zlib数据流。
这一部分的起始地址应该是0×10 byte对齐的,即”起始地址 & 0xF = 0″。
根据第二部分的每一个表项,都可以在这部分中找到对应的、压缩后的数据流。
4). File name and tree structure. 文件名和目录结构。
该部分的偏移在文件头中有描述。
这部分是若干个字符串,每个字符串都有标准结尾”0×0″. 文件名和第二、三部分按照相同的次序排列,一一对应。
有了以上这些信息,接下来准备做一个提取用的工具,顺便也玩一下zlib。另外,未知的部分也要想办法研究一下。
Recent Comments