本文へスキップ
BouseMuttonBouseMutton

マジックナンバーとは何ですか?

マジックナンバーは、すべてのファイルの先頭にある短く固定のバイト列です。拡張子を読む前に形式を識別します。このページでは仕組み、もっとも一般的なシグネチャの形、そしてマジックバイトでの確認がファイル名による確認をいつも上回る理由を取り上げます。

  • やさしい解説
  • 14 種類の形式を網羅
  • データはブラウザの外に出ません

重要なポイント

  • それは何ですか?

    マジックナンバーは、ファイルの先頭にある固定のバイト列 (通常 2 から 8 バイト) で、形式を識別します。

  • どこにありますか?

    ほぼ常にバイトオフセット 0 にあります。ISO 9660 のディスクイメージはよく知られた例外で、CD001 シグネチャはオフセット 32769 (セクタ 16) にあります。

  • 拡張子とバイト、どちらが正しい?

    バイトが勝ちます。report.exereport.pdf にリネームしてもラベルが変わるだけで、内容は変わりません。マジックバイトは依然として 4D 5A のままです。

  • 得られる結果

    ファイル形式チェッカーは 4 種類のいずれかの判定 (一致、不一致、曖昧、不明) を返します。それぞれは形式の同一性についての確定的な答えであり、安全性についてではありません。

  • プライバシー

    無料の単一ファイル処理は完全にブラウザ内で動作します。データがデバイスの外に出ることはありません。

  • 安全性の範囲

    マジックバイトの確認は形式を識別するものであり、マルウェアを識別するものではありません。最初のシグナルとして使い、ウイルス判定の代わりにはしないでください。

マジックナンバー (マジックバイトシグネチャまたはファイルシグネチャとも呼ばれます) は、ファイルの先頭に書き込まれた短い固定のバイト列で、そのファイルの本当の形式を識別します。OS はファイル拡張子よりも先にこれを参照します。拡張子はあくまでヒントで、マジックナンバーが真実です。

マジックバイトシグネチャのリファレンス

形式仕様から抽出した、広く使われている 14 のシグネチャ。16 進バイトは大文字、スペース区切りです。ASCII プレビューでは印字不可なバイトをドットに置き換えています。

  • PDF

    マジックバイト (16 進):
    25 50 44 46
    ASCII:
    %PDF
    拡張子:
    .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

    4 バイトで %PDF を表します。PDF のバージョンが直後に続きます (例: %PDF-1.7)。

  • 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 ボックスがブランド識別子を持ちます。代表的なブランド: isommp42iso5

  • Windows PE / EXE

    2 バイト (Mark Zbikowski による)。PE ヘッダーのオフセットはバイト 0x3C から読み取られ、実際の PE\0\0 マジックはそこに位置します。

  • ISO 9660

    ISO 9660 はボリュームディスクリプタをセクタ 16 に置くため、シグネチャはバイト 32769 (16 * 2048 + 1) に存在します。

マジックバイトの確認の仕組み

  1. 1

    先頭のバイトを読む

    ファイルをバイナリストリームとして開き、先頭の 8 から 16 バイトを読みます。これだけで上の表にあるすべてのシグネチャを認識できます。

  2. 2

    既知のシグネチャと照合する

    バイトを既知の形式のデータベースと照合します。複数の形式が同じプレフィックスを共有することがあるため (すべての Office ドキュメントは ZIP)、もっとも特異な一致を返します。

  3. 3

    ファイル拡張子と照合する

    検出された形式が拡張子と一致しなければ判定は不一致。複数の形式に当てはまる場合は曖昧。何にも当てはまらない場合は不明となります。

これが重要な理由は?

invoice.exeinvoice.pdf にリネームしても、バイトは変わりません。先頭の 2 バイトは依然として 4D 5A のままです。マジックナンバーの確認は即座にそれを見抜きます。添付ファイルが本物に見えても、送信前に拡張子が変更されていた場合に役立ちます。

マジックバイトの確認は逆のケースも捉えます。拡張子がまったくないのに有効な PNG バイトを持つファイルは依然として PNG であり、画像ビューアで開けます。形式の同一性はバイトに存在し、ファイル名には存在しません。

用語集

よくある質問

あなたのファイルで試してみる

どんなファイルでもドロップしてください。確認はローカルで実行され、1 秒以内に判定を返します。データがブラウザの外に出ることはありません。

ファイル形式チェッカーを開く