DBXファイルのフォーマット

このページでは、DbxRescue がどのように DBXファイル および MBXファイル の中身を解析しているかを説明します。

DBXファイルのより詳しい解析結果は、下記サイトを参照してください。(ただし英語)
Outlook Express dbx file format by Arne Schloh http://oedbx.aroh.de/


ファイルのダンプ情報
開始アドレス データ
ファイルヘッダ
0x0000 CF AD 12 FE C5 FD 74 6F 66 E3 D1 11 9A 4E 00 C0
0xFE12ADCF 0x6F74FDC5 固定データ
0x0010 4F A3 09 D4 05 00 00 00 05 00 00 00 18 06 00 00
固定データ 0x00000618
0x0020… その他 9,372 (0x249C) バイト (ヘッダ総合 0x24BC バイト)
ファイル情報
0x24BC… ファイル情報 1,560 (0x0618) バイト
(中略)
メッセージデータ1
0xEAD0 D0 EA 00 00 00 02 00 00 00 02 00 00 E0 EC 00 00
0x0000EAD0 0x00000200 0x00000200 0x0000ECE0
0xEAF0… 512 (0x0200) バイトのテキストデータ
0xECE0 E0 EC 00 00 00 02 00 00 00 02 00 00 F0 EE 00 00
0x0000ECE0 0x00000200 0x00000200 0x0000EEF0
0xECF0… 512 (0x0200) バイトのテキストデータ
0xEEF0 F0 EE 00 00 00 02 00 00 F4 01 00 00 00 00 00 00
0x00EEF0 0x00000200 0x000001F4 0x00000000
0xEF00… 500 (0x01F4) バイトのテキストデータ
0xF0F0 00 00 00 00 00 00 00 00 00 00 00 00
メッセージデータ2
0xF100… 00 F1 00 00 00 02 00 00 00 02 00 00 10 F3 00 00
(後略)
※メッセージデータの開始アドレスやサイズは、あくまで例です。


データの意味
種類 意味 サイズ(バイト)
FileHead DBXであることを示す 0xFE12ADCF  4
FileID メッセージ用であることを示す 0x6F74FDC5  4
InfoSize 続くファイル情報のサイズ ファイル情報のサイズ  4
MsgHead メッセージデータの開始位置 ファイル内のアドレスと同値  4
BodySize テキストデータ全体のサイズ 512 (0x0200)  4
UsedSize テキストデータのサイズ 512 (0x0200) 最後のデータのみ512未満  4
NextAddr 次のヘッダの開始アドレス MsgHead + 528 (0x0210) 最後のデータのみ0  4
TextData テキストデータ 512バイト毎に分割されたメールデータ UsedSize
Padding パディングデータ 0x00 BodySize - UsedSize


DbxRescueの動作
動作フェーズ 簡易モード 詳細モード
  1. ファイルヘッダのチェック
FileHead が 0xFE12ADCF であり、
FileID が 0x6F74FDC5 なら、
ファイル先頭から 0x24BC + InfoSize 分だけスキップする。
チェックは行わない。
  1. メッセージデータの開始位置をスキャン
4バイトずつ移動しながら DWORD を読み、そのデータがアドレスと同値であるところを探す。(MsgHeadのチェック) 1バイトずつ移動しながら DWORD を読み、0x00000200 であるところを探す。(BodySizeのチェック)
見つかったら、そこから4バイトだけ戻る。
  1. メッセージデータが有効かどうかをチェック
メッセージヘッダ16バイトを読み、以下の条件にすべて当てはまるかをチェック。
  • BodySize = 0x00000200 である。
  • UsedSize <= BodySize である。
  • UsedSize = BodySize の時、NextAddr = MsgHead + 0x00000210 である。
  • UsedSize < BodySize の時、NextAddr = 0x00000000 である。
1つでも当てはまらないものがあれば 2. へ。
  1. テキストデータの読み込み
BodySize 分のデータを読み、そのうち UsedSize 分をバッファに追加する。
  1. ファイルの生成
UsedSize = BodySize の場合は、3. へ戻って次のデータを読む。
UsedSize < BodySize の場合は、バッファの内容をファイルに保存し、バッファをクリアしてから 2. へ。