リファレンス
マジックナンバー辞典
拡張子を .png から .txt に変えても、中身がPNGであることは変わりません。 OSの file コマンドやウイルス対策ソフトは、拡張子ではなくファイル先頭の決まったバイト列(マジックナンバー)を見て本当の形式を判定します。 定番形式のシグネチャを、拡張子・MIMEタイプ・16進表記つきで検索できます。
34 件
先頭1バイト(0x89)は7ビット環境での誤転送を検出するため非ASCII、続く"PNG"の後にCR/LF/EOF/LFの4バイトを仕込んでいる。テキストモード転送で改行コードが変換されると壊れる設計なので、これ自体が壊れていないかの検査になる。
89 50 4E 47 0D 0A 1A 0A
"·PNG····"
FF D8がSOI(Start Of Image)マーカー。後続のFF E0(JFIF)かFF E1(Exif)かでメタデータ形式が分かれる。末尾はFF D9(EOI)で閉じる。
FF D8 FF
"···"
バージョン文字列がそのままマジックナンバー。アニメーションと透過色は89aで追加された機能で、87aにはこれらが無い。
47 49 46 38 39 61
"GIF89a"
Windowsビットマップ。"BM"の2バイトだけで、後ろにファイルサイズ(4バイト)が続く単純な構造。
42 4D
"BM"
RIFFコンテナ形式(WAV・AVIと同じ枠組み)。先頭"RIFF"の次の4バイトはファイルサイズなので可変、8バイト目以降の"WEBP"で中身を識別する。
52 49 46 46 .. .. .. .. 57 45 42 50
"RIFF····WEBP"
RIFF系はWAV/AVI/WEBPで先頭4バイトが共通。形式の識別は8バイト目のタグ名(WEBP/WAVE/AVI )を見る必要がある。
Windowsアイコン。3バイト目の"01"が画像種別(アイコン)を示し、カーソル形式(.cur)は"02"になる。
00 00 01 00
"II"(Intel)はリトルエンディアン、後述の"MM"(Motorola)はビッグエンディアンを示す。TIFFは1ファイルで両方のバイト順があり得る珍しい形式。
49 49 2A 00
"II*·"
"MM"(Motorola)はビッグエンディアン。同じTIFFでもエンディアンでマジックナンバーの並びが変わる。
4D 4D 00 2A
"MM·*"
"PK"はZIP規格の作者Phil Katzのイニシャル。ローカルファイルヘッダの開始を示す。空のZIPは50 4B 05 06、分割アーカイブは50 4B 07 08になる。
50 4B 03 04
"PK··"
docx/xlsx/pptx/jar/apk/epubは中身がZIPそのもの。マジックナンバーだけでは区別できず、中の[Content_Types].xmlやMETA-INF/MANIFEST.MFを見て初めて形式が分かる。
続く1バイトは圧縮方式(08=deflateがほぼ全て)。.tar.gzは中身がtarで外側だけgzip圧縮した二重構造。
1F 8B
RAR5形式。v1.5〜4.0は末尾が01 00ではなく00で終わる7バイト(52 61 72 21 1A 07 00)。バージョンでマジックナンバーの長さ自体が違う。
52 61 72 21 1A 07 01 00
"Rar!····"
"7z"のASCIIに続き非ASCIIバイトが並ぶ。高圧縮率のLZMA/LZMA2を採用。
37 7A BC AF 27 1C
ブロックソート(BWT)方式。"BZh"の後にブロックサイズを表す数字(1〜9)が1バイト続く。
42 5A 68
"BZh"
Meta(旧Facebook)が開発した高速圧縮形式。gzip並みの速度でxz並みの圧縮率を狙う設計で、近年のLinuxディストリのパッケージ圧縮にも採用が広がっている。
28 B5 2F FD
"7zXZ"の文字列を含むが7-Zipとは別形式。LZMA2を使い高圧縮率だが圧縮速度は遅め。
FD 37 7A 58 5A 00
"·7zXZ·"
"%PDF-"の後にバージョン番号(1.4や1.7など)が続く。末尾には%%EOFという終端マーカーがあり、これも壊れたPDFの検出に使われる。
25 50 44 46 2D
"%PDF-"
Compound File Binary Format。Word 97-2003やExcel 97-2003、Windowsインストーラ(.msi)も同じコンテナ形式を使う。ファイル内部にミニFATを持つ「ファイルの中のファイルシステム」。
D0 CF 11 E0 A1 B1 1A E1
中身がテキストベースの制御コードなので、マジックナンバー自体がそのまま人間にも読める先頭文字列になっている。
7B 5C 72 74 66 31
"{\rtf1"
16バイトの文字列がそのままヘッダ。ブラウザの履歴DBやモバイルアプリのローカルDBなど、単一ファイルの組み込みDBとして広く使われる。
53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00
"SQLite format 3·"
Linux/Unix系の実行ファイル・共有ライブラリ形式。5バイト目で32/64ビット、6バイト目でエンディアンを示す。
7F 45 4C 46
"·ELF"
MS-DOS時代からの互換ヘッダで、開発者Mark Zbikowskiのイニシャル。実際のPEヘッダ本体へのオフセットをこのDOSヘッダ内に持っており、"MZ"の直後は今も昔ながらのDOSスタブが続く。
4D 5A
"MZ"
macOS/iOSで複数アーキテクチャ(Intel/Apple Silicon)向けコードを1ファイルにまとめたファット・バイナリの先頭。
CA FE BA BE
Javaクラスファイルの CA FE BA BE と全く同じバイト列。単体のマジックナンバーだけでは区別できず、後続バイトの構造まで見て判定する必要がある実例。
javacがコンパイルしたバイトコードファイル。"CAFEBABE"という覚えやすい16進数はSun Microsystemsの開発者による命名で、JVMのバージョン互換性チェックにも使われるマイナーバージョン/メジャーバージョンが直後に続く。
CA FE BA BE
Mach-Oユニバーサルバイナリと同一のマジックナンバー(偶然の衝突)。
"\0asm"の4バイト。続く4バイトでバイナリフォーマットのバージョンを示す。
00 61 73 6D
"·asm"
ID3v2メタデータタグの開始。タグが無い素のMP3フレームはFF FB(MPEG-1 Layer3)などフレーム同期パターンで始まり、ファイルによってマジックナンバーの有無が変わる珍しい形式。
49 44 33
"ID3"
WebPと同じRIFFコンテナ。8バイト目のタグが"WAVE"であることで音声形式と識別する。
52 49 46 46 .. .. .. .. 57 41 56 45
"RIFF····WAVE"
ISO Base Media File Format系。先頭4バイトはボックスサイズなので可変、オフセット4バイト目から始まる"ftyp"ボックスタグで識別する。マジックナンバーがファイル先頭ではなく4バイト目にある例。
66 74 79 70
"ftyp"
可逆圧縮音声形式。大文字小文字混じりの"fLaC"がそのままマジックナンバー。
66 4C 61 43
"fLaC"
Xiph.Orgのコンテナ形式。中身はVorbis(音声)やTheora(映像)など可変。
4F 67 67 53
"OggS"
tcpdump/Wiresharkのキャプチャファイル。バイト順を保存側と解析側で揃えるため、リトルエンディアン環境ではD4 C3 B2 A1、ビッグエンディアンではA1 B2 C3 D4と逆順になる。
D4 C3 B2 A1
同じ形式なのに保存環境のエンディアンでマジックナンバーの並びが変わる。読み込み側はこれを見てバイト順を自動判定する。
オフセット0にマジックナンバーが無い珍しい形式。257バイト目(ヘッダの決まった位置)に"ustar"という文字列があるかどうかで判定し、古いtar実装ではこれすら無い場合がある。
75 73 74 61 72
"ustar"
このリストで唯一ファイル先頭にシグネチャが無い形式。拡張子とヘッダ構造の整合性から判定するしかない。
UTF-8であることを示す任意のマーカー。UTF-8はバイト順に意味が無いのでBOMは技術的には不要だが、Windowsの一部アプリが文字コード判定に使うため今も残っている。
EF BB BF
UTF-16リトルエンディアンの先頭マーカー。ビッグエンディアンはFE FFと逆順になり、これが無いと読み込み側はバイト順を推測するしかない。
FF FE
"#!"の後にインタプリタのパス(/bin/bash等)が続く。OSのローダーはこれを見て実行時にどのインタプリタへ渡すかを決める、実行ファイルとしての合図。
23 21
"#!"
検索する前に押さえておきたい3つ
- マジックナンバーは形式ごとに一意とは限らない:docx・xlsx・jar・apkは中身がすべてZIP。JavaクラスファイルとMach-Oファット・バイナリは
CA FE BA BEという同じ4バイトを偶然共有しており、区別には後続バイトの構造まで見る必要がある。 - 先頭とは限らない:MP4/MOVは4バイト目から、TARに至っては257バイト目にしかシグネチャが無い(それすら省略される実装もある)。「ファイル先頭を見ればいい」という前提自体が崩れる例。
- ファイルアップロードの検証は拡張子だけでもマジックナンバーだけでも不十分:正しいPNGシグネチャを持ちながら末尾に別形式のペイロードを仕込んだポリグロットファイルが存在する。形式の識別と安全性の検証は別問題として扱う。