Zuletzt aktualisiert: 16. Sep., 2026

PPTX Reverse Engineering: Understanding PowerPoint Files Internally

Reverse Engineering PPTX Dateien: Ein Leitfaden für Entwickler

Moderne Präsentationsfolien treiben alles an, von Investoren-Pitches bis hin zu internen Quartalskennzahlen. Aber wenn Sie jemals programmatisch Text extrahieren, Vorlagen zur Laufzeit ersetzen, automatisierte Foliengeneratoren erstellen oder vertrauliche Präsentationen bereinigen mussten, haben Sie wahrscheinlich schnell erkannt: Standard‑Bibliotheken für Präsentationen auf hoher Ebene können sich wie eine unvorhersehbare Black‑Box anfühlen.

Wenn Bibliotheken wie python-pptx, Apache POI oder OpenXML SDK an ihre Grenzen stoßen – oder undokumentierte Layout‑Fehler einführen – bleibt nur ein Ausweg: Durchdringen. Sie müssen verstehen, was eine PowerPoint‑Präsentation auf Byte‑ und Schema‑Ebene tatsächlich ist.

In diesem Deep‑Dive werden wir den Vorhang über das .pptx‑Format lüften, seine interne Struktur auspacken, seinen Beziehungsgraphen nachverfolgen, seine Zeichenhierarchien zerlegen und praktische Strategien für Reverse Engineering, Inspektion und Manipulation von Präsentationen mit rohem Code betrachten.

1. Was ist eine .pptx-Datei wirklich?

Im Kern ist eine .pptx-Datei kein proprietäres monolithisches Binärformat wie das alte .ppt-Format der 1990er Jahre. Seit Microsoft Office Open XML (ECMA-376 und ISO/IEC 29500) eingeführt hat, sind moderne Office-Dokumente Open Packaging Conventions (OPC)-Archive.

Einfach ausgedrückt: eine .pptx-Datei ist einfach ein Zip-Archiv, das XML-Dokumente und Medien‑Assets enthält, die in einem deterministischen Verzeichnisbaum organisiert sind.

Sie können dies in Sekunden mit Standard‑Terminal‑Werkzeugen nachweisen:

# Rename the extension and unpack it
cp presentation.pptx presentation.zip
unzip presentation.zip -d presentation_unpacked/
cd presentation_unpacked/
tree -L 2

Der resultierende Verzeichnisbaum sieht bemerkenswert konsistent aus:

.
├── [Content_Types].xml
├── _rels/
│   └── .rels
├── docProps/
│   ├── app.xml
│   └── core.xml
└── ppt/
    ├── presentation.xml
    ├── _rels/
    ├── slides/
    ├── slideLayouts/
    ├── slideMasters/
    ├── theme/
    └── media/

Jedes einzelne visuelle Asset, jede Transition, Vererbung des Folienmasters, Textfeldkoordinate und Vektorgrafik ist in dieser Dateihierarchie kodiert.

2. Anatomie des Pakets: Schlüssel-Subsysteme

Um Präsentationen effektiv zu reverse‑engineeren, müssen Sie die Verantwortlichkeiten jeder obersten Komponente verstehen.

[Content_Types].xml

Dies ist das Eingangs‑Manifest für den OPC‑Reader. Es ordnet Dateierweiterungen und explizite interne Partnamen standardisierten MIME-/Content‑Typen zu. Wenn Sie eine neue Folie erstellen oder ein Bild hinzufügen und es nicht in [Content_Types].xml deklarieren, wird PowerPoint das Deck als beschädigt kennzeichnen und zur Wiederherstellung auffordern.

Beispiel‑Snippet:

<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="xml" ContentType="application/xml"/>
  <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
  <Default Extension="png" ContentType="image/png"/>
  <Override PartName="/ppt/presentation.xml" 
            ContentType="application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"/>
</Types>

Der _rels/ Beziehungsgraph

Eines der wichtigsten Konzepte in OpenXML ist Indirektion durch Beziehungen. Teile verweisen selten direkt auf rohe Dateipfade. Stattdessen hat eine Datei (z. B. slide1.xml) eine zugehörige Beziehungsdatei, die sich in einem benachbarten _rels‑Ordner befindet (z. B. _rels/slide1.xml.rels).

Beziehungen definieren:

  • Hyperlinks (r:id="rId2", TargetMode=“External”)
  • Bilder und Audiospuren, die in ppt/media/ gespeichert sind
  • Layout‑Vererbungszeiger (slideLayout1.xml)
  • Notizfolien, Kommentare und eingebettete Schriftarten

docProps/ (Metadaten)

  • core.xml: Dublin‑Core‑Metadaten — Autor, Titel, Erstellungsdatum, Änderungszeitstempel.
  • app.xml: Anwendungs‑spezifische Statistiken — PowerPoint‑Version, Gesamtzahl der Folien, Anzahl versteckter Folien, Wortanzahl, Namen der Präsentationsvorlagen.

ppt/ (Die Präsentations-Engine)

Hier befindet sich die eigentliche Präsentation:

  • presentation.xml: Der Hauptspine. Er registriert Folien-IDs, Foliengrößenabmessungen, Notizen-Master-Referenzen und Standardeinstellungen für Schriftarten.
  • slides/: Die einzelnen Folien (slide1.xml, slide2.xml, usw.).
  • slideLayouts/: Master‑Struktur‑Voreinstellungen (Titelfolie, Zwei‑Spalten, Abschnitts‑Überschrift).
  • slideMasters/: Globale Stile, Standard‑Paletten, Hintergrundfüllungen und Platzhalter‑Vererbung.
  • theme/: Farbpaletten (Akzent 1 bis 6, dunkle/helle Varianten) und Schriftart‑Schemata (Haupt‑/Nebenschriftarten).
  • media/: Rohbilder (PNG, JPEG, SVG), Audio‑ und Videodateien.

3. Analyse einer Folie: Die PresentationML (p:) & DrawingML (a:) Dialekte

Wenn Sie ppt/slides/slide1.xml öffnen, stoßen Sie auf zwei primäre XML‑Namensräume:

  1. PresentationML (p:): Steuert strukturelle Präsentationselemente (Folien, Formbaum, Canvas-Gruppen).
  2. DrawingML (a:): Steuert Typografie, Geometrie, 2D-Koordinaten, Farbverläufe und Vektor-Rendering.

Hier ist ein stark vereinfachtes Beispiel dafür, wie eine Standard‑Textform aussieht:

<p:sp>
  <!-- 1. Non-visual shape properties (Identifiers, names) -->
  <p:nvSpPr>
    <p:cNvPr id="4" name="Title Box 1"/>
    <p:cNvSpPr>
      <a:spLocks noGrp="1"/>
    </p:cNvSpPr>
    <p:nvPr>
      <p:ph type="title"/>
    </p:nvPr>
  </p:nvSpPr>

  <!-- 2. Visual shape properties (Position, size, geometry) -->
  <p:spPr>
    <a:xfrm>
      <a:off x="1524000" y="1143000"/>
      <a:ext cx="9144000" cy="1828800"/>
    </a:xfrm>
    <a:prstGeom prst="rect">
      <a:avLst/>
    </a:prstGeom>
    <a:solidFill>
      <a:schemeClr val="accent1"/>
    </a:solidFill>
  </p:spPr>

  <!-- 3. Text Body (Paragraphs, runs, styling) -->
  <p:txBody>
    <a:bodyPr rtlCol="0" anchor="ctr"/>
    <a:lstStyle/>
    <a:p>
      <a:r>
        <a:rPr lang="en-US" sz="3200" b="1"/>
        <a:t>Mission Critical Architecture</a:t>
      </a:r>
    </a:p>
  </p:txBody>
</p:sp>

Wesentliche Maßeinheiten: EMUs und Hundertstel eines Punktes

Beachten Sie die Koordinatennummern in <a:xfrm>:

  • x="1524000"
  • cx="9144000"

Dies sind Englische metrische Einheiten (EMUs).

  • $1 \text{ Zoll} = 914,400 \text{ EMUs}$
  • $1 \text{ cm} = 360,000 \text{ EMUs}$
  • $1 \text{ pt} = 12,700 \text{ EMUs}$

EMUs ermöglichen es, ganze Zahlen zu verwenden, um exakte Bruchteile sowohl von Zoll als auch von Millimetern darzustellen, ohne Rundungsfehler bei Gleitkommazahlen über verschiedene Hardwarearchitekturen hinweg.

Beachten Sie auch die Schriftgröße:

  • sz=\"3200\" bedeutet 32,00 pt. Schriftgrößen in DrawingML werden in Hundertsteln eines Punktes gemessen.

4. Die Vererbungskette: Warum Formen unsichtbare Stile erben

Eine der häufigsten Fallstricke beim Reverse Engineering von PPTX-Dateien ist die Annahme, dass das visuelle Styling einer Form vollständig in ihrer eigenen slideX.xml deklariert ist.

In Wirklichkeit stützt sich OpenXML auf ein strenges 4‑stufiges kaskadierendes Vererbungsmodell:

[Theme: ppt/theme/theme1.xml]
[Slide Master: ppt/slideMasters/slideMaster1.xml]
[Slide Layout: ppt/slideLayouts/slideLayout1.xml]
[Slide: ppt/slides/slide1.xml]

Wenn ein Textfeld in slide1.xml enthält:

<a:p>
  <a:r>
    <a:t>Revenue Projections</a:t>
  </a:r>
</a:p>

Es gibt keine Schriftfamilie, keine explizite Farbe und keine Größe, die für den Lauf (<a:r>) deklariert sind. Um herauszufinden, wie PowerPoint diesen Text rendert, muss Ihr Parser:

  1. Identifizieren Sie den Platzhaltertyp (<p:ph type="title"/>).
  2. Lesen Sie das Layout, das in slide1.xml.rels referenziert wird.
  3. Überprüfen Sie, ob slideLayout1.xml Stilüberschreibungen für diesen Platzhalter bereitstellt.
  4. Greifen Sie auf slideMaster1.xml zurück für die Standard‑Titel‑Textkörper‑Stile.
  5. Verfolgen Sie Farb‑Tokens wie accent1 oder tx1 in theme1.xml, um den hexadezimalen Farbcode zu finden.

Wenn Sie diesen Vererbungsgraphen überspringen, wird Ihr Parser Stile falsch lesen, fehlende Schriften, Schriftgrößen und Layout‑Anker übersehen.

5. Praktischer Reverse-Engineering-Workflow

Wenn Sie untersuchen müssen, wie ein bestimmtes PowerPoint‑Feature im Hintergrund funktioniert (z. B. Morph‑Übergänge, komplexe Tabellen, Vektorpfade), folgen Sie diesem empirischen Ansatz:

Schritt 1: Erstelle ein minimales “Diff-Paar”

  1. Öffnen Sie PowerPoint und erstellen Sie eine leere Folie.
  2. Speichern Sie es als before.pptx.
  3. Wenden Sie die genaue einzelne Änderung an, die Sie rückentwickeln möchten (z. B. einen Schatten zu einem Kreis hinzufügen, einen Aufzählungsstil ändern, ein eingebettetes Video einfügen).
  4. Speichern Sie es als after.pptx.

Schritt 2: Entpacke beide Archive

unzip before.pptx -d before/
unzip after.pptx -d after/

Schritt 3: Formatiere das XML

Roh-XML in Office-Archiven wird normalerweise von Einrückungen und Zeilenumbrüchen befreit. Vor dem Vergleich formatieren Sie die Dateien:

find before/ after/ -name "*.xml" -exec xmllint --format {} --output {} \;

Schritt 4: Führe einen Unified Diff aus

diff -uNr before/ after/ > changes.patch

Durch das Prüfen von changes.patch wird der genaue Tag-Name, das Namespace-Attribut und die von PowerPoint eingeführte Container-Hierarchie sichtbar. Dies ist der schnellste Weg, undokumentierte oder obskure Schemaeigenschaften zu entdecken, ohne tausende Seiten der ECMA-376-Dokumentation zu durchsuchen.

6. Aufbau einer benutzerdefinierten Mikro-Engine: Entpacken, Modifizieren, Wiederverpacken

Manchmal möchte man keine schwere Unternehmensabhängigkeit wie Apache POI oder das Microsoft OpenXML SDK – besonders in leichten serverlosen Laufzeiten (AWS Lambda, Cloudflare Workers, Edge-Knoten).

Hier ist ein eigenständiges Python‑Muster, das zeigt, wie man ein PPTX im Speicher sicher entzippt, benutzerdefinierte Daten mit Standardbibliothek‑Werkzeugen einfügt und es wieder verpackt:

import zipfile
import io
import xml.etree.ElementTree as ET

def modify_slide_title(input_pptx_bytes: bytes, new_title: str) -> bytes:
    input_zip = zipfile.ZipFile(io.BytesIO(input_pptx_bytes))
    output_buffer = io.BytesIO()
    
    with zipfile.ZipFile(output_buffer, "w", zipfile.ZIP_DEFLATED) as output_zip:
        for item in input_zip.infolist():
            content = input_zip.read(item.filename)
            
            # Target slide 1
            if item.filename == "ppt/slides/slide1.xml":
                namespaces = {
                    'p': 'http://schemas.openxmlformats.org/presentationml/2006/main',
                    'a': 'http://schemas.openxmlformats.org/drawingml/2006/main'
                }
                
                # Register namespaces to preserve prefixes
                for prefix, uri in namespaces.items():
                    ET.register_namespace(prefix, uri)
                    
                root = ET.fromstring(content)
                
                # Find title placeholder text run
                for title_run in root.findall(".//p:sp[p:nvSpPr/p:nvPr/p:ph[@type='title']]//a:t", namespaces):
                    title_run.text = new_title
                    break
                
                content = ET.tostring(root, encoding="utf-8", xml_declaration=True)
            
            output_zip.writestr(item, content)
            
    return output_buffer.getvalue()

Wichtige Stolperfallen beim Modifizieren von Dateien auf Byte-Ebene:

  1. Namespace-Erhaltung: XML-Parser schreiben oft Präfixe um (xmlns:p könnte zu xmlns:ns0 werden). Obwohl gültiges XML, lehnt die strenge interne Schema‑Validierung von PowerPoint gelegentlich nicht‑standardmäßige Präfix‑Aliase ab. Registrieren Sie Namespaces explizit.
  2. ZIP-Komprimierungsmethoden: Stellen Sie sicher, dass Sie Dateien mit der Standard‑Deflate‑Kompression zurückschreiben (zipfile.ZIP_DEFLATED).
  3. Stream-Flushing: Überprüfen Sie stets, dass Ihr ZIP‑Puffer vollständig geschlossen und geleert wird, bevor Sie Bytes weiterleiten.
  4. Beziehungen erhalten: Wenn Sie eine Folie entfernen, müssen Sie deren Eintrag aus ppt/presentation.xml entfernen, die Beziehung in ppt/_rels/presentation.xml.rels löschen und den Inhaltstyp aus [Content_Types].xml bereinigen.

7. Leistungs- und Sicherheitsüberlegungen

Reverse Engineering von PPTX‑Dateien geht nicht nur über das Bearbeiten von Folien; es geht auch um die Prüfung dessen, was in Ihre Systeme gelangt.

Sicherheit: Milliarden Lacher & XXE

Da PPTX‑Dateien XML parsen, ist jede serverseitige Pipeline, die benutzer‑eingereichte Präsentationen verarbeitet, anfällig für:

  • XML External Entity (XXE)-Injection: Bösartige XML, die versucht, auf /etc/passwd zuzugreifen oder interne Cloud‑Metadaten‑Endpunkte abzufragen (http://169.254.169.254/).
  • Entity‑Expansion‑Angriffe (Billion Laughs): Exponentielle Entity‑Schleifen, die den Systemspeicher erschöpfen.

Abschwächung: Deaktivieren Sie immer resolve_entities, load_dtd und die Auflösung externer Netzwerke in Ihrem XML‑Parser (z. B. mit defusedxml in Python).

Sicherheit: Makro-Payloads und versteckte Streams

Untersuchen Sie Dateien auf .pptm‑Inhalte, die sich als .pptx‑Erweiterungen tarnen. Achten Sie auf ppt/vbaProject.bin, das kompilierten Visual‑Basic‑Code enthält. In standardmäßigen .pptx‑Dateien ist VBA‑Code verboten; das Auffinden von Verweisen auf Binär‑Payloads in Beziehungen sollte sofort Quarantäne‑Flaggen auslösen.

Fazit

Reverse Engineering von .pptx‑Dateien entmystifiziert Präsentationssoftware. Sobald Sie erkennen, dass PowerPoint‑Dateien einfach strukturierte Zip‑Pakete sind, die mit Koordinaten, Schemareferenzen und XML‑Beziehungsbäumen gefüllt sind, sind Sie nicht mehr durch bestehende Drittanbieter‑Abstraktionen eingeschränkt.

Egal, ob Sie die Durchsatzrate der Foliengenerierung optimieren, benutzerdefinierte automatisierte Sanitizer schreiben oder Rendering‑Fehler beheben, ein direkter Blick auf die zugrunde liegende OpenXML‑Architektur verschafft Ihnen die volle Kontrolle über die Präsentationspipeline.

Häufig gestellte Fragen (FAQ)

**Q: Können Sie eine .pptx‑Datei in einen normalen Ordner konvertieren und die Dateien direkt in einer IDE bearbeiten?

A1: Ja, Sie können das Archiv extrahieren, das XML in einem Editor wie VS Code bearbeiten und die Verzeichnisinhalte erneut zippen, um sie wieder in PowerPoint zu öffnen.

**Q: Warum sagt PowerPoint, dass meine manuell modifizierte PPTX-Datei repariert werden muss?

A2: Dies passiert normalerweise, wenn Sie fehlerhaftes XML eingefügt haben, ein neues Asset aus [Content_Types].xml weggelassen haben oder eine lose Referenz in einer zugehörigen .rels-Datei zurückgelassen haben.

**Q: Welche Maßeinheit verwendet PowerPoint für Positionen und Ränder von Formen?

A3: PowerPoint verwendet English Metric Units (EMUs), wobei 1 Zoll 914,400 EMUs und 1 Punkt 12,700 EMUs entspricht.

**Q: Wie kann ich alle Bilder aus einer Präsentation programmgesteuert extrahieren ohne externe Bibliotheken?

A4: Öffnen Sie einfach die .pptx-Datei mit einem beliebigen Standard‑Zip‑Programm und extrahieren Sie alle Binärdateien, die sich im Verzeichnis ppt/media/ befinden.

**Q: Ist es sicher, benutzer‑hochgeladene PPTX‑Dateien mit Standard‑XML‑Parsern zu verarbeiten?

A5: Nein, Sie müssen Ihren Parser härten oder sichere Wrapper wie defusedxml verwenden, um XML External Entity (XXE)- und Zip‑Bomb‑Angriffe zu blockieren.

Siehe auch