winmail.dat und dd

Zu Weihnachten erhält man ja manchmal E-Mails mit Weihnachtsgrüßen. Soll vorkommen sowas. Dieses Jahr hab ich aber eine technisch gesehen interessante Mail erhalten. Neben dem eigentlichen Text gabs einen Anhang mit dem Namen „winmail.dat“.

Im Text wird ein „Weihnachtsbrief“ als Anhang erwähnt. Dem Absender konnte ich vertrauen und der Text war auch erkennbar kein Produkt irgendeiner Malware. Also sollte es möglich sein, den „Weihnachtsbrief“ irgendwie lesbar zu machen.

Der Header des Mime-Parts bescheinigte mir für den mysteriösen Anhang Content-Type: application/ms-tnef;. OK, also irgend ein Microsoft-Kram. Ein Blick in den Mail-Header offenbarte auch X-Mailer: Microsoft Office Outlook 11. Also war schonmal klar: Es handelt sich hier im irgend eine proprietäre Verschlimmbesserung des Standards durch Outlook.

Die Wikipedia hat sogar ein paar Infos dazu. Klingt ja sehr spaßig. Warum kann sich MS eigentlich nicht einfach mal an die bestehenden Standards halten? Nun gut.

Die Wikipedia behauptet „Es gibt für diverse Betriebssysteme Hilfsprogramme, um solche Dateien in ein lesbares Format zu extrahieren und zu speichern.“ Aber aus dem Stehgreif kannte ich so eine Software natürlich nicht. Mittlerweile sehe ich, dass die englische Wikipedia solche Programme auflistet.

Aber einerseits hatte ich nicht vor, extra für diese Mail ein Programm zu installieren und andererseits hab ich ehrlich gesagt den Wikipedia-Artikel erst später gelesen. Letztendlich war es nämlich gar nicht so schwer, den eigentlichen Anhang heraus zu operieren.

Ein kurzer Blick in den Hex-Editor zeigt augenscheinlich ein paar Meta-Daten, Dateiname, Absenderadresse, HTML-Fragmente, Teile des Textes der Mail, … oh und irgendwo steht auch etwas von „Microsoft Word-Document“.

Jetzt kennen wir also schonmal das Dateiformat. Unter der Annahme, dass der enthaltene Anhang nicht komprimiert oder sonstwie kodiert ist und es auch nur einen Anhang gibt, sollte es ja kein sonderliches Problem darstellen, das heraus zu schipseln. Und wie sich zeigte, war es dann auch genau so.

Nun galt es, den Anfang der Word-Datei heraus zu finden. Viele Dateiformate lassen sich recht leicht an einer „magischen Zahl„, also an einer bestimmten Bytefolge erkennen, mit der sie beginnen. Bei Word-Dateien (*.doc) sind das die beiden Bytes 0xD0 0xCF. Diese befinden sich in meiner Datei an Position 0x000006F1.

Jetzt haben wir alle Infos zusammen. Wir müssen also nur noch die ersten 0x000006F1 Bytes abschneiden. Sowas geht z.B. mit dd. Zugegeben: Ein gescheiter Hex-Editor kann sowas bestimmt auch von Haus aus, aber ich hatte so einen gerade nicht zur Hand (zum Betrachten der Datei hatte ich den mc verwendet). Ich sollte mir bei Gelegenheit mal einen richtigen Hex-Editor installieren.

Nun gut, also dd. Ich bin auch nicht so der dd-Profi, aber im Grunde genommen ist das nicht wirklich schwer zu bedienen. Ein Blick in die Man-Page zeigte mir, dass der Parameter skip für das Überspringen zuständig ist. 0x000006F1 ist dezimal 1777 (das verrät einem recht schnell der bc:

1
2
3
ibase=16
6F1
1777

Also zusammengebaut:

1
2
3
4
user@host:/tmp$ dd if=winmail.dat of=brief.doc bs=1777 skip=1
850+1 Datensätze ein
850+1 Datensätze aus
1510696 Bytes (1,5 MB) kopiert, 0,0105014 s, 144 MB/s

Und schon konnte ich die Datei problemlos öffnen. Eine Blockgröße von 1777b ist zwar nicht ganz optimal für ne Festplatte auszulesen, aber Performance war, wie man sieht nicht das Problem und außerdem hatte ich keine Lust, mir zu überlegen, ob man das auch eleganter lösen kann.

dd ist manchmal außerordentlich hilfreich. Vor einiger Zeit hab ich damit auch mal einen beschädigten Download repariert. Da hatte der Download-Manager Mist gebaut und die ersten paar Bytes mit ner HTML-datei überschrieben. Da hab ich dann einfach den fehlenden Dateianfang heruntergeladen (die Datei war recht groß und so war das zusammenbasteln schneller als neu laden) und mit dd damit den Anfang der fehlerhaften Datei überschrieben.

Ist schon ganz lustig, was man mit so „trivialen“ Programmen wie dd alles tun kann…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert