数据通常存储在很少或没有文档的特定于程序的二进制文件中。我们领域的一个典型例子是来自仪器的数据,但我怀疑这个问题是普遍的。有哪些方法可以尝试理解和解释数据?
设定一些界限。文件未加密,也没有 DRM。文件的类型和格式特定于程序的编写者(即它不是“标准文件”——例如 *.tar——其身份已丢失)。(可能)没有故意混淆,但可能会有一些业余的努力来节省空间。我们可以假设我们对数据是什么有一个一般性的了解,并且我们可以识别一些(但可能不是全部)字段和数组。
假设大部分数据是数字的,带有标量和数组(可能是一维和二维,有时是不规则的或三角形的)。还有一些字符串,可能是人名、站点、日期,可能还有一些关键字。程序中会有读取二进制文件的代码,但我们无权访问源代码或汇编程序。例如,它可能是由 VAX Fortran 程序或一些早期的 Unix 或 Windows 作为 OLE 对象编写的。这些数字可能是大端或小端(一开始并不知道),但它可能是一致的。我们可能在不同的机器上有不同的版本(例如 Cray)。
我们可以假设我们有一个相当大的文件语料库——比如说几百个。
我们可以假设两种情况:
- 我们可以使用不同的输入重新运行程序,以便进行实验。
- 我们无法重新运行该程序 - 我们有一组固定的文档。这与用未知语言(例如线性 B)解码历史文档有轻微的相似性。
部分解决方案可能是可以接受的——即,可能有些领域现在没有活人理解,但大多数其他领域是可以解释的。
我只对开源方法感兴趣。
更新有一个相关的 SO 问题(如何对二进制文件格式进行逆向工程以实现兼容性),但重点有所不同。
更新来自@brianegge 的巧妙建议来解决(1)。使用truss
(或可能strace
在 Linux 上)转储程序中的所有 write() 和类似调用。这应该至少允许将记录的集合写入磁盘。