ちょっと内容が濃ゆいので、一回じゃ収まらない。記事を分割して書き込む。
ほとんど憶えてないが、昔の旧MacOSでは一時期MicrosoftからInternet Explorerが提供されていた。このブラウザの機能には、Webアーカイブを保存する機能がある。このWebアーカイブは、SafariにあるWebアーカイブとは全く違う形式で、しかもWindows版Internet ExplorerのWebアーカイブとも互換性の無い形式である。
Windows版Internet ExplorerのWebアーカイブは、MHTと呼ばれるメール添付ファイルをベースにした形式らしい。一応、Mac版も似た形式でこちらはWAFとも呼ばれている。
実は、Mac版Internet ExplorerのWebアーカイブは非常に強力な機能で、リンクのジャンプ数を設定してURLからサイト全体を保存出来たりする。あまりに便利だったので、大量にこのWebアーカイブのファイルが作成されているが、すでに現行のOSX上では動作しないので見る事が出来ない。
しょうがない。しょうがない。しょうがない。自力でハックして見られるようにしよう。まずは、ファイル形式の解読から。
Webアーカイブのファイル仕様解説
WAFのファイル判別は、ファイル内容の先頭4バイト(つまりマジックナンバー)が「.WAF」になっている。また、クリエイターは「MSIE」で、ファイルタイプは「WAFF」となっている。
ターミナルからmdfindで検索するなら、以下のように打つと良い。
mdfind "kMDItemFSTypeCode == 0x57414646"
ファイル内容は、基本的に「ID」と「Size」と「Data」の項目を一組のレコードとして、それを連続的に並べています。
IDはDataの種別を示し、SizeはDataのサイズ、Dataは項目内容そのものでテキストやバイナリなど。
IDは4文字、Sizeは4バイトの整数型、Dataは可変サイズで型はIDに依存します。
ファイルの先頭はヘッダー(ID,Size,Data)があり、IDは、「.WAF」です。SizeはIDとSize,Dataを含んだものになり注意が必要。
以降はアーカイブしたファイル情報(複数のレコードで構成される)が連続しています。
ざっくり説明すると、以下のようになります。
Web Archive File = Header + Archived File × n
Header = ID+Size+Data (※Sizeの内容はIDとSizeとDataの各サイズを合算)
Archived File = Record × n
Record = ID+Size+Data (※Sizeの内容はDataのサイズ)
アーカイブしたファイル情報の第1エントリは、構成する複数レコードのIDが「ntry」、「url 」、「mime」、「data」等になっています。
ntryは、次のファイル情報への相対ロケーションを持ちます。
urlは、アーカイブしたファイルのurlです。例)http://hoge.com/hage.htm
mimeは、dataのmimeタイプです。例)text/html
dataは、アーカイブしたファイル内容です。dataのSizeは、必ず0になっているようで、次のレコードを辿るには、ntryの情報が必要です。
第2エントリ以降は、IDが「post」で始まります。その後ろに規則性を無視してオールXの文字列が128(80h)バイトだけなぜか存在します。
IDが「cate」が追加されます。
cateは、前のファイル情報への相対ロケーションを持ちます。
最終エントリは、ファイル情報ではなく、IDが「cat 」のレコードが存在します。また、ntryのレコードがありません。
各エントリのインデックスの様ですが解析してません。
その他、なぞのIDとそのdata内容
bsrl 例)http://hoge.com/hage.htm
hntt 例)"48697-1f30-3d390e91”
aux 例)http://hoge.com/hage.htm
またまた、ざっくり説明すると、アーカイブ内のレコード構成は以下のようになります。
First Archived File = ntry + url + mime + data + etc
Middle Archived File = post + XXXX + ntry + url + mime + data + etc + cate
Last Archived File = post + XXXX + etc + cate + cat
たぶん続く。
参考サイト
マジックナンバー (フォーマット識別子) - Wikipedia