我正在运行file
wallet.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个字节字节顺序;lelong
和belong
分别表示小端和大端顺序的 4 个字节。
您可能不想复制规则,而是想调用该file
实用程序;它由 POSIX 指定,但它识别的格式和输出的描述却不是。或者,您可以链接libmagic
并调用magic_file
ormagic_buffer
函数。
答案2
你可以:
file
从您的程序中运行file
使用为您的编程语言提供功能的库。例如libmagic
对于C,File::Libmagic
或者File::MMagic
对于perl
pythonpython-magic
,等等。
顺便说一句,用于识别文件的定义file
可以在/etc/magic
.请参阅man 5 magic
参考资料 获取文件格式详细信息。