🛠️Werkzeuge
Mit welchen Befehlen man Word-Dateien untersucht, zerlegt und umwandelt – und ein Untersucher, der eigene Dateien direkt im Browser analysiert.
📂Eigene Datei untersuchen
🔍Erkennen und hineinschauen
beispiel.doc, beispiel.docx) – Ausgaben aus denselben Bytes berechnet bzw. mit den echten Programmen gegengeprüft.Dateityp anhand der Signatur
echte Ausgabe (gegengeprüft)$ file beispiel.doc beispiel.docx
beispiel.doc: Composite Document File V2 Document, Little Endian, Os: Windows, Version 6.0, Code page: 1252, Title: Beispiel beispiel.docx: Microsoft OOXML
file liest für die .doc sogar den Titel aus \x05SummaryInformation.
Hexdump des CFB-Headers
aus den Beispielbytes berechnet$ xxd beispiel.doc | head -5
00000000: d0cf 11e0 a1b1 1ae1 0000 0000 0000 0000 ................ 00000010: 0000 0000 0000 0000 3e00 0300 feff 0900 ........>....... 00000020: 0600 0000 0000 0000 0000 0000 0100 0000 ................ 00000030: 0100 0000 0000 0000 0010 0000 0c00 0000 ................ 00000040: 0100 0000 feff ffff 0000 0000 0000 0000 ................
3e00 0300 = Minor 0x003E, Major 3 · feff = Byte Order · 0900 = Sector Shift 9 → 512 Byte.
Hexdump der .docx
aus den Beispielbytes berechnet$ xxd beispiel.docx | head -3
00000000: 504b 0304 1400 0008 0000 0000 2100 5663 PK..........!.Vc 00000010: a96c e903 0000 e903 0000 1300 0000 5b43 .l............[C 00000020: 6f6e 7465 6e74 5f54 7970 6573 5d2e 786d ontent_Types].xm
504b 0304 = PK\x03\x04, danach der Name des ersten Eintrags [Content_Types].xml.
Inhalt der .docx auflisten
aus den Beispielbytes berechnet$ unzip -l beispiel.docx
Archive: beispiel.docx
Length Date Time Name
--------- ---------- ----- ----
1001 01-01-1980 00:00 [Content_Types].xml
599 01-01-1980 00:00 _rels/.rels
654 01-01-1980 00:00 docProps/core.xml
223 01-01-1980 00:00 docProps/app.xml
2441 01-01-1980 00:00 word/document.xml
1772 01-01-1980 00:00 word/styles.xml
324 01-01-1980 00:00 word/settings.xml
721 01-01-1980 00:00 word/_rels/document.xml.rels
852 01-01-1980 00:00 word/media/image1.png
--------- -------
8587 9 filesDas Datum 1980-01-01 00:00 ist der kleinste DOS-Zeitstempel – auch Word schreibt ihn.
Einen Part direkt ausgeben
aus den Beispielbytes berechnet$ unzip -p beispiel.docx word/document.xml | head -6
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
<w:body>
<w:p>
<w:pPr><w:pStyle w:val="Heading1"/></w:pPr>
<w:r>-p schreibt den Inhalt nach stdout, ohne etwas zu entpacken.
🔄Umwandeln
.doc → .docx mit LibreOffice (ohne Oberfläche)
Beispielausgabe$ libreoffice --headless --convert-to docx beispiel.doc
convert /home/nutzer/beispiel.doc -> /home/nutzer/beispiel.docx using filter : MS Word 2007 XML
Mit --outdir ziel/ ändert man den Zielordner, mit --convert-to pdf entsteht ein PDF. Auf manchen Systemen heißt das Programm soffice.
Filter ausdrücklich wählen
Beispielausgabe$ libreoffice --headless --convert-to "doc:MS Word 97" beispiel.docx
convert /home/nutzer/beispiel.docx -> /home/nutzer/beispiel.doc using filter : MS Word 97
Der Filtername nach dem Doppelpunkt bestimmt das Zielformat – so entsteht wieder eine binäre .doc.
.docx → Markdown mit pandoc
echte Ausgabe (gegengeprüft)$ pandoc beispiel.docx -t markdown
# Grüße aus VisualWord
Dies ist **fett**, dies *kursiv* und dies [blau]{.underline}.
Mehr unter [example.org](https://example.org/)
{width="1.0416666666666667in"
height="1.0416666666666667in"}pandoc liest Heading1 als Überschrift, w:b/w:i als Hervorhebung und rechnet 952 500 EMU in 1,0417 Zoll um. pandoc liest .docx, aber keine .doc.
.docx → reiner Text / OpenDocument
echte Ausgabe (gegengeprüft)$ pandoc beispiel.docx -t plain pandoc beispiel.docx -o beispiel.odt
Grüße aus VisualWord Dies ist fett, dies kursiv und dies blau. Mehr unter example.org []
[] ist der Platzhalter für das Bild ohne Alternativtext.
🧬OLE-Dateien analysieren (Python)
olefile ist eine Python-Bibliothek für CFB-Dateien; oledump.py (Didier Stevens) und die oletools (olevba, oleid, olemeta) bauen darauf auf und werden vor allem zur Malware-Analyse genutzt.Streams auflisten mit olefile
aus den Beispielbytes berechnet$ python3 -c "import olefile; print(olefile.OleFileIO('beispiel.doc').listdir())"[['\x05SummaryInformation'], ['1Table'], ['Data'], ['WordDocument']]
Pfade als Listen (Storage/Stream); sortiert nach Namen, deshalb steht \x05… vorn.
Metadaten lesen
echte Ausgabe (gegengeprüft)$ python3 -c "import olefile; m=olefile.OleFileIO('beispiel.doc').get_metadata(); print(m.title, m.codepage)"b'Beispiel' 1252
Aus dem Property Set \x05SummaryInformation (Titel als 8-Bit-String, Codepage 1252).
Streams mit oledump.py
aus den Beispielbytes berechnet$ oledump.py beispiel.doc
1: 128 'Data' 2: 33 '1Table' 3: 4608 'WordDocument' 4: 100 '\x05SummaryInformation'
Vereinfachte Darstellung: Nummer, Größe, Name. Bei Makros markiert oledump den Stream mit „M“; -s 3 -v gibt den Makro-Quelltext aus.
Makros finden mit olevba
Beispielausgabe$ olevba angebot.docm
(listet Module, Quelltext und verdächtige Schlüsselwörter wie AutoOpen, Shell, CreateObject)
Funktioniert für .doc und .docm gleichermaßen – vbaProject.bin ist selbst eine CFB-Datei.
📦Von Hand packen
Entpacken, ändern, wieder einpacken
Beispielausgabe$ mkdir x && cd x && unzip ../beispiel.docx # … word/document.xml bearbeiten … zip -X -r ../neu.docx '[Content_Types].xml' _rels docProps word
adding: [Content_Types].xml (deflated 69%) adding: _rels/ (stored 0%) …
Die ZIP-Wurzel muss die Paketwurzel sein (nicht der Ordner x/), und [Content_Types].xml muss vorhanden sein. Die Prozentwerte hängen vom Inhalt ab.
OpenDocument: mimetype zuerst und unkomprimiert
Beispielausgabe$ zip -X -0 neu.odt mimetype zip -X -r neu.odt . -x mimetype
adding: mimetype (stored 0%) …
Deshalb steht bei jeder .odt ab Byte 38 lesbar application/vnd.oasis.opendocument.text.