文件是如何识别这个特定文件的?

文件是如何识别这个特定文件的?

我正在运行filewallet.dat 文件(比特币保存私钥的文件),尽管似乎没有任何可识别的标头或字符串,但file仍然可以看出它是 Berkley DB 文件,即使我将其减少到 16 字节。

我知道该文件正在应用某种规则或搜索某种序列来识别它。我想知道它在这里应用的规则是什么,以便我可以在我自己的程序中复制它。

答案1

获取文件命令的来源。大多数(如果不是全部的话)unices 使用开源这个。该file命令附带magic数据库,以神奇的数字它所描述的。 (此数据库也安装在您的实时系统上,但以编译的形式。)查找包含您看到的描述文本的文件:

grep 'Berkeley DB' magic/Magdir/*

magic手册页描述文件的格式。 “Berkeley DB”的触发线是

0       long    0x00061561      Berkeley DB
0       belong  0x00061561      Berkeley DB
12      long    0x00061561      Berkeley DB
12      belong  0x00061561      Berkeley DB
12      lelong  0x00061561      Berkeley DB
12      long    0x00053162      Berkeley DB
12      belong  0x00053162      Berkeley DB
12      lelong  0x00053162      Berkeley DB
12      long    0x00042253      Berkeley DB
12      belong  0x00042253      Berkeley DB
12      lelong  0x00042253      Berkeley DB
12      long    0x00040988      Berkeley DB
12      belong  0x00040988      Berkeley DB 
12      lelong  0x00040988      Berkeley DB

第一列指定要找到某个字节序列的偏移量。第三列包含字节序列。第二列描述了字节序列的类型:long表示平台的4个字节字节顺序;lelongbelong分别表示小端和大端顺序的 4 个字节。

您可能不想复制规则,而是想调用该file实用程序;它由 POSIX 指定,但它识别的格式和输出的描述却不是。或者,您可以链接libmagic并调用magic_fileormagic_buffer函数。

答案2

你可以:

  1. file从您的程序中运行

  2. file使用为您的编程语言提供功能的库。例如libmagic对于C,File::Libmagic或者File::MMagic对于perlpython python-magic,等等。

顺便说一句,用于识别文件的定义file可以在/etc/magic.请参阅man 5 magic参考资料 获取文件格式详细信息。

相关内容