Serialization 如何找出正在使用的归档格式?

Serialization 如何找出正在使用的归档格式?,serialization,Serialization,我正在做一个关于一些游戏数据文件的爱好项目。我想编辑其中的一些内容并重新打包,这样游戏就可以接受修改了 目录本身是以一种很容易打开的专有格式存档的。这些文件是用zlib压缩的。现在我被难住了,因为似乎还有(至少)一层归档。这些文件似乎是序列化的,但查找最常见的明显答案并没有成功。谷歌没有帮助。我没有找到任何魔法字节(并不意味着没有,我只是没有找到)。如果序列化格式是商业格式,我如何知道它是什么?如果不是,我应该如何处理这个问题 一点背景: 文件在Windows 上由Visual C++应用程序

我正在做一个关于一些游戏数据文件的爱好项目。我想编辑其中的一些内容并重新打包,这样游戏就可以接受修改了

目录本身是以一种很容易打开的专有格式存档的。这些文件是用zlib压缩的。现在我被难住了,因为似乎还有(至少)一层归档。这些文件似乎是序列化的,但查找最常见的明显答案并没有成功。谷歌没有帮助。我没有找到任何魔法字节(并不意味着没有,我只是没有找到)。如果序列化格式是商业格式,我如何知道它是什么?如果不是,我应该如何处理这个问题

一点背景:

  • 文件在Windows
  • 上由Visual C++应用程序读取
  • 我相信文件预序列化类似于XML
  • 我已经反编译了.exe,在读取数据文件时尝试分步执行该过程没有成功(它读取7Gb的数据,我找不到要使用的文件类型的开头)。寻找有用的绳子也没用
  • 我尝试过比较Python pickle、marshal、VC++MFC marshal和各种归档程序格式。不走运
序列化文件的显著特征:

文件末尾有某种目录。看起来像这样:

TOC0 4字节的偏移量 4字节长度 奥布耶 8字节的偏移量 8字节长度

等等。TOC中的其他标题为地形、CHNK、CLAS、PROP、STRG、TRAN、IMPR和EXPR,后面是偏移量和长度。偏移和长度值是大端值

文件本身似乎是类型长度值编码的(人类可读的字符串位于CLAS标题下),或者在4字节块中键入不同的类型值。有4个字节块,如AA、AB或BB,可能用作分隔符

数据有很长的部分,除了一个字节增加1外,没有任何变化。看起来像是某种索引

文件数据可能包含各种数据类型

我有机会比较了两个不同版本的数据文件。更改未序列化文件中的int值会导致序列化文件中发生非常小的更改(通常,原始文件中的一个数字更改为结果文件中的一个十六进制值)

这种格式的空间效率极低。大部分内容都是4字节块,文件可压缩10倍。这一点和字符串的可读性让我相信该文件没有以任何方式进行压缩或加密。它只是以某种方式序列化了


非常感谢您的帮助

可能是微软的复合文件?这是Eugen Systems创建的战争游戏数据文件格式。它现在记录在战争游戏mod tools github repo中。