文件如何识别此特定文件?


8

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

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


1
文件不是万无一失的,它只是根据文件的内容进行猜测,“星期二打印错误”是其中猜测错误的一个示例
Jasen 2015年

1
file在这种情况下,@ Jasen 并没有错。
Nick ODell,2015年

Answers:


16

抓住文件命令的源。大多数(如果不是全部)开放原始码的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_filemagic_buffer函数。


10

你可以:

  1. file从程序中运行

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

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


1
在Linux上/etc/magic往往是您自己的本地魔术知识。发行商倾向于将他们的通用魔术放进唱片中/usr/share/misc/magic
史蒂夫2015年

1
最后我只阅读源:github.com/file/file/blob/...
尼克·奥德尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.