考虑一个已知且一致大小的数据包流,即每个包有N个字节。 是否有现有工具可以自动检测(或估计)存在的各种数据类型及其在数据包中的排列? 我的目标是通过以下方式将数据流转换为少量时间序列数据信号
- 推断流中数据的排列和类型,以及
- 将每个变量提取到它自己的信号数组中。
例如,数据包可能包括:
[double double int32 single int8 int8 int8 int8]
但我只知道数据包长 28 个字节。让我们假设流中的唯一可能的数据类型有:double
,single
,int32
,int16
,或uint8
。(我并不特别在意,如果我能间的歧义char
,int8
或uint8
)。我们还假设一切都存储在字节(没有单位标志或任何东西)。
一些想法
到目前为止,我所尝试的基本上是彻底尝试每种可能的数据类型组合和排列,然后应用一些启发式方法来消除可能性。例如,我将每组 8 个字节转换为双精度值,一次移动 1 个字节,然后计算结果信号的方差。如果信号的方差 >1e100,那么我们可以肯定地说我们错误地识别了类型。这种方法遇到的问题是:
- 启发式是硬编码的,不依赖于数据
- 该算法很容易对事物进行错误分类,例如,它不一定能区分 an
int32
和一对int16
。
我也知道这两个相关的问题:如何分析二进制文件?和工具来帮助对二进制文件格式进行逆向工程,但这些答案似乎只提供了手动工具,要求用户然后玩弄数据并对其配置进行一些猜测。所以,我的问题对这项工作的自动方法或工具特别感兴趣。
这似乎与这个问题和它的答案,但是这些方法中提到,似乎有针对推断通信协议的更一般的任务,而不必(?)的数据包的有效载荷的数据类型,所以我不知道如何这些程序适合我所描述的任务。