ByteScope

RAR (4.x) ファイル形式

RAR 1.5〜4.x 形式の RAR アーカイブ。

MIME タイプ
application/x-rar-compressed
拡張子
.rar
カテゴリ
アーカイブ・圧縮

マジックナンバー(ファイル署名)

0x00000000526172211A0700Rar!···'Rar!' RAR4 signature

RAR (4.x) 形式について

RAR 4.x は WinRAR 1.5 から 4.20 が生成していた旧世代の形式で、互換性優先を指定すると今でも書き出されます。ファイル内のすべてがブロックであり、どのブロックも 16 ビット CRC、1 バイトのタイプ、16 ビットのフラグ、16 ビットのサイズという同じ 4 フィールドで始まります。オフセット 0 の 7 バイトマーカーが単なるマジックナンバーではなくブロックそのものなのはこのためです。形式は独自仕様で、展開側は公開されている一方で圧縮側は公開されていません。だからフリーのツールは RAR 4 を読めても書けません。

ヘッダーの構造(バイト単位)

オフセット長さフィールド意味
07Marker block (MARK_HEAD)常に 52 61 72 21 1A 07 00 で、'Rar!' に 1A 07 00 が続きます。裸のマジックナンバーではなく、中身がたまたま定数になっている通常の RAR ブロックです(HEAD_CRC 0x6152、HEAD_TYPE 0x72、HEAD_FLAGS 0x1A21、HEAD_SIZE 0x0007)。RAR5 は最初の 6 バイトをそのまま使って 01 00 を足しただけなので、オフセット 6 のバイトが 2 世代を分ける唯一の違いです。
72Archive header CRC (HEAD_CRC)このブロックの残り全体に対する CRC-32 の下位 16 ビットです。RAR のブロックはすべてこれを持つので、破損があってもアーカイブ全体を諦めずにブロック単位まで絞り込めます。
91Archive header type (HEAD_TYPE)0x73 が MAIN_HEAD、つまりアーカイブ全体のヘッダです。他によく出会うのは 0x74(ファイル)、0x75(コメント)、0x7A(サブブロック)、0x7B(アーカイブ終端マーカー)です。
102Archive header flags (HEAD_FLAGS)リトルエンディアンのビットフィールド。0x0001 = セットの 1 巻、0x0002 = アーカイブコメントを内包、0x0004 = 変更ロック済み、0x0008 = ソリッド、0x0010 = 新しい name.partN.rar 式のボリューム命名、0x0040 = リカバリレコードあり、0x0080 = ブロックヘッダ自体が暗号化済み、0x0100 = 最初のボリューム。
122Archive header size (HEAD_SIZE)既に読んだ 6 バイトを含む、このブロック全体の長さです。素の場合は 0x000D(13 バイト)なので次のブロックはオフセット 20 から始まります。コメントや認証レコードが入るとこれが大きくなり、以降すべてが後ろへずれます。
142RESERVED1予約領域。リリースされたすべてのバージョンがゼロを書きます。歴史的には、ごく初期のビルドでボリューム番号の上位ワードを入れていました。
164RESERVED2予約領域でゼロが入ります。アーカイブヘッダをおなじみの 13 バイトに保つための 4 バイトのパディングです。
202First file header CRC最初の FILE_HEAD ブロックの先頭 — ただし上のアーカイブヘッダが最小の 13 バイトだった場合に限ります。20 を無条件に信じるのではなく、オフセット 12 の HEAD_SIZE を読んで 7 に足してください。以下の行のオフセットもすべて同じ前提の上に乗っています。
221File header type (HEAD_TYPE)0x74。ここが 0x7B ならアーカイブは空です。そのバイトはアーカイブ終端ブロックだからです。
232File header flags0x0001 = 前のボリュームからの続き、0x0002 = 次のボリュームへ続く、0x0004 = パスワード保護、0x0100 = 64 ビットサイズの上位ワードあり、0x0200 = 名前をローカルコードページに加えて UTF-16 でも格納、0x0400 = 名前の後ろに 8 バイトの salt が続く。
252File header size (HEAD_SIZE)このヘッダ全体の長さで、32 バイトの固定フィールドに名前と、あれば salt や拡張タイムスタンプを足したものです。圧縮データはこの直後から始まります。
274PACK_SIZEこのエントリの圧縮後バイト数の下位 32 ビット。4 GiB を超えるファイルは上位ワードを ATTR フィールドの直後に別途持ちますが、これはフラグ 0x0100 が立っているときだけです。
314UNP_SIZE元のバイト数の下位 32 ビットで、4 GiB の抜け道も同じです。ソリッドアーカイブでも、そのエントリ単独では展開できないにもかかわらず、ここには実際の値が記録されます。
351HOST_OSエントリを作成したシステム: 0 = MS-DOS、1 = OS/2、2 = Windows、3 = Unix、4 = Mac OS、5 = BeOS。この値が、後ろにある 4 バイトの属性をどう解釈するかを決めます。
364FILE_CRC非圧縮の中身に対する CRC-32。WinRAR が出す「チェックサムエラー」の正体はこの数値であり、リカバリレコードが修復を狙っている対象でもあります。
404FTIMEMS-DOS のパック形式の日付と時刻です。1980 年起点の年 7 ビット、月 4 ビット、日 5 ビット、続いて時 5 ビット、分 6 ビット、2 秒刻みの秒 5 ビット。タイムゾーンなし、分解能は 2 秒、1980 年より前は表現できません。
441UNP_VER必要な展開側の最小バージョンを 10 倍した値です。20 なら 2.0 のアルゴリズム、29 なら WinRAR 3.x / 4.x が使う 2.9 のもの。今の展開ツールはすべて実装しているので、このバイトが効いてくるのは古いツールがファイルを拒否したときです。
451METHOD0x30 = 無圧縮、0x31 = 最速、0x32 = 高速、0x33 = 標準、0x34 = 高圧縮、0x35 = 最高圧縮。0x30 のエントリはヘッダの後ろがファイルそのものなので、壊れたアーカイブからでも手作業で切り出せます。
462NAME_SIZE固定フィールドの後ろに続く名前のバイト長です。フラグ 0x0200 が立っているときは、この領域にローカルコードページの名前、ゼロバイト、そして同じ名前を圧縮した UTF-16 形式が順に入ります。
484ATTRファイル属性。HOST_OS に従って解釈され、Windows なら DOS の属性ビット、Unix なら Unix の mode ワードです。RAR がフォルダのエントリ(データを一切持たない)を示すのも、ここのディレクトリビットです。
52variableFILE_NAMENAME_SIZE バイトのパス。区切りはスラッシュではなくバックスラッシュです。ドライブレターで始まる名前や .. を含む名前はパストラバーサルの試みなので、まともな展開ツールなら拒否します。

似た形式との見分け方

紛らわしい形式見分け方
RAR52 世代は 6 バイトを共有し、7 バイト目で分かれます。RAR 4 は 7 バイトの 52 61 72 21 1A 07 00、RAR 5 は 8 バイトの 52 61 72 21 1A 07 01 00。どちらも拡張子は .rar で出どころも WinRAR なので、2005 年のツールで開けるアーカイブと開けないアーカイブを分けているのは、オフセット 6 のこのバイトだけです。中身のほうは RAR 5 でブロックレイアウトごと可変長整数に置き換わったため、マーカーより下は何も引き継がれていません。
ZIPバイト単位では紛らわしい点は皆無で、52 61 72 21 対 50 4B 03 04 です。それでも混同され続けるのは、どちらも「圧縮フォルダ」だからでしょう。実務上効くのは構造の違いのほうです。ZIP は末尾にディレクトリを持ち、最後の数百バイトから一覧できます。RAR は先頭からブロックの鎖をたどるので、末尾が切れた RAR は正しく一覧できるのに、ZIP はできません。
7-Zip7-Zip のアーカイブは 37 7A BC AF 27 1C で始まります。ソリッド圧縮も強力な暗号化もどちらの形式にもあり、しかもアプリの 7-Zip は両方を扱うので混乱が始まります。.7z の形式はオープンで誰でも実装できますが、RAR の圧縮はそうではありません。.7z を作れるツールが .rar も作れるとは限らないということです。
Self-extracting RARSFX アーカイブは Windows の実行ファイルの後ろに RAR データをくっつけたものなので、オフセット 0 は 4D 5A('MZ')で、'Rar!' マーカーは数千バイト先に現れます。それでも完全に正当なアーカイブです。まともな展開ツールを向ければ、オフセット 0 にこだわらず前方へマーカーを探しに行きます。

よくある壊れ方

  • マルチボリュームセットの 1 巻が欠けている。各パートはそれ自体が整形式の RAR なので、hex ダンプではマーカーもブロック CRC も綺麗に見えます。それでも展開に失敗するのは、0x0002 フラグの付いたエントリが「そこにないパート」へ続いているからです。見分け方は、オフセット 10 のアーカイブヘッダでビット 0x0001 が立っていて、かつ .partN.rar の番号に抜けがあること。
  • ダウンロードの途中切れ。RAR はオフセット 7 から前方へブロックをたどるので、切れた位置までは普通に展開でき、失敗は最後のエントリだけに現れます。リカバリレコードがある場合(アーカイブヘッダのフラグ 0x0040)、WinRAR は失われた部分を驚くほど復元できます。RAR が ZIP に対して保ち続けている唯一の実質的な優位です。
  • テキストモード転送。ASCII モードの FTP クライアントは圧縮ストリーム内の 0D 0A をすべて書き換えますが、マーカーもオフセットも無傷のままです。だから一覧は完璧に表示され、その後で各エントリがオフセット 36 の FILE_CRC で失敗します。これがパスワード間違いと取り違えられる典型的な症状です。
  • ヘッダ暗号化を破損と勘違いする。-hp を使うとブロックヘッダ自体が暗号化されるため、オフセット 20 から先の hex ダンプはノイズにしか見えず、ファイル名も一切出てきません。本物の破損と区別する手がかりはオフセット 10 のアーカイブヘッダフラグ 0x0080 で、これが立っているアーカイブはまったく無傷です。
  • ブロックヘッダ内の 1 バイト反転。オフセット 25 の HEAD_SIZE が次のブロックの開始位置を示しているため、このフィールドが壊れると 1 エントリが壊れるでは済みません。走査そのものが脱線し、以降のブロックが全部でたらめな位置から読まれます。読み手が迷子になる前にそれを捕まえるのが 16 ビットの HEAD_CRC です。

この形式の現在地

RAR 4 は惰性と、たった 1 つの本物の技術的優位によって延命されているレガシー形式です。比重が大きいのは惰性のほうで、1998 年から 2012 年あたりに出回った大量のリリース、古いバックアップセット、そのほとんどが RAR 4 のマルチボリュームです。そしてそれらが再パックされることはまずありません。優位のほうはリカバリレコードで、光学メディアのビット腐食や不安定な転送をアーカイブが生き延びられる。ZIP にも 7z にも tar.gz にもできない芸当です。それ以外の軸では負けています。7-Zip も Zstandard も圧縮率で上回り、しかもオープンです。RAR の圧縮は依然として独自仕様なので、.rar を吐くビルドパイプラインは 1 社のツールに縛られたことになります。2013 年に RAR 5 が 64 ビットサイズ・より強い暗号化・高速なリカバリレコードを引っさげて置き換え、WinRAR も既定では RAR 5 を書きます。今 RAR 4 を選ぶのは、受け取る側の展開ツールが古いと分かっているときだけです。

RAR (4.x) ファイルをこのサイトで開く

どれもブラウザ内で動きます。ファイルが端末から出ることはありません。

関連する形式

RAR (4.x) と混同しやすい形式です。先頭バイトを見比べてください。

形式先頭バイト拡張子
RAR552 61 72 21 1A 07.rar
7-Zip37 7A BC AF 27 1C.7z
ZIP50 4B 03 04.zip

よくある質問

ファイルのマジックナンバーとは何ですか?

ファイル先頭の数バイトで、名前が何であろうとその形式を示すものです。PNG は必ず 89 50 4E 47 で始まり、ZIP は 50 4B 03 04 で始まります。OS もブラウザも file コマンドも、拡張子を信用せずこのバイト列を読みます。だからファイル名を変えても中身の正体は変わりません。

マジックナンバーを自分で確認する方法は?

macOS や Linux なら xxd -l 16 ファイル名 で先頭 16 バイトが表示されます。Windows なら PowerShell で Format-Hex -Path ファイル名 -Count 16 です。あるいはこのサイトのファイル形式判別ツールにドロップすれば、ローカルでバイト列を読んで形式を教えてくれます。アップロードはありません。

2 つの形式が同じマジックナンバーを持つのはなぜ?

一方が他方の上に作られているからです。docx、xlsx、pptx、apk、jar、epub はすべて中身が ZIP アーカイブなので ZIP の署名で始まり、区別するには内部のエントリを見る必要があります。Java の class ファイルと macOS のユニバーサルバイナリはどちらも CA FE BA BE で始まり、直後のフィールドで見分けます。

マジックナンバーがまったくないファイルもある?

あります。XML、HTML、JSON、SVG、CSV といったテキストベースの形式には固定のバイト署名がないため、構造から判別します。先頭の <?xml 宣言、<svg 要素、あるいは { に続く引用符付きのキーなどです。これは確定ではなく推測なので、このリファレンスではそうした形式をプローブ判別として示しています。

マジックナンバーが一致すればそのファイルは安全?

いいえ。わかるのは形式であって、中身が無害かどうかではありません。正規の PDF や docx でも悪意のあるペイロードを含んでいることがあります。特に拡張子とバイト列が食い違うときに真の形式を知るのは有用な第一段階ですが、マルウェアスキャンではありません。

RAR (4.x) かもしれないファイルをお持ちですか?ファイル形式判別ツールで調べる — マジックナンバーをローカルで読み取ります。アップロードは一切ありません。またはすべての形式を見る。