我有二进制数据的文件,它们的格式描述非常模糊和不完整。例如,它声明记录以头字节开始,如(十六进制)FA,然后是日期时间(精确到毫秒)和其他数据字段,但没有指示字段长度、最低有效位 (LSB) 值,甚至字节记录字段的字节序。总的来说,这些文件应该代表某种消息日志,我需要将它们正确解码为有意义的数据。
鉴于格式描述中的模糊、不完整和可能的错误(见下文),我实现目标的唯一希望是我拥有的表格。它大致描述了二进制文件中的内容。例如,我知道特定文件中的某些字段必须解码为接近 2700 的值,另一个字段必须为 -8.77 等。每个文件最多有一个这样的记录语句。
我首先阅读了这个问题,但我不确定哪些工具可以帮助我解决问题。所以我已经将我的输入二进制文件翻译成文本文件,简单地以十六进制表示形式显示初始数据,全部在一个大字符串中。按标头字节拆分它会产生一些奇怪的图片,其中每个记录似乎具有不同的字节长度。进一步的调查表明,标题的类型(我称它们为子标题)比格式描述中描述的要多。此外,第一个 1 字节字段似乎表示记录另外具有多少内部 22 字节数据块。第一个字段不合适 - 从格式描述来看,它应该是日期时间。所以,它不是那么准确/值得信赖,但至少它把我(似乎)推向了正确的方向。
我对逆向工程完全陌生,所以我的问题可能很糟糕,但请耐心等待:
鉴于所描述的情况,我的任务是否有可能完成?
如果是,我应该如何尝试找到一种解码方法?什么工具可以帮助找到正确的字段长度、LSB 和语义(即,哪个数据字段是哪个,因为我不再太相信该格式描述)?
编辑:有关调查结果的其他信息
下面是一些内部 22 字节块的示例。其中一条记录有 7 个块:
0018001E030825411C004303076D000D230000013802
0018002B020B56010C001C030011000D22065D011601
0018003103166A0052001803000A000D22065D011601
00187F7301197440390017030779000D22065D011701
0018002B02230540390019030779000D22065D011E01
00187F7E032578004A0024030009000D22065D012B01
00180038012B2501040028030010000D230000013101
以“FE070F600710”为前缀,其中“07”表示其中有 7 个,“0F600710”似乎在整个文件的此类前缀中重复出现。不同的 8 块记录示例:
00187F4C020614414E0030030767000D230000012001
00187F4E000669414E0031030767000D230000012301
00180014030E3B004A0028030009000D230000012601
0018002B0110694042001B030778000D230000011C01
00187F620321080052001203000A000D230000011601
0018000B00254440390028030779000D230000012E02
0018001601345C00420018030008000D230000012401
0018002B013923404A0010030777000D230000011E01
正如我们所见,它们都以“0018”开头,因此这可能是另一个子标题,而不是数据。这给我们留下了正好五个 4 字节浮点数,或两个 8 字节双精度数和额外的 4 个字节。
可以看到一些列“00”,“0D”似乎也在列模式中重复。还有一个“03”也一直存在。如果我们将它们视为额外的分隔符,7、1、2 和 6 字节的字段就可以猜到,这与某些标准的单精度或双精度浮点数不同。这就是为什么在最初的陈述中我认为实数被编码为整数,带有一些未知的 LSB。