解码一个 blob

逆向工程 二元分析
2021-06-12 18:21:33

我有一个专有的文件格式,它是一个压缩的数据库文件。这个数据库文件有几十个表。这些表中的每一个都只有几条记录,其中许多根本没有任何记录。其中一些表包含存储为十六进制数据 blob 的字段。这些 blob 占整个数据库文件磁盘空间的 99%。

据我所知,这些 blob 不是压缩数据(通过使用 unix 'file' 命令)。我尝试通过从专有软件导出值、转换为十六进制并在数据库文件中搜索该值来在这些 blob 中找到已知值。到目前为止,我还没有找到任何匹配项。问题是该软件可以以多种格式导出,我不确定数据将存储在哪个(如果有)中。

大多数表都包含校验和字段,我相信这是导致我无法编辑 blob 并查看专有软件中有哪些变化的原因。这与我无法直接更改我希望从专有文件中提取的值这一事实相结合,使我陷入困境。

有人知道尝试从二进制数据中梳理出时间序列数据的任何技巧吗?

编辑 此 zip 文件包含来自解压缩数据库的 2 个十六进制 blob(索引和值)以及从程序导出的相同数据。

2个回答

看到测试文件后(谢谢!):

... 太容易了 :)

在 中value.hex,第一个 dword 似乎是文件总长度;第二个双字是数据长度。第三个和第四个双字可能是某种标志,似乎并不指向数据。这会删除前 16 个字节,因此我猜第二个双字是“数据长度”。

紧接着这个标题又出现了那个熟悉的对78 9C,所以我拿出了我的 zlib 解码器包装器。解包value.hex,从偏移量 0x10 开始,并使用TINFL_FLAG_PARSE_ZLIB_HEADER(因为我miniz.c用于 eaze)给了我一个正确的解包结果和一个 33,208 字节长的数据文件。

用 0xED 检查这个文件显示这个文件完全由双值组成(每个 8 个字节);前几个是

0.991932
0.991931
0.991932
0.991932
0.991932
0.991933

(好吧,这里似乎有一个模式——魔鬼在 0xED 没有显示的最后几位数字中,它们并不都是相同的值)。

第二个文件 ,index.dat也正确解包并给出了另一个长长的 double 值列表,这次明显上升:

0.0000
0.0082
0.0163833
0.0245667

我没有将这些值与您提供的 XLS 文件进行交叉引用,我假设您可以从这里解决。

我只解压,直到得到肯定的结果,我没有检查在第一个数据包之后是否还有更多数据包(压缩或其他方式),您应该使用自己喜欢的解压程序的最终结果进行验证。


就在我准备睡觉时,我突然想到标题中的第 3 个和/或第 4 个双字(它们不是一样的吗?)可能是“未压缩”的长度。

由于您没有提供任何背景细节,我将尝试进行疯狂猜测。这在很大程度上取决于您的应用领域。例如在医学领域,使用的大多数算法都是众所周知的,因此您可以简单地跳过一堆二进制数据来找到众所周知的算法,例如用于元数据的 zlib 和/或用于图像的简单编码(例如 RLE)。

我会尝试创建一个字符串,例如“super calli fredgulistic ex pe alli doschus 是一个很酷的词”。然后以所有可能的格式导出文件,然后在所有导出的文件中简单地grep。例如:

$ grep "super calli fredgulistic" *

或者如果您的字符串是 16 位小端:

$ strings -e l output_format | grep "super calli fredgulistic"

您会发现这种格式最容易处理(希望如此!)。