4 バイトで %PDF を表します。PDF のバージョンが直後に続きます (例: %PDF-1.7)。
マジックナンバーとは何ですか?
マジックナンバーは、すべてのファイルの先頭にある短く固定のバイト列です。拡張子を読む前に形式を識別します。このページでは仕組み、もっとも一般的なシグネチャの形、そしてマジックバイトでの確認がファイル名による確認をいつも上回る理由を取り上げます。
- やさしい解説
- 14 種類の形式を網羅
- データはブラウザの外に出ません
重要なポイント
それは何ですか?
マジックナンバーは、ファイルの先頭にある固定のバイト列 (通常 2 から 8 バイト) で、形式を識別します。
どこにありますか?
ほぼ常にバイトオフセット 0 にあります。ISO 9660 のディスクイメージはよく知られた例外で、
CD001シグネチャはオフセット 32769 (セクタ 16) にあります。拡張子とバイト、どちらが正しい?
バイトが勝ちます。
report.exeをreport.pdfにリネームしてもラベルが変わるだけで、内容は変わりません。マジックバイトは依然として4D 5Aのままです。得られる結果
ファイル形式チェッカーは 4 種類のいずれかの判定 (一致、不一致、曖昧、不明) を返します。それぞれは形式の同一性についての確定的な答えであり、安全性についてではありません。
プライバシー
無料の単一ファイル処理は完全にブラウザ内で動作します。データがデバイスの外に出ることはありません。
安全性の範囲
マジックバイトの確認は形式を識別するものであり、マルウェアを識別するものではありません。最初のシグナルとして使い、ウイルス判定の代わりにはしないでください。
マジックナンバー (マジックバイトシグネチャまたはファイルシグネチャとも呼ばれます) は、ファイルの先頭に書き込まれた短い固定のバイト列で、そのファイルの本当の形式を識別します。OS はファイル拡張子よりも先にこれを参照します。拡張子はあくまでヒントで、マジックナンバーが真実です。
マジックバイトシグネチャのリファレンス
形式仕様から抽出した、広く使われている 14 のシグネチャ。16 進バイトは大文字、スペース区切りです。ASCII プレビューでは印字不可なバイトをドットに置き換えています。
PDF
- マジックバイト (16 進):
25 50 44 46- ASCII:
%PDF- 拡張子:
- MIME タイプ:
application/pdf- オフセット:
- バイト 0
PNG
- マジックバイト (16 進):
89 50 4E 47 0D 0A 1A 0A- ASCII:
.PNG....- 拡張子:
- .png
- MIME タイプ:
image/png- オフセット:
- バイト 0
JPEG
- マジックバイト (16 進):
FF D8 FF- ASCII:
...- 拡張子:
- .jpg, .jpeg
- MIME タイプ:
image/jpeg- オフセット:
- バイト 0
GIF
- マジックバイト (16 進):
47 49 46 38 39 61- ASCII:
GIF89a- 拡張子:
- .gif
- MIME タイプ:
image/gif- オフセット:
- バイト 0
BMP
- マジックバイト (16 進):
42 4D- ASCII:
BM- 拡張子:
- .bmp
- MIME タイプ:
image/bmp- オフセット:
- バイト 0
ZIP
- マジックバイト (16 進):
50 4B 03 04- ASCII:
PK..- 拡張子:
- .zip
- MIME タイプ:
application/zip- オフセット:
- バイト 0
RAR (v5)
- マジックバイト (16 進):
52 61 72 21 1A 07 01 00- ASCII:
Rar!....- 拡張子:
- .rar
- MIME タイプ:
application/vnd.rar- オフセット:
- バイト 0
7-Zip
- マジックバイト (16 進):
37 7A BC AF 27 1C- ASCII:
7z....- 拡張子:
- .7z
- MIME タイプ:
application/x-7z-compressed- オフセット:
- バイト 0
DOCX (Office Open XML)
- マジックバイト (16 進):
50 4B 03 04- ASCII:
PK..- 拡張子:
- .docx
- MIME タイプ:
application/vnd.openxmlformats-officedocument.wordprocessingml.document- オフセット:
- バイト 0
XLSX (Office Open XML)
- マジックバイト (16 進):
50 4B 03 04- ASCII:
PK..- 拡張子:
- .xlsx
- MIME タイプ:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet- オフセット:
- バイト 0
APK (Android package)
- マジックバイト (16 進):
50 4B 03 04- ASCII:
PK..- 拡張子:
- .apk
- MIME タイプ:
application/vnd.android.package-archive- オフセット:
- バイト 0
MP4 (ISO BMFF)
- マジックバイト (16 進):
00 00 00 20 66 74 79 70- ASCII:
....ftyp- 拡張子:
- .mp4, .m4v
- MIME タイプ:
video/mp4- オフセット:
- バイト 0
Windows PE / EXE
- マジックバイト (16 進):
4D 5A- ASCII:
MZ- 拡張子:
- .exe, .dll, .sys
- MIME タイプ:
application/vnd.microsoft.portable-executable- オフセット:
- バイト 0
ISO 9660
- マジックバイト (16 進):
43 44 30 30 31- ASCII:
CD001- 拡張子:
- .iso
- MIME タイプ:
application/x-iso9660-image- オフセット:
- バイト (セクタ 16)
PDF
PNG
8 バイトで、PNG の改行マーカー (
0D 0A 1A 0A) を含み、伝送エラーを検出できます。JPEG
Start of Image マーカー。4 バイト目で JFIF (
E0) と EXIF (E1) を区別します。GIF
GIF89a が現代の派生です。GIF87a (
47 49 46 38 37 61) は古い表記で、これも有効です。BMP
2 バイトです。なりすましが簡単なため、オフセット 2 のファイルサイズヘッダーと組み合わせて判別します。
ZIP
ローカルファイルヘッダー。空のアーカイブは代わりに
50 4B 05 06(中央ディレクトリ末尾) を使います。RAR (v5)
RAR 5 のシグネチャ。古い RAR 1.5 から 4.x のファイルは
00で終わる 7 バイトのシグネチャを使います。7-Zip
6 バイトで
7zと続く 3 つのマジックバイトです。DOCX (Office Open XML)
DOCX は ZIP コンテナです。シグネチャだけでは Word ドキュメントと一般的な ZIP を区別できません。内部の
[Content_Types].xmlを確認してください。XLSX (Office Open XML)
DOCX と同じ注意点があります。スプレッドシートの派生を確認するには OOXML マニフェストを調べてください。
APK (Android package)
APK は中に Android のマニフェストを持つ ZIP コンテナです。ZIP のシグネチャだけでは十分な根拠になりません。
MP4 (ISO BMFF)
オフセット 4 の
ftypボックスがブランド識別子を持ちます。代表的なブランド:isom、mp42、iso5。Windows PE / EXE
2 バイト (Mark Zbikowski による)。PE ヘッダーのオフセットはバイト 0x3C から読み取られ、実際の
PE\0\0マジックはそこに位置します。ISO 9660
ISO 9660 はボリュームディスクリプタをセクタ 16 に置くため、シグネチャはバイト 32769 (16 * 2048 + 1) に存在します。
マジックバイトの確認の仕組み
- 1
先頭のバイトを読む
ファイルをバイナリストリームとして開き、先頭の 8 から 16 バイトを読みます。これだけで上の表にあるすべてのシグネチャを認識できます。
- 2
既知のシグネチャと照合する
バイトを既知の形式のデータベースと照合します。複数の形式が同じプレフィックスを共有することがあるため (すべての Office ドキュメントは ZIP)、もっとも特異な一致を返します。
- 3
ファイル拡張子と照合する
検出された形式が拡張子と一致しなければ判定は不一致。複数の形式に当てはまる場合は曖昧。何にも当てはまらない場合は不明となります。
これが重要な理由は?
invoice.exe を invoice.pdf にリネームしても、バイトは変わりません。先頭の 2 バイトは依然として 4D 5A のままです。マジックナンバーの確認は即座にそれを見抜きます。添付ファイルが本物に見えても、送信前に拡張子が変更されていた場合に役立ちます。
マジックバイトの確認は逆のケースも捉えます。拡張子がまったくないのに有効な PNG バイトを持つファイルは依然として PNG であり、画像ビューアで開けます。形式の同一性はバイトに存在し、ファイル名には存在しません。
用語集
形式ごとの掘り下げ
各スポークは 1 つの形式に絞ったページで、見分け方、よくある不一致のパターン、ワンクリックでの確認方法を紹介します。どこにファイルをドロップしても判定は同じです。
- .pdfPDF
Portable Document Format file
Magic bytes
25 50 44 46これは本当に PDF ですか? - .exeEXE
Windows executable
Magic bytes
4D 5Aこれは本当に EXE ですか? - .zipZIP
compressed archive
Magic bytes
50 4B 03 04これは本当に ZIP ですか? - .docxDOCX
Microsoft Word document
Magic bytes
50 4B 03 04これは本当に DOCX ですか? - .xlsxXLSX
Microsoft Excel spreadsheet
Magic bytes
50 4B 03 04これは本当に XLSX ですか? - .pngPNG
Portable Network Graphics image
Magic bytes
89 50 4E 47 0D 0A 1A 0Aこれは本当に PNG ですか? - .jpgJPG
JPEG photograph
Magic bytes
FF D8 FFこれは本当に JPG ですか? - .mp4MP4
MPEG-4 video
Magic bytes
00 00 00 20 66 74 79 70これは本当に MP4 ですか? - .apkAPK
Android package
Magic bytes
50 4B 03 04これは本当に APK ですか? - .isoISO
optical disc image
Magic bytes
43 44 30 30 31これは本当に ISO ですか?