【问题标题】:Binary de-serialization - how to find, what type of serialization is it?二进制反序列化 - 如何查找,它是什么类型的序列化?
【发布时间】:2017-04-18 18:28:42
【问题描述】:

我有一个由程序生成的 .dat 文件。程序所有者不反对解析和编辑这个文件,但他不会给任何人答案。

该文件主要由以这种方式定义的变量组成:

在大多数情况下:

(4 bytes - length of the var name)(var name)(4 bytes of some internal var type)(4 bytes - possibly are elements count)(X bytes of var value)

很少:

(4 bytes - length of the var name)(var name)(1 zero byte)(4 bytes of some internal var type)

所以,例如:

([4 0 0 0][name])[11 0 0 0][1 0 0 0]([9 0 0 0][Alexander])

([8 0 0 0][names])[6 0 0 0](length [3 0 0 0])([4 0 0 0][John])([4 0 0 0][Anne])([7 0 0 0][SomeGuy])

我尝试查看 boost 二进制序列化,但它没有在文件中添加变量名,我认为使用 8 个字节,而不是 4 个。

【问题讨论】:

  • 您需要有二进制数据文件的模板或布局才能弄清楚。您不知道每个单元有多少字节(例如uint8_tuint32_t)。此外,对于多字节数量,您需要知道数据是 Little Endian 还是 Big Endian 排序。
  • 尝试在Reverse Engineering 网站上提问。
  • Thomas,它是 Macintosh ANSI (Notepad++)。我确定它是每单位 4 个字节。我发现数组的长度用 4 个字节表示。

标签: c++ serialization deserialization


【解决方案1】:

没有通用的方法来确定它是“什么类型的序列化”。该格式的作者已经做出了设计决定并得出了最终格式。从字面上看,它可以是任何东西。您可以做出有根据的猜测(“逆向工程”),但唯一确定的方法是从作者那里获得规范。尽管您声称他不介意人们操纵以这种格式存储的文件,但他拒绝提供上述规范让我怀疑这是否真的是真的,最终意味着您可能不得不坚持猜测。

【讨论】:

  • 这是名为 Avorion 的游戏的 .dat 文件。我已经在官方论坛上发布了一些更改此文件的实用程序。我得到了下载,没有任何禁令或诸如“请不要再这样做”之类的字眼。
  • @user64675 没有在论坛上被关闭并不意味着批准。这可能意味着你没有对自己的行为产生足够的关注,或者它确实意味着它是好的。您需要检查产品发布所依据的许可。
【解决方案2】:

要添加BoundaryImposition 的答案,没有可以处理“任何”格式的反序列化框架(据我所知)。格式必须由库知道并实现。所以你需要自己去实现它。

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多