EN JA
MAGIC(5)
MAGIC(5) FreeBSD File Formats Manual MAGIC(5)

名称

magicfile コマンドのマジックパターンファイル

解説

このマニュアルページは、 file(1) コマンドバージョン "5.11"によって使用されるマジックファイルの形式を文書化しています。 file(1) コマンドは、いくつかあるテスト、“マジックパターン”を含むかどうかのためのテストを使用して、ファイルのタイプを識別します。ファイル /usr/share/misc/magic は、テストされるパターン、特定のパターンが見つけられるなら印刷されるメッセージまたは MIME タイプ、とファイルから抽出される追加情報が何であるかを指定しています。

ファイルの各行は、実行されるテストを指定します。テストは、ファイル中の特定のオフセットで始まるデータとバイト値、文字列または数値と比較します。テストが成功するなら、メッセージが印刷 (表示) されます。行は、次のフィールドから成ります:

offset
テストされるデータのファイル中のバイト単位のオフセットを指定する数値。
type
テストされるデータのタイプ。指定できる値は、次の通りです:
byte
1 バイトの値。
short
このマシンのネイティブのバイト順の 2 バイトの値。
long
このマシンのネイティブのバイト順の 4 バイトの値。
quad
このマシンのネイティブのバイト順の 8 バイトの値。
float
このマシンのネイティブのバイト順の 32 ビットの単精度 IEEE 浮動小数点数。
double
このマシンのネイティブのバイト順の 64 ビットの倍精度 IEEE 浮動小数点数。
string
バイトの文字列。文字列タイプ指定には、省略可能な /[WwcCtb]* を続けることができます。“W”フラグは、少なくとも 1 つの空白類文字を含まなければならない、ターゲットの空白類を詰めます。マジックに n 個の続する空白があるなら、ターゲットは、一致する少なくとも n 個の連続する空白を必要とします。“w”フラグは、省略可能な空白としてマジック中のすべての空白を扱います。最後に、“c”フラグは、大文字小文字を区別しない比較を指定します: マジック中の小文字は、ターゲットの小文字と大文字の両方に一致し、一方、マジック中の大文字は、ターゲットの大文字のみ一致します。“C”フラグは、大文字小文字を区別しない比較を指定します: マジック中の大文字は、ターゲットの小文字と大文字の両方に一致し、一方、マジック中の小文字は、ターゲットの大文字のみ一致します。完全な大文字小文字を区別しない比較を行うためには、“c”と“C”の両方を指定します。“t”フラグによって、テストは、テキストファイルのために強制的に行われ、一方、“b”フラグによって、テストは、バイナリファイルのために強制的に行われます。
pstring
最初のバイト/short/int が符号なしの長さと解釈される、Pascal スタイル文字列。長さは、デフォルトでバイトになり、修飾子として指定することができます。次の修飾子がサポートされています:
B
バイト長 (デフォルト)。
H
2 バイトのビッグエンディアンの長さ。
h
2 バイトのリトルエンディアンの長さ。
L
4 バイトのビッグエンディアンの長さ。
l
4 バイトのリトルエンディアンの長さ。
J
長さは、そのカウントでそれ自体を含んでいます。
文字列は、ヌル文字で終了しません。このタイプの長さが JPEG 形式の特徴であるので、“J”は、より価値のある“I”ではなく使用されます。
date
UNIX の日付として解釈される 4 バイトの値。
qdate
UNIX の日付として解釈される 8 バイトの値。
ldate
UNIX スタイルの日付として解釈される 4 バイトの値ですが、UTC ではなくローカル日付と解釈されます。
qldate
UNIX スタイルの日付として解釈される 8 バイトの値ですが、UTC ではなくローカル日付と解釈されます。
beid3
ビッグエンディアンのバイト順の 32 ビットの ID3 の長さ。
beshort
ビッグエンディアンのバイト順の 2 バイトの値。
belong
ビッグエンディアンのバイト順の 4 バイトの値。
bequad
ビッグエンディアンのバイト順の 8 バイトの値。
befloat
ビッグエンディアンのバイト順の 32 ビットの単精度 IEEE 浮動小数点数。
bedouble
ビッグエンディアンのバイト順の 64 ビットの倍精度 IEEE 浮動小数点数。
bedate
Unix の日付として解釈されるビッグエンディアンのバイト順の 4 バイトの値。
beqdate
Unix の日付として解釈されるビッグエンディアンのバイト順の 8 バイトの値。
beldate
UNIX スタイルの日付として解釈されるビッグエンディアンのバイト順の 4 バイトの値ですが、UTC ではなくローカル日付と解釈されます。
beqldate
UNIX スタイルの日付として解釈されるビッグエンディアンのバイト順の 8 バイトの値ですが、UTC ではなくローカル日付と解釈されます。
bestring16
ビッグエンディアンのバイト順の 2 バイトの unicode (UCS16) 文字列。
leid3
リトルエンディアンのバイト順の 32 ビットの ID3 の長さ。
leshort
リトルエンディアンのバイト順の 2 バイトの値。
lelong
リトルエンディアンのバイト順の 4 バイトの値。
lequad
リトルエンディアンのバイト順の 8 バイトの値。
lefloat
リトルエンディアンのバイト順の 32 ビットの単精度 IEEE 浮動小数点数。
ledouble
リトルエンディアンのバイト順の 64 ビットの倍精度 IEEE 浮動小数点数。
ledate
UNIX の日付として解釈されるリトルエンディアンのバイト順の 4 バイトの値。
leqdate
UNIX の日付として解釈されるリトルエンディアンのバイト順の 8 バイトの値。
leldate
UNIX スタイルの日付として解釈されるリトルエンディアンのバイト順の 4 バイトの値ですが、UTC ではなくローカル日付と解釈されます。
leqldate
UNIX スタイルの日付として解釈されるリトルエンディアンのバイト順の 8 バイトの値ですが、UTC ではなくローカル日付と解釈されます。
lestring16
リトルエンディアンのバイト順の 2 バイトの unicode (UCS16) 文字列。
melong
ミドルエンディアン (PDP-11) バイト順の 4 バイトの値。
medate
UNIX スタイルの日付として解釈されるミドルエンディアン (PDP-11) バイト順の 4 バイトの値。
meldate
UNIX スタイルの日付として解釈されるミドルエンディアン (PDP-11) バイト順の 4 バイトの値ですが、UTC ではなくローカル日付と解釈されます。
indirect
与えられたオフセットから開始する、再びマジックデータベースを調べます。
regex
拡張 POSIX 正規表現構文 (egrep に似た) での正規表現のマッチ。正規表現は、処理するために指数関数的時間がかかるかもしれず、それらの性能は、予測しづらいので、正規表現の使用は、お勧めできません。実稼動環境で使用されるとき、それらの性能は、慎重にチェックされるべきです。省略可能な /[c][s] をタイプ指定に続けることができます。“c”フラグは、大文字と小文字を区別しないでマッチしますが、“s”フラグは、終わりでなくマッチの始まりのオフセットにオフセットを更新します。正規表現は、前方の行 N + 1 対してテストされます、ここで N は、与えられたオフセットです。行の終りは、マシンのネイティブ形式にあると仮定されます。 ^$ は、ファイルの始まりと終りではなく、それぞれ個別の行の始まると終りにマッチします。
search
与えられたオフセットで始まるリテラル文字列を検索します。文字列のパターンとして同じ修飾子フラグを使用することできます。 (もしあれば) 修飾子フラグは、 /number 範囲が続かなければなりません、すなわち、開始オフセットから始まりマッチが試みられる位置の数です。これは、特殊文字のための \ エスケープを使用して、変数オフセットでより大きなバイナリ表現を検索するのに適しています。オフセットは、regex のように動作します。
default
これは、テスト x (常に真) と他のマッチがなければ使用されていることになっているメッセージで使用されることを目的としています。

各トップレベルのマジックパターン (レベルの説明については、下記参照) は、使用されるタイプに従ってテキストまたはバイナリとして分類されます。タイプ“regex”と“search”は、印刷不可能な文字がパターンで使用されていないなら、テキストのテストとして分類されます。他のすべてのテストは、バイナリとして分類されます。トップレベルのパターンは、すべてのパターンがテキストパターンであるとき、テキストをテストされると見なされます。そうでなければ、バイナリパターンであると見なされます。ファイルをマッチするとき、バイナリパターンが、最初に試みられます。マッチが見つからず、ファイルがテキストのようであるなら、エンコードが決定され、テキストパターンが、試みられます。

数値タイプは、オプションで値が、任意の比較が行われる前に数値と AND されることを指定する & と数値を続けることができます。タイプに u を前に付け加えることは、符号無しで比較されるべきことを示します。

test
ファイル中の値と比較される値。タイプが数値であるなら、この値は、 C 形式で指定されます。それが文字列あるなら、通常許されるエスケープをつけて (例えば、改行の\n) C 文字列として指定されます。

数値の前に実行される操作を示す文字を付けることができます。それは、ファイル中の値が指定された値と等しくなければならないことを指定する =、ファイル中の値が指定された値より小さくなければならないことを指定する <、ファイル中の値が指定された値より大きくなければならないことを指定する >、ファイル中の値が指定された値に設定されたすべてのビットが設定されていなければならないことを指定する &、ファイル中の値が指定された値に設定された任意のビットが 0 でなければならないことを指定する ^、テストされる前に指定された値を否定する ~ または任意の値とマッチすることを示す x です。文字が省略されているなら、 = であると仮定されます。演算子 &, ^~ は、浮動小数点数と倍精度浮動小数点数では動作しません。演算子 ! は、テストが成功 しない なら、行がマッチすることを指定します。

数値は、C 形式で指定されます。例えば、 13 は、10 進数、 013 は、8 進数そして 0x13 は、16 進数です。

文字列値に関して、ファイル中の文字列は、指定された文字列とマッチしなければなりません。演算子 =, <> は、 ( & を除いて) 文字列に適用することができます。マッチに使用される長さは、マジックファイルの文字列引数の長さです。これは、(すべての空でない文字列が空の文字列より大きいので) 行が、 (通常、文字列を印刷するために使用される) 空でない文字列と >\0 がマッチすることを意味します。

特別なテスト x は、常に真と評価されます。

message
比較が成功するなら、印刷されるメッセージです。文字列に printf(3) 書式仕様が含まれているなら、ファイル中の値は、(指定されたマスクを行って) メッセージを書式文字列として使用して印刷されます。文字列が“\b”で始まるなら、印刷されたメッセージは、それの前に空白類が追加されていない文字列の残りです: 複数のマッチは、通常単一の空白によって分離されます。

APPLE 4+4 文字 APPLE クリエイタとタイプを、次のように指定することができます:

!:apple CREATYPE

MIME タイプは、ファイルのタイプを識別するマジックの行の後に次の空白でないか、またはコメント行でなければならない、別々の行で与えられ、次の形式があります:

!:mime MIMETYPE

すなわち、リテラル文字列“!:mime”は、MIME タイプに続きます。

次の形式を使用して現在のマジックの記述を参照する別々の行でオプションの強さを供給することができます:

!:strength OP VALUE

演算子 OP は、次を指定できます: +, -, *, または /VALUE は、0 から 255 の定数です。この定数は、現在計算されたデフォルトマジックの強さに指定された演算子を使用して適用されています。

いくつかのファイル形式は、ファイルタイプと共に印刷される追加情報を含んでいるか、または真のファイルタイプを決定するために追加のテストを必要とします。これらの追加テストは、オフセットに先行する 1 つ以上の > 文字によって導入されます。行中の > の数は、テストのレベルを示します。始めに > がない行は、レベル 0 であると見なされます。テストは、ツリーのような階層構造で準備されます: レベル n で行のテストが成功するなら、続くすべてのテストは、レベル n+1 で実行され、メッセージは、レベル n (またはそれ以下) がある行が現れるまで、テストが成功するなら印刷されます。より複雑なファイルのために、次の方法で、単に "if/then"効果を得る空のメッセージを使用することができます:

0      string   MZ 
>0x18  leshort  <0x40   MS-DOS executable 
>0x18  leshort  >0x3f   extended PC executable (例えば、MS Windows)

オフセットは、一定である必要はありませんが、調べられるファイルから読み込むこともできます。最後の > に続く最終の文字が ( であるなら、括弧の後の文字列は、間接的なオフセットとして解釈されます。それは、括弧の後の数値がファイル中のオフセットとして使用されることを意味します。そのオフセットの値は、読み込まれて、再びファイル中のオフセットとして使用されます。間接的なオフセットは、次の形式です: (( x [.[bislBISL]][+-][ y ])x の値は、ファイル中のオフセットとして使用されます。バイト、id3 の長さ、short または long は、 [bislBISLm] タイプ指定子に依存するオフセットとして読み込まれます。大文字のタイプは、ビッグエンディアンの値として数値を解釈するのに対して、小文字のバージョンは、リトルエンディアンの値として数値を解釈します。 m タイプは、ミドルエンディアン (PDP-11) の値として数値を解釈します。その数値に、 y の値は、追加して、結果は、ファイル中のオフセットとして使用されます。指定されていないなら、デフォルトタイプは、long です。

そのように、変数長構造体を調べることができます:

# MS Windows 実行形式も有効な MS-DOS 実行形式です 
0           string  MZ 
>0x18       leshort <0x40   MZ executable (MS-DOS) 
# 拡張実行形式でないなら、下記の全体のブロックをスキップします 
>0x18       leshort >0x3f 
>>(0x3c.l)  string  PE\0\0  PE executable (MS-Windows) 
>>(0x3c.l)  string  LX\0\0  LX executable (OS/2)

調査のこの戦略には、1 つの欠点があります: 利用者は、最終的に何かを印刷することを確実にしなければなりません、さもなければ、(上記の例で PE\0\0 も LE\0\0 のないときのように) ユーザは、空の出力を得ることになります。

この間接的なオフセットを直接使用することができないなら、簡単な計算は、次のように使用できます: 括弧内に [+-*/%&|^]number を追加することによって、それがオフセットとして使用される前に、ファイルから読み込まれる値を変更できます:

# MS Windows 実行形式も有効な MS-DOS 実行形式です 
0           string  MZ 
# 時々、0x18 の値は、0x40 より小さいですが、拡張実行形式がまだあり、 
# 単にファイルに追加されます 
>0x18       leshort <0x40 
>>(4.s*512) leshort 0x014c  COFF executable (MS-DOS, DJGPP) 
>>(4.s*512) leshort !0x014c MZ executable (MS-DOS)

長さ、またはフィールドに先行する (間接指定が以前に使用されたときの) 位置に依存しているので、時々、利用者は、正確なオフセットがわかりません。利用者は、オフセットへの接頭辞として、‘&’を使用して最後の上のレベルの終りに相対的なオフセットを指定することができます:

0           string  MZ 
>0x18       leshort >0x3f 
>>(0x3c.l)  string  PE\0\0    PE executable (MS-Windows) 
# PE 署名の直後に続くのは、CPU タイプです 
>>>&0       leshort 0x14c     for Intel 80386 
>>>&0       leshort 0x184     for DEC Alpha

間接的と相対的なオフセットは、結合することができます:

0             string  MZ 
>0x18         leshort <0x40 
>>(4.s*512)   leshort !0x014c MZ executable (MS-DOS) 
# それが COFF でないなら、512 バイト戻り、拡張実行形式の始まりを 
# 見つける別の方法である、バイト 2/3 から取られたオフセットを 
# 追加します 
>>>&(2.s-514) string  LE      LE executable (MS Windows VxD driver)

または、逆に:

0                 string  MZ 
>0x18             leshort >0x3f 
>>(0x3c.l)        string  LE\0\0  LE executable (MS-Windows) 
# LE ヘッダ内のオフセット 0x80 (-4、上の終りの相対的なオフセットの 
# 始めにマッチするので) では、我々は、そこで特有の署名を検索する、 
# コード領域への絶対オフセットを見つけます 
>>>(&0x7c.l+0x26) string  UPX     \b, UPX compressed

または、さらに両方!

0                string  MZ 
>0x18            leshort >0x3f 
>>(0x3c.l)       string  LE\0\0 LE executable (MS-Windows) 
# LE ヘッダ内のオフセット 0x58 では、我々は、特有の署名を検索する、 
# データ領域への相対的なオフセットを見つけます 
>>>&(&0x54.l-3)  string  UNACE  \b, ACE self-extracting archive

最終的に、利用者がファイルの中のオフセット/長さのペアを処理しなければならないなら、もう 1 組の括弧を使用して、ファイル自体から括弧に入れられた式の 2 番目の値さえも取ることができます。この追加された間接的なオフセットは、常に主な間接的なオフセットの始まりに相対的であることに注意してください。

0                 string       MZ 
>0x18             leshort      >0x3f 
>>(0x3c.l)        string       PE\0\0 PE executable (MS-Windows) 
# ".idata"と呼ばれる PE セクションを検索するために ... 
>>>&0xf4          search/0x140 .idata 
# ...そして、スタート+長さから計算されたそれの終わりに goto します; 
# これらは、セクション名の 14 と 10 バイト後に位置しています 
>>>>(&0xe.l+(-4)) string       PK\3\4 \b, ZIP self-extracting archive

関連項目

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

バグ

形式 long, belong, lelong, melong, short, beshort, leshort, date, bedate, medate, ledate, beldate, leldatemeldate は、システムに依存しています。ファイルは、長さが可変であるシステムに由来して認識されるので、たぶん、それらは、バイト数 (2B、4B など) として指定されるべきです。
April 20, 2011 FreeBSD