ファイルはこの特定のファイルをどのように識別しましたか?


8

私はfilewallet.datファイル(Bitcoinが秘密鍵を保持しているファイル)に対して実行しており、識別可能なヘッダーまたは文字列がないように見えてもfile、たとえそれがBerkley DBファイルであるとさえ判断できます。それを16バイトに削減します。

そのファイルが何らかのルールを適用しているか、それを特定するためにいくつかのシーケンスを検索していたことを知っています。ここで適用されているルールを知りたいので、自分のプログラムでそれを複製できます。


1
ファイルは完全ではなく、ファイルの内容に基づいて推測するだけです。「火曜日の印刷のバグ」は、それが間違っていた場所の1つの例です
Jasen

1
@Jasen fileはこの状況で間違っていません。
Nick ODell、2015年

回答:


16

fileコマンドのソースを取得します。すべてではないにしてもほとんどのオープンソースのunicesがこれを使用しています。fileコマンドが付属していますmagicちなんで名付けられたデータベース、マジックナンバー、それは説明しています。(このデータベースは、ライブシステムにもインストールされますが、コンパイルされた形式です。)表示される説明テキストを含むファイルを探します。

grep 'Berkeley DB' magic/Magdir/*

magicmanページには、ファイルの形式について説明します。「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

最初の列は、特定のバイトシーケンスが見つかるオフセットを指定します。3列目には、バイトシーケンスが含まれます。2列目は、バイトシーケンスのタイプを示しています。longつまり、プラットフォームのエンディアンで4バイトを意味します。リトルエンディアンとビッグエンディアンの順序でそれぞれ4バイトlelongbelong意味します。

ルールを複製するのではなく、fileユーティリティを呼び出します。それはPOSIXによって指定されていますが、それが認識するフォーマットとそれが出力する説明はそうではありません。または、or 関数にリンクしlibmagicて呼び出すこともできます。magic_filemagic_buffer


10

あなたは出来る:

  1. fileプログラム内から実行する

  2. fileの機能をプログラミング言語に提供するライブラリを使用します。例えばlibmagicCのために、File::LibmagicまたはFile::MMagicのためにperlpython-magicPython用など

ところで、fileファイルの識別に使用する定義はにあります/etc/magic。参照man 5 magicファイル形式の詳細については。


1
Linuxでは/etc/magic、ローカルの魔法の知識を習得する傾向があります。ディストリビューションは、一般的な魔法をでポップする傾向があり/usr/share/misc/magicます。
スティーブ・

1
:私はちょうどソース読み終わったgithub.com/file/file/blob/...
ニック・オデル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.