EN JA
MAGIC(4)
MAGIC(4) FreeBSD Kernel Interfaces Manual MAGIC(4)

名前

magic - file コマンド用のマジックナンバーファイル

説明

このマニュアルページでは、 file(1) コマンド (バージョン 4.12) が使用する magic ファイルの書式を説明する。ファイルの種類を調べる方法は色々あるが、 file コマンドはファイルが特定の 「マジックナンバー (magic number)」 で始まるかどうかによってファイルの種類を識別する。ファイル /usr/share/file/magic で指定することは、調べるべきマジックナンバー、特定のマジックナンバーが見つかった時に表示するメッセージ、ファイルから取り出せるその他の情報である。

magic ファイルの各行では実行するテストを指定する。テストでは、ファイル先頭から見て特定のオフセット位置にあるデータと、 1 バイトまたは 2 バイト、4 バイトの数値や文字列との比較が行われる。テストが成功すると指定したメッセージが出力される。行には以下の項目が含まれる:

offset
調べるデータのファイル内での位置を指定するオフセット値で、単位はバイトである。
type
調べるデータの型。指定できる値は以下の通りである:
byte
1 バイト値。
short
(ほとんどのシステムでは) 2 バイト値。マシンのネイティブのバイト順である。
long
(ほとんどのシステムでは) 4 バイト値。マシンのネイティブのバイト順である。
string
文字列を表すバイト列。 string 型の指定では、オプションとして /[Bbc]* を後ろに続けることができる。 ``B'' フラグは、対象ファイル中の複数個の空白を 1 個の空白に切り詰めて扱う。この場合、対象ファイルは少なくとも 1 個の空白を含んでいる必要がある。 magic ファイルに n 個の連続した空白がある場合、対象ファイルには、これにマッチする n 個の連続した空白が必要となる。 ``b''フラグは、対象ファイル中の空白を存在してもしなくてもよい空白として扱う。さらに、``c'' フラグは、大文字・小文字を区別しないマッチを行うことを指定する: magic ファイル中の小文字は、対象ファイル中の大文字・小文字の両方にマッチする。しかし、magic ファイル中の大文字は、対象ファイル中の大文字にのみマッチする。
date
UNIX 時刻と解釈される 4 バイト値。
ldate
UNIX 形式の時刻と解釈される 4 バイト値。ただし UTC ではなくローカルタイムとして解釈される。
beshort
(ほとんどのシステムでは) 2 バイト値。バイト順はビッグエンディアンである。
belong
(ほとんどのシステムでは) 4 バイト値。バイト順はビッグエンディアンである。
bedate
(ほとんどのシステムでは) 4 バイト値。バイト順はビッグエンディアンである。 UNIX 時刻と解釈される。
leshort
(ほとんどのシステムでは) 2 バイト値。バイト順はリトルエンディアンである。
lelong
(ほとんどのシステムでは) 4 バイト値。バイト順はリトルエンディアンである。
ledate
(ほとんどのシステムでは) 4 バイト値。バイト順はリトルエンディアンである。 UNIX 時刻と解釈される。
leldate
(ほとんどのシステムでは) 4 バイト値。バイト順はリトルエンディアンである。 UNIX 形式の時刻と解釈される。ただし UTC ではなくローカルタイムとして解釈される。

数値型の値の後には & と数値を書くことができる。この場合、比較を行う前に & の後に置いた数値との AND 演算が行われる。型の前に u を置くことで、順序付きの比較を符号無しで行うことが指定できる。

test
ファイル内の値と比較する値。これは C 言語の文字列として指定し、エスケープ文字も普通に使える (例: \n は改行文字)。
数値の前には、実行する動作を指定する文字を置くことができる。 = を指定した場合は、ファイル内の値は指定した値と等しくなければならない。 < を指定した場合は、ファイル内の値は指定した値より小さくなければならない。 > を指定した場合は、ファイル内の値は指定した値より大きくなければならない。 & を指定した場合は、指定した値で立っている全てのビットがファイル内の値でも立っていなければならない。 ^ を指定した場合は、指定した値で立っているどのビットも、ファイル内の値で立っていてはならない。 x はどんな値にもマッチする。文字が省略されている場合は、 = が指定されているとみなされる。
数値は C 言語の書式で指定する。例えば、 13 は 10 進数、 013 は 8 進数、 0x13 は 16 進数である。
文字列の場合、ファイル中に含まれるバイト文字列は、指定されたバイト文字列にマッチしなければならない。演算子 =, <, > は文字列にも適用できる (ただし & は適用できない)。マッチングを行う長さは、magic ファイルの文字列引数の長さである。つまり、 >\0 を指定することにより、ある行をどんな文字列にもマッチさせ、そして多分その文字列を表示させることができるだろう。
message
比較が成功したときに出力されるメッセージ。文字列に printf(3) の書式指定が含まれている場合、このメッセージを書式指定文字列として使ってファイル内の値 (指定された全てのマスク処理は実行される) が出力される。

一部のファイルフォーマットでは、ファイルの種類とともに追加情報が表示される。文字 > で始まる行は、追加で行うテストと表示メッセージを示す。 1 行に含まれる > の数はテストのレベルを表す。先頭に > がない行はレベル 0 になる。レベル n+1 の各行は、magic ファイル中で自分より前にあるレベル n の行のうち、最も近い位置のものの制御に従う。レベル n の行のテストが成功すると、それに続く全てのレベル n+1 の行で指定されているテストが実行され、そのテストが成功するとメッセージが出力される。次に n があった場所でこの動作は終了する。直前の > の直後の文字が ( ならば、括弧の後の文字列は間接オフセット値と解釈される。つまり、括弧の後の数字はファイル内でのオフセットとして使われる。このオフセット位置にある値が読み込まれ、読み込まれた値がファイル中でのオフセットとして使われる。間接オフセット値の書式は以下である: ((x[.[bslBSL]][+-][y]). x の値はファイル内でのオフセット値として使われる。そのオフセット位置にある byte 型、short 型、long 型の値が読み込まれるが、どの型になるかは型指定子 [bslBSL] によって決まる。大文字で示される型はビッグエンディアンの値と解釈され、小文字で示される型はリトルエンディアンの値と解釈される。この数まで y の値に加えられ、その結果がファイル中のオフセット値として使われる。何も指定されていない場合のデフォルトの型は long である。

前のフィールドの長さによってオフセット値が変わるため、正確なオフセット値がわからない場合もある。この場合は、直前の上位レベルのフィールドの終わりからの相対位置でオフセットを指定できる (当然ながらこの方法はサブレベルのテスト、つまり > で始まるテストでしか使えない)。このような相対オフセット値は、オフセット値の前に & を置くことで指定する。

バグ

long, belong, lelong, short, beshort, leshort, date, bedate, ledate の書式はシステム依存である。識別させるファイルは、この長さが違うシステムから持ってくることが多いため、バイト列として指定すべきだろう (2B, 4B 等)。

(現時点では) 間接オフセット値でエンディアンを指定してデータを扱うことはできない。

関連項目

file(1) -このファイルを読むコマンド。
Public Domain