🛠️Werkzeuge

Mit welchen Befehlen man Word-Dateien untersucht, zerlegt und umwandelt – und ein Untersucher, der eigene Dateien direkt im Browser analysiert.

📂Eigene Datei untersuchen

Erkennt das Format an der Signatur, liest bei .doc das CFB-Verzeichnis, den FIB und den Text über die Piece Table, bei .docx die Content Types, Relationships und document.xml. Warnt vor Makros und externen Vorlagen.

🔍Erkennen und hineinschauen

Die Beispieldateien dieser App (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 files

Das 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

LibreOffice und pandoc können .doc/.docx ohne Word konvertieren – ideal für Skripte und Server.

.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/)

![](media/image1.png){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

Eine .docx lässt sich mit jedem ZIP-Programm bauen – mit zwei Regeln.

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.