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

Nic*_*ell 8 file-command

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

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

Gil*_*il' 16

获取文件命令的来源。大多数(如果不是所有)开源 unice 都使用这个。该file命令随magic数据库一起提供,以其描述的幻数命名。(此数据库也安装在您的实时系统上,但以编译形式。)查找包含您看到的描述文本的文件:

grep 'Berkeley DB' magic/Magdir/*
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

第一列指定要找到某个字节序列的偏移量。第三列包含字节序列。第二列描述字节序列的类型:long表示平台字节序中的4 个字节lelongbelong分别以 little-endian 和 big-endian 顺序表示 4 个字节。

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


cas*_*cas 10

你可以:

  1. file从你的程序中运行

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

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