|
Das Format der IDX- und MBX-Dateien ist offiziell nicht dokumentiert. Trotzdem sind natürlich die wesentlichen Teile der Dateiformate und der verwendeten Strukturen inzwischen bekannt, sodass ein direkter, auslesender Zugriff auf die Dateien möglich wird. Mithilfe der nachfolgenden Strukturerläuterungen sowie der beiliegenden Klasse, die alle grundlegenden Zugriffe implementiert, lassen sich Outlook Express (IE4) Dateien lesen und Informationen wie Foldernamen sowie Nachrichtenköpfe und -rümpfe ermitteln, auch wenn nicht alle Felder der Strukturen bekannt sind.
Einige Member der Strukturen tragen den Namen pad oder flags. Bei diesen handelt es sich um Felder, deren Sinn nicht bekannt ist, die aber offensichtlich nur von interner Bedeutung sind, z.B. für das Löschen von Nachrichten oder das Packen der Dateien. Für alle Daten gilt, dass sie byteweise gepackt sind.
IDX Dateiformat
Die IDX-Datei enthält diverse Zeiger in die MBX-Datei, in der die tatsächlichen Nachrichten gespeichert sind. Zusätzlich speichert die IDX-Datei Informationen, die aus der Nachrichtendatei extrahiert wurden, sodass nicht bei jedem Öffnen eines Mail-Folders die für die Anzeige benötigten Informationen neu in der MBX-Datei ermittelt werden müssen.
Am Anfang der IDX-Datei steht ein Magic-Name zur Verifizierung des Dateiformats sowie eine Versionsnummer.
{ // Struktur IDX_HDR
DWORD Magic; // JMF9 (IDX)
DWORD Version; // (Format)Versionsnummer
Es folgen die Anzahl der Einträge in der IDX-Datei, die der Anzahl der Nachrichten in der MBX-Datei entsprechen, sowie die Größe der IDX-Datei in Bytes.
DWORD nItems; // Anzahl der Einträge
DWORD nBytes; // Größe der IDX Datei
Auf diese Werte folgen vier Felder unbekannter Bedeutung.
DWORD Unk1;
DWORD Unk2;
BYTE Pad[40];
BYTE Pad2[16];
Nach diesen einleitenden Werten, die nur einmal in der IDX-Datei vorkommen, folgen nun nItems-Strukturen zur Beschreibung der nItems-Nachrichten.
nItems * { // IDX_MSG_HDR
DWORD Flags; // unbekannte Flags
DWORD Unk1; // offenbar immer Null
DWORD EntryNum; // Indexnummer
DWORD FilePos; // Position vom Dateianfang zum Start
dieses Messageheaders
DWORD nBytes; // Anzahl der Bytes dieses Indexeintrags
DWORD MBXOffset; // Offset der Nachrichtendaten in MBX-Datei
DWORD MBXSize; // Summe der Bytes aus Header und Nachricht
im MBX-File
BYTE Pad5[6]; // unbekannte Verwendung
WORD Attach; // Flags im Zusammenhang mit Attachments??
BYTE Pad1[4]; // unbekannte Nutzung
WORD Pad2; // unbekannte Nutzung
DWORD MsgSize; // Gesamtlänge der Daten der Message
Die gesamte Anzahl der Bytes des nächsten Attachmentabschnitts in dieser Datei ergibt sich logisch anhand der Formel (nSeparators * sizeof(IDX_PART) + Padding) und steht im Feld
DWORD nAttachBytes;
Es folgt wieder ein Bereich unbekannten Inhalts.
BYTE Pad3[48];
Die Anzahl der MIME oder (UUENCODE) Attachments + 1 steht im Feld
DWORD nSeparators;
Da der Eingangstext einer Nachricht mit Attachments ebenfalls als Attachment gezählt wird, liefert nSeparators die Anzahl der Attachments + 1.
Die Verwendung der nachfolgenden Elemente ist wiederum unbekannt.
BYTE Pad4[12]; // Unbekannte Nutzung
DWORD Flag1; // unbekannte Nutzung
DWORD Flag2; // Unbekannte Nutzung
Der Offset auf die tatsächlichen Nachrichtendaten nach Überspringen des Internet-Headers steht in:
DWORD Offset;
DWORD Pad[15];
Für jedes Attachment folgt nun eine Beschreibung des entsprechenden Parts.
nSeparators * { // Struktur IDX_PART
DWORD Pad[7];
Die nächsten Felder liefern die Offsets in die MBX-Datei. Für einen absoluten Dateioffset müssen die Offsets wie folgt addiert werden:
DataStart + MBXOffset + MBX_MSG_HDR_LEN
Hierbei ist MBX_MSG_HDR_LEN die Länge des kleinen Headers vor jeder Nachricht in der MBX-Datei. Sie entspricht 0x10 Bytes.
Das Feld DataStart bezeichnet den Offset auf die Daten dieses Teils eines mehrteiligen MIME-Dokuments, während DataEnd auf das Ende der Daten verweist.
DWORD DataStart;
DWORD DataEnd;
Den Start des Internet-Headers für diesen Teil der mehrteiligen MIME- oder UUENCODED-Nachricht dieses Abschnitts (z.B. den MIME Contenttyp etc. oder die UUENCODE Startzeile) steht in:
DWORD HeaderStart;
Die Verwendung der beiden nächsten Felder ist unbekannt. Sie könnten ein Flag und einen Indexwert enthalten.
DWORD Pad1; // unbekannte Nutzung
DWORD Idx; // unbekannte Nutzung
Das Feld BoundaryOffset zeigt auf den Offset der Multipart Begrenzungszeile. UUENCODED Messages entspricht dem Headerstart, da der Header die Begrenzung repräsentiert.
DWORD BoundaryOffset;
Die verbleibenden 10 Bytes dieser Struktur scheinen immer Null zu sein.
DWORD Pad2[10]; // immer Null ??} // Struktur IDX_PART
Es folgt nun die Länge dieser Struktur plus der Gesamtlänge der nachfolgenden Strings.
1 * { // IDX_MSG_INFO
DWORD DataSize;
Das nachfolgende DWORD ist immer Null.
DWORD Pad6; // unbekannte Verwendung; eventuell 64 Bit DataSize
Die Sende- und Empfangszeiten liegen als Win32 FILETIME Struktur mit 8 Bytes vor.
FILETIME Received; // Empfangszeitpunkt
FILETIME Sent; // Absendezeitpunkt
Den Abschluss bildet die spezifizierte Priorität des Internet-Headers.
WORD Priority;} // IDX_MSG_INFO
Auf diese allgemeine Messageinfo folgen sieben Strings variabler Länge mit den nachfolgenden Inhalten.
- Subject
- Sender
- POPServer
- Username
- MailAccount
- POP3 Login Name
- Account Beschreibung
Die Strings liegen immer in dieser Reihe vor, sodass keine weitere Kennzeichnung nötig ist. Strings werden durch die Angabe der Länge gefolgt von den Datenbytes repräsentiert.
7 * {
WORD Length;
Length * { // IDX_STRING
BYTE Data;
} // IDX_STRING
} // nItems * { IDX_MSG_HDR }
} // IDX-File
Auf die nItems-Einträge folgen keine weiteren Daten.
MBX Dateiformat
Die MBX Datei speichert die tatsächlichen Nachrichtendaten, die vom POP3 Server erhalten wurden. Am Anfang der Datei steht ein allgemeiner Dateiheader.
{ // MBX_HDR
DWORD Magic; // „Magischer“ Wert JMF6
DWORD Version; // Dateiversion ? 03000101 ?
DWORD nMsgs; // Anzahl der Nachrichten einschließlich
der zur Löschung markierten
DWORD LastUsedMsgNum; // Nummer des letzten benutzten Eintrags
DWORD nBytes; // Größe der MBX-Datei in Bytes
BYTE Pad[64]; // unbekannte Verwendung
Diesem Dateiheader folgen die Nachrichten, die jeweils einen eigenen kleinen Header besitzen.
nMsgs * { // MBX_MSG_HDR
DWORD Magic; // „Magischer“ Wert 0x7F007F00
DWORD Idx; // Index in die MBX-Datei
DWORD TotalLen; // Gesamtlänge dieses Eintrags
DWORD MsgLen; // Gesamtlänge aller Messagedaten
Auf diesen privaten Nachrichtenheader folgen die Daten in der Form, wie sie vom POP3 Server empfangen wurden.
TotalLen * {
BYTE Data
} // TotalLen * { Data }
} // MBX_MSG_HDR
} // MDX-File
Klasse COE4Reader
Die Klasse COE4Reader implementiert grundlegende Funktionen auf Outlook IDX-/MBX-Dateien. Zur Verwaltung dieser Dateien sowie der Dateiheader und der Messages definiert die Bibliothek die Struktur MAILBOX.
|