Programmieren mit C++

Allgemeines

Internationalisierung von Anwendungen

Outlook Express Reader

Kann man auf die Mailboxdateien von Outlook mit normalen Mitteln zugreifen, ohne dass man auf die Services von Outlook angewiesen ist und somit Outlook fernsteuern muss?

Frage

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.

Lösung

typedef struct {
    FILE *  fptrMBX;
    FILE *  fptrIDX;
    IDX_HDR IdxHdr;
    MBX_HDR MbxHdr;
    MAILMSG * pMsgs;
} MAILBOX, *LPMAILBOX;

Struktur MAILBOX

 BOOL OpenFile(LPCSTR szFileName);

Die Methode OpenFile() öffnet die Mailbox mit dem Namen szFileName über die private Methode OpenMailBox(). Der Zeiger auf die Mailbox wird im Member m_pMailbox abgelegt. Als Ergebnis returniert die Funktion TRUE, wenn der Aufruf erfolgreich war, ansonsten FALSE.

Methode OpenFile

 void Close();

Close() schließt eine zuvor via OpenFile() geöffnete Mailbox und gibt die intern allokierten Strukturen wieder frei.

Methode Close

inline const BOOL IsOpen()
inline const BOOL IsClosed()

Die Methoden IsOpen() und IsClosed() returnieren TRUE, wenn die Mailbox geöffnet bzw. geschlossen ist.

Methode IsOpen, IsClosed

inline const LPMAILBOX GetMailbox()
inline BOOL GetMailbox(LPMAILBOX lpMailbox);

Mittels GetMailbox erhält der Aufrufer einen Zeiger auf die MAILBOX-Struktur der Klasse. Der Zeiger wird wahlweise als Funktionsergebnis oder im Parameter lpMailbox geliefert, wobei die zweite Variante den Erfolg des Aufrufs als Ergebnis der Funktion returniert.

Methode GetMailbox

 inline const int GetMessageCount()

GetMessageCount() liefert die Anzahl der Nachrichten.

Methode GetMessageCount

const LPMAILMSG GetMessageAt(int nIndex);
BOOL GetMessageAt(int nIndex, 
                  LPMAILMSG lpMsg);

Die Methode GetMessageCount() returniert die Nachricht des Eintrags nIndex, wobei die Message wahlweise als Funktionsergebnis oder im Parameter lpMsg geliefert werden kann. Die zweite Variante returniert den Erfolg des Aufrufs als Funktionsergebnis.

Methode GetMessageAt





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:52:35 von textarchiv.alojado.de