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