Opera のキャッシュや cookie を管理するファイル群 dcache4.url, vlink4.dat, download.dat. cookies4.datについての解析.

注意

この文書は,WindowsXPにWindows版の Opera9を インストールしたときの情報に基づいて作成してます.別のOS,別のバージョンの解析状況は追々.

この文書を基にして,Operaにカスタマイズその他の変更を加えて,不具合が発生しても責任は取れません.

突っ込み,感想,その他は,office@ashula.infoまで

説明

ここで言う binary ファイルとは,Opera のキャッシュや cookie を管理するファイル群で具体的には,キャッシュのインデックスファイル( dcache4.url ), 訪問済みリンクのファイル( vlink4.dat ),ダウンロードレスキューファイル ( download.dat ),cookie の管理ファイル( cookies4.dat ) のことです.

「ユーザごとの設定を使う」でインストールすると,通常,%APPDATA%\Opera\%OperaVersion%\profile以下に作られる (%APPDATA%は,通常Documents and Settings\user_name\Application Data.エクスプローラの「ツール→フォルダオプション→表示→全てのファイルとフォルダを表示する」が設定されていないと見ることは出来ない).正確な場所は opera:config#UserPrefs|OperaDirectoryの値を参照のこと.

dcache4.url だけは,そこのcache4フォルダの中に作られる.正確な場所は opera:config#UserPrefs|CacheDirectory4の値を参照のこと.

ここにまとめた情報は主に,Opera File Formatsの公式の解説を基に作られています.ほかの資料は参考文献を参照.

構造

使われる数値は基本的に符号なしのビッグエンディアンで格納される.データレコード内の数値も,ビッグエンディアンだが符号が付くこともある.

データ構造

バイナリファイルでの基本的なデータ構造はレコードと呼ばれる.レコードの構造は以下のようになっている.


struct record
{
  // application specific tag to identify content type
  tag_id_type tag_id;
  // length of payload
  payload_length_type length;
  // Payload/content of the record
  bytepayload[ length ];
};

tag_id_type というのはヘッダのidtag_lengthによって決まる型で,file version が 0x 0000 1000のファイルにおいては,1バイトの符号なし整数値であり,同様にpayload_length_type というのはヘッダのlength_lengthによって決まる型で,file version が 0x 0000 1000のファイルにおいては,2byteの 符号なし整数値となる.

bytepayloadは,tag_idの値によって中身の解釈が変わるレコードのデータそのもので length バイトにわたって続く.

ペイロードにレコードが入ることもある

フラグレコード

レコードには,2種類あって,ひとつは,上に書いたような,ペイロードのあるデータレコードで,もうひとつはフラグレコードと呼ばれ,length が 0 で ペイロードがないレコードである.

フラグレコードかどうかは tag_id の値で決められていて, tag_id の MSBが立っているかどうかでフラグを判断する.MSBが立っているとき,その tag_id が意味するフラグ = true となり,そうでないときは false となる.

ファイル構造

ファイルの先頭は以下の形式になる.


    +——–+——–+——–+——–+
    |   file version number (32bit)     |
    +——–+——–+——–+——–+
    |   app. version number (32bit)     |
    +——–+——–+——–+——–+
    |   idtag_length  |  length_length  |
    +——–+——–+——–+——–+
file version number

ファイル形式のバージョンをあらわす 32bit の値.現行のフォーマットでは 0x 0000 1000. このうち,上位20bitがメジャーバージョン,下位12bitが マイナーバージョンを表す.

古いソフトがファイルをうまく読めなくなるほどに形式が変わったときにはメジャーバージョンが変わる(?).ソフトウェアが読めるメジャーバージョンと違うバージョンなら読んではいけない. Changes in the minor version must not be used if the file format is changed in such a manner that older versions of the software cannot read the file successfully. If the major version number is newer (or older) than the application can read, it must not read the file.

app. version number
扱うファイルやソフトで解釈される値.32bit.
idtag_length
レコードでの tag_id が何バイトで表されるかを示す16bitの値.今のところ 0x0001
length_length
レコードでの長さのフィールドが何バイトで表されるかを示す16bitの値.今のところ0x0002

idtag_lengthlength_lengthなどの整数値のサイズはメジャーバージョンに対して固定とされている.

この96128bitのヘッダの後に,レコードがぞろぞろと書かれることになる.

このフォーマットを採用しているファイル

このフォーマットを採用しているファイルは以下のファイルです.それぞれのファイルでの tag_id の値の意味やレコードの構成などはそれぞれのファイルのページに分けてあります.

更新履歴

  1. 2006/10/12 : 初版
  2. 2007/06/14 : ヘッダのビット数の間違いを修正.(128 bit から 96 bit に)