是否存在对二进制数据流中的数据类型进行逆向工程的自动化方法?

逆向工程 二元分析 文件格式
2021-06-16 05:47:51

考虑一个已知且一致大小的数据包流,即每个包有N个字节。 是否有现有工具可以自动检测(或估计)存在的各种数据类型及其在数据包中的排列? 我的目标是通过以下方式将数据流转换为少量时间序列数据信号

  1. 推断流中数据的排列和类型,以及
  2. 将每个变量提取到它自己的信号数组中。

例如,数据包可能包括:

[double double int32 single int8 int8 int8 int8]

但我只知道数据包长 28 个字节。让我们假设流中的唯一可能的数据类型有:doublesingleint32int16,或uint8(我并不特别在意,如果我能间的歧义charint8uint8)。我们还假设一切都存储在字节(没有单位标志或任何东西)。

一些想法

到目前为止,我所尝试的基本上是彻底尝试每种可能的数据类型组合和排列,然后应用一些启发式方法来消除可能性。例如,我将每组 8 个字节转换为双精度值,一次移动 1 个字节,然后计算结果信号的方差。如果信号的方差 >1e100,那么我们可以肯定地说我们错误地识别了类型。这种方法遇到的问题是:

  1. 启发式是硬编码的,不依赖于数据
  2. 该算法很容易对事物进行错误分类,例如,它不一定能区分 anint32和一对int16

我也知道这两个相关的问题:如何分析二进制文件?工具来帮助对二进制文件格式进行逆向工程,但这些答案似乎只提供了手动工具,要求用户然后玩弄数据并对其配置进行一些猜测。所以,我的问题对这项工作的自动方法或工具特别感兴趣。

这似乎与这个问题它的答案,但是这些方法中提到,似乎有针对推断通信协议的更一般的任务,而不必(?)的数据包的有效载荷的数据类型,所以我不知道如何这些程序适合我所描述的任务。

1个回答

IMO 对链接的答案没有太多要添加的内容(尽管它专注于网络协议,但您的任务听起来非常相似)。

您可以尝试的另一件事是查看引用上述工具的论文以找到更多/相关的方法或工具。