リファレンス

マジックナンバー辞典

拡張子を .png から .txt に変えても、中身がPNGであることは変わりません。 OSの file コマンドやウイルス対策ソフトは、拡張子ではなくファイル先頭の決まったバイト列(マジックナンバー)を見て本当の形式を判定します。 定番形式のシグネチャを、拡張子・MIMEタイプ・16進表記つきで検索できます。

34

画像PNG.png

先頭1バイト(0x89)は7ビット環境での誤転送を検出するため非ASCII、続く"PNG"の後にCR/LF/EOF/LFの4バイトを仕込んでいる。テキストモード転送で改行コードが変換されると壊れる設計なので、これ自体が壊れていないかの検査になる。

89 50 4E 47 0D 0A 1A 0A

"·PNG····"

画像JPEG/JFIF.jpg .jpeg

FF D8がSOI(Start Of Image)マーカー。後続のFF E0(JFIF)かFF E1(Exif)かでメタデータ形式が分かれる。末尾はFF D9(EOI)で閉じる。

FF D8 FF

"···"

画像GIF (GIF89a).gif

バージョン文字列がそのままマジックナンバー。アニメーションと透過色は89aで追加された機能で、87aにはこれらが無い。

47 49 46 38 39 61

"GIF89a"

画像BMP.bmp

Windowsビットマップ。"BM"の2バイトだけで、後ろにファイルサイズ(4バイト)が続く単純な構造。

42 4D

"BM"

画像WebP.webp

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 )を見る必要がある。

画像ICO.ico

Windowsアイコン。3バイト目の"01"が画像種別(アイコン)を示し、カーソル形式(.cur)は"02"になる。

00 00 01 00

画像TIFF (リトルエンディアン).tif .tiff

"II"(Intel)はリトルエンディアン、後述の"MM"(Motorola)はビッグエンディアンを示す。TIFFは1ファイルで両方のバイト順があり得る珍しい形式。

49 49 2A 00

"II*·"

画像TIFF (ビッグエンディアン).tif .tiff

"MM"(Motorola)はビッグエンディアン。同じTIFFでもエンディアンでマジックナンバーの並びが変わる。

4D 4D 00 2A

"MM·*"

アーカイブ/圧縮ZIP.zip

"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を見て初めて形式が分かる。

アーカイブ/圧縮GZIP.gz .tgz

続く1バイトは圧縮方式(08=deflateがほぼ全て)。.tar.gzは中身がtarで外側だけgzip圧縮した二重構造。

1F 8B

アーカイブ/圧縮RAR (v5.0+).rar

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!····"

アーカイブ/圧縮7-Zip.7z

"7z"のASCIIに続き非ASCIIバイトが並ぶ。高圧縮率のLZMA/LZMA2を採用。

37 7A BC AF 27 1C

アーカイブ/圧縮BZIP2.bz2

ブロックソート(BWT)方式。"BZh"の後にブロックサイズを表す数字(1〜9)が1バイト続く。

42 5A 68

"BZh"

アーカイブ/圧縮Zstandard.zst

Meta(旧Facebook)が開発した高速圧縮形式。gzip並みの速度でxz並みの圧縮率を狙う設計で、近年のLinuxディストリのパッケージ圧縮にも採用が広がっている。

28 B5 2F FD

アーカイブ/圧縮XZ.xz

"7zXZ"の文字列を含むが7-Zipとは別形式。LZMA2を使い高圧縮率だが圧縮速度は遅め。

FD 37 7A 58 5A 00

"·7zXZ·"

文書PDF.pdf

"%PDF-"の後にバージョン番号(1.4や1.7など)が続く。末尾には%%EOFという終端マーカーがあり、これも壊れたPDFの検出に使われる。

25 50 44 46 2D

"%PDF-"

文書旧Office形式 (CFBF).doc .xls .ppt .msi

Compound File Binary Format。Word 97-2003やExcel 97-2003、Windowsインストーラ(.msi)も同じコンテナ形式を使う。ファイル内部にミニFATを持つ「ファイルの中のファイルシステム」。

D0 CF 11 E0 A1 B1 1A E1

文書RTF.rtf

中身がテキストベースの制御コードなので、マジックナンバー自体がそのまま人間にも読める先頭文字列になっている。

7B 5C 72 74 66 31

"{\rtf1"

その他SQLite データベース.db .sqlite .sqlite3

16バイトの文字列がそのままヘッダ。ブラウザの履歴DBやモバイルアプリのローカルDBなど、単一ファイルの組み込みDBとして広く使われる。

53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00

"SQLite format 3·"

実行形式ELF.so .o

Linux/Unix系の実行ファイル・共有ライブラリ形式。5バイト目で32/64ビット、6バイト目でエンディアンを示す。

7F 45 4C 46

"·ELF"

実行形式PE (Windows実行形式).exe .dll

MS-DOS時代からの互換ヘッダで、開発者Mark Zbikowskiのイニシャル。実際のPEヘッダ本体へのオフセットをこのDOSヘッダ内に持っており、"MZ"の直後は今も昔ながらのDOSスタブが続く。

4D 5A

"MZ"

実行形式Mach-O (ユニバーサルバイナリ)(拡張子なし)

macOS/iOSで複数アーキテクチャ(Intel/Apple Silicon)向けコードを1ファイルにまとめたファット・バイナリの先頭。

CA FE BA BE

Javaクラスファイルの CA FE BA BE と全く同じバイト列。単体のマジックナンバーだけでは区別できず、後続バイトの構造まで見て判定する必要がある実例。

実行形式Javaクラスファイル.class

javacがコンパイルしたバイトコードファイル。"CAFEBABE"という覚えやすい16進数はSun Microsystemsの開発者による命名で、JVMのバージョン互換性チェックにも使われるマイナーバージョン/メジャーバージョンが直後に続く。

CA FE BA BE

Mach-Oユニバーサルバイナリと同一のマジックナンバー(偶然の衝突)。

実行形式WebAssembly.wasm

"\0asm"の4バイト。続く4バイトでバイナリフォーマットのバージョンを示す。

00 61 73 6D

"·asm"

音声/映像MP3 (ID3v2タグ付き).mp3

ID3v2メタデータタグの開始。タグが無い素のMP3フレームはFF FB(MPEG-1 Layer3)などフレーム同期パターンで始まり、ファイルによってマジックナンバーの有無が変わる珍しい形式。

49 44 33

"ID3"

音声/映像WAV.wav

WebPと同じRIFFコンテナ。8バイト目のタグが"WAVE"であることで音声形式と識別する。

52 49 46 46 .. .. .. .. 57 41 56 45

"RIFF····WAVE"

音声/映像MP4/MOV.mp4 .mov .m4aオフセット 4 バイト目

ISO Base Media File Format系。先頭4バイトはボックスサイズなので可変、オフセット4バイト目から始まる"ftyp"ボックスタグで識別する。マジックナンバーがファイル先頭ではなく4バイト目にある例。

66 74 79 70

"ftyp"

音声/映像FLAC.flac

可逆圧縮音声形式。大文字小文字混じりの"fLaC"がそのままマジックナンバー。

66 4C 61 43

"fLaC"

音声/映像OGG.ogg .oga .ogv

Xiph.Orgのコンテナ形式。中身はVorbis(音声)やTheora(映像)など可変。

4F 67 67 53

"OggS"

その他PCAP (パケットキャプチャ).pcap

tcpdump/Wiresharkのキャプチャファイル。バイト順を保存側と解析側で揃えるため、リトルエンディアン環境ではD4 C3 B2 A1、ビッグエンディアンではA1 B2 C3 D4と逆順になる。

D4 C3 B2 A1

同じ形式なのに保存環境のエンディアンでマジックナンバーの並びが変わる。読み込み側はこれを見てバイト順を自動判定する。

アーカイブ/圧縮TAR.tarオフセット 257 バイト目

オフセット0にマジックナンバーが無い珍しい形式。257バイト目(ヘッダの決まった位置)に"ustar"という文字列があるかどうかで判定し、古いtar実装ではこれすら無い場合がある。

75 73 74 61 72

"ustar"

このリストで唯一ファイル先頭にシグネチャが無い形式。拡張子とヘッダ構造の整合性から判定するしかない。

その他UTF-8 BOM.txt

UTF-8であることを示す任意のマーカー。UTF-8はバイト順に意味が無いのでBOMは技術的には不要だが、Windowsの一部アプリが文字コード判定に使うため今も残っている。

EF BB BF

その他UTF-16 LE BOM.txt

UTF-16リトルエンディアンの先頭マーカー。ビッグエンディアンはFE FFと逆順になり、これが無いと読み込み側はバイト順を推測するしかない。

FF FE

その他シバン (シェルスクリプト).sh

"#!"の後にインタプリタのパス(/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シグネチャを持ちながら末尾に別形式のペイロードを仕込んだポリグロットファイルが存在する。形式の識別と安全性の検証は別問題として扱う。