<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>PPTX Reverse Engineering on File Format Blog</title>
    <link>https://blog.fileformat.com/de/tag/pptx-reverse-engineering/</link>
    <description>Recent content in PPTX Reverse Engineering on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>de</language>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/de/tag/pptx-reverse-engineering/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PPTX Reverse Engineering: Das interne Verständnis von PowerPoint-Dateien</title>
      <link>https://blog.fileformat.com/de/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/de/presentation/pptx-reverse-engineering-understanding-powerpoint-files-internally/</guid>
      <description>Entdecken Sie, was wirklich in einer `.pptx`-Datei steckt. Erfahren Sie, wie OpenXML-Paketierung, Beziehungsgraphen, Formen und Zeichen‑Markup im Hintergrund funktionieren.</description>
      <content:encoded><![CDATA[<p><strong>Zuletzt aktualisiert</strong>: 16. Sep., 2026</p>
<figure class="align-center ">
    <img loading="lazy" src="images/pptx-reverse-engineering-understanding-powerpoint-files-internally.png#center"
         alt="PPTX Reverse Engineering: Understanding PowerPoint Files Internally"/> 
</figure>

<hr>
<h2 id="reverse-engineering-pptx4-dateien-ein-leitfaden-für-entwickler">Reverse Engineering <a href="https://docs.fileformat.com/presentation/pptx/">PPTX</a> Dateien: Ein Leitfaden für Entwickler</h2>
<p>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.</p>
<p>Wenn Bibliotheken wie <a href="https://products.fileformat.com/presentation/python/python-pptx/"><code>python-pptx</code></a>, <a href="https://products.fileformat.com/presentation/java/apache-poi-xslf/">Apache POI</a> oder <a href="https://products.fileformat.com/presentation/net/openxmlsdk/">OpenXML SDK</a> 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.</p>
<p>In diesem Deep‑Dive werden wir den Vorhang über das <code>.pptx</code>‑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.</p>
<h2 id="1-was-ist-eine-pptx-datei-wirklich">1. Was ist eine <code>.pptx</code>-Datei wirklich?</h2>
<p>Im Kern ist eine <code>.pptx</code>-Datei kein proprietäres monolithisches Binärformat wie das alte <code>.ppt</code>-Format der 1990er Jahre. Seit Microsoft Office Open XML (ECMA-376 und ISO/IEC 29500) eingeführt hat, sind moderne Office-Dokumente <strong>Open Packaging Conventions (OPC)-Archive</strong>.</p>
<p>Einfach ausgedrückt: <strong>eine <code>.pptx</code>-Datei ist einfach ein Zip-Archiv, das XML-Dokumente und Medien‑Assets enthält, die in einem deterministischen Verzeichnisbaum organisiert sind.</strong></p>
<p>Sie können dies in Sekunden mit Standard‑Terminal‑Werkzeugen nachweisen:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Rename the extension and unpack it</span>
</span></span><span style="display:flex;"><span>cp presentation.pptx presentation.zip
</span></span><span style="display:flex;"><span>unzip presentation.zip -d presentation_unpacked/
</span></span><span style="display:flex;"><span>cd presentation_unpacked/
</span></span><span style="display:flex;"><span>tree -L <span style="color:#ae81ff">2</span>
</span></span></code></pre></div><p>Der resultierende Verzeichnisbaum sieht bemerkenswert konsistent aus:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>├── [Content_Types].xml
</span></span><span style="display:flex;"><span>├── _rels/
</span></span><span style="display:flex;"><span>│   └── .rels
</span></span><span style="display:flex;"><span>├── docProps/
</span></span><span style="display:flex;"><span>│   ├── app.xml
</span></span><span style="display:flex;"><span>│   └── core.xml
</span></span><span style="display:flex;"><span>└── ppt/
</span></span><span style="display:flex;"><span>    ├── presentation.xml
</span></span><span style="display:flex;"><span>    ├── _rels/
</span></span><span style="display:flex;"><span>    ├── slides/
</span></span><span style="display:flex;"><span>    ├── slideLayouts/
</span></span><span style="display:flex;"><span>    ├── slideMasters/
</span></span><span style="display:flex;"><span>    ├── theme/
</span></span><span style="display:flex;"><span>    └── media/
</span></span></code></pre></div><p>Jedes einzelne visuelle Asset, jede Transition, Vererbung des Folienmasters, Textfeldkoordinate und Vektorgrafik ist in dieser Dateihierarchie kodiert.</p>
<h2 id="2-anatomie-des-pakets-schlüssel-subsysteme">2. Anatomie des Pakets: Schlüssel-Subsysteme</h2>
<p>Um Präsentationen effektiv zu reverse‑engineeren, müssen Sie die Verantwortlichkeiten jeder obersten Komponente verstehen.</p>
<h3 id="content_typesxml"><code>[Content_Types].xml</code></h3>
<p>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 <code>[Content_Types].xml</code> deklarieren, wird PowerPoint das Deck als beschädigt kennzeichnen und zur Wiederherstellung auffordern.</p>
<p>Beispiel‑Snippet:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;Types</span> <span style="color:#a6e22e">xmlns=</span><span style="color:#e6db74">&#34;http://schemas.openxmlformats.org/package/2006/content-types&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Default</span> <span style="color:#a6e22e">Extension=</span><span style="color:#e6db74">&#34;xml&#34;</span> <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;application/xml&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Default</span> <span style="color:#a6e22e">Extension=</span><span style="color:#e6db74">&#34;rels&#34;</span> <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;application/vnd.openxmlformats-package.relationships+xml&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Default</span> <span style="color:#a6e22e">Extension=</span><span style="color:#e6db74">&#34;png&#34;</span> <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;image/png&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;Override</span> <span style="color:#a6e22e">PartName=</span><span style="color:#e6db74">&#34;/ppt/presentation.xml&#34;</span> 
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">ContentType=</span><span style="color:#e6db74">&#34;application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/Types&gt;</span>
</span></span></code></pre></div><h3 id="der-_rels-beziehungsgraph">Der <code>_rels/</code> Beziehungsgraph</h3>
<p>Eines der wichtigsten Konzepte in OpenXML ist <strong>Indirektion durch Beziehungen</strong>. Teile verweisen selten direkt auf rohe Dateipfade. Stattdessen hat eine Datei (z. B. <code>slide1.xml</code>) eine zugehörige Beziehungsdatei, die sich in einem benachbarten <code>_rels</code>‑Ordner befindet (z. B. <code>_rels/slide1.xml.rels</code>).</p>
<p>Beziehungen definieren:</p>
<ul>
<li>Hyperlinks (<code>r:id=&quot;rId2&quot;</code>, TargetMode=&ldquo;External&rdquo;)</li>
<li>Bilder und Audiospuren, die in <code>ppt/media/</code> gespeichert sind</li>
<li>Layout‑Vererbungszeiger (<code>slideLayout1.xml</code>)</li>
<li>Notizfolien, Kommentare und eingebettete Schriftarten</li>
</ul>
<h3 id="docprops-metadaten"><code>docProps/</code> (Metadaten)</h3>
<ul>
<li><strong><code>core.xml</code></strong>: Dublin‑Core‑Metadaten — Autor, Titel, Erstellungsdatum, Änderungszeitstempel.</li>
<li><strong><code>app.xml</code></strong>: Anwendungs‑spezifische Statistiken — PowerPoint‑Version, Gesamtzahl der Folien, Anzahl versteckter Folien, Wortanzahl, Namen der Präsentationsvorlagen.</li>
</ul>
<h3 id="ppt-die-präsentations-engine"><code>ppt/</code> (Die Präsentations-Engine)</h3>
<p>Hier befindet sich die eigentliche Präsentation:</p>
<ul>
<li><strong><code>presentation.xml</code></strong>: Der Hauptspine. Er registriert Folien-IDs, Foliengrößenabmessungen, Notizen-Master-Referenzen und Standardeinstellungen für Schriftarten.</li>
<li><strong><code>slides/</code></strong>: Die einzelnen Folien (<code>slide1.xml</code>, <code>slide2.xml</code>, usw.).</li>
<li><strong><code>slideLayouts/</code></strong>: Master‑Struktur‑Voreinstellungen (Titelfolie, Zwei‑Spalten, Abschnitts‑Überschrift).</li>
<li><strong><code>slideMasters/</code></strong>: Globale Stile, Standard‑Paletten, Hintergrundfüllungen und Platzhalter‑Vererbung.</li>
<li><strong><code>theme/</code></strong>: Farbpaletten (Akzent 1 bis 6, dunkle/helle Varianten) und Schriftart‑Schemata (Haupt‑/Nebenschriftarten).</li>
<li><strong><code>media/</code></strong>: Rohbilder (PNG, JPEG, SVG), Audio‑ und Videodateien.</li>
</ul>
<h2 id="3-analyse-einer-folie-die-presentationml-p--drawingml-a-dialekte">3. Analyse einer Folie: Die PresentationML (<code>p:</code>) &amp; DrawingML (<code>a:</code>) Dialekte</h2>
<p>Wenn Sie <code>ppt/slides/slide1.xml</code> öffnen, stoßen Sie auf zwei primäre XML‑Namensräume:</p>
<ol>
<li><strong>PresentationML (<code>p:</code>)</strong>: Steuert strukturelle Präsentationselemente (Folien, Formbaum, Canvas-Gruppen).</li>
<li><strong>DrawingML (<code>a:</code>)</strong>: Steuert Typografie, Geometrie, 2D-Koordinaten, Farbverläufe und Vektor-Rendering.</li>
</ol>
<p>Hier ist ein stark vereinfachtes Beispiel dafür, wie eine Standard‑Textform aussieht:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;p:sp&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">&lt;!-- 1. Non-visual shape properties (Identifiers, names) --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;p:nvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;p:cNvPr</span> <span style="color:#a6e22e">id=</span><span style="color:#e6db74">&#34;4&#34;</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;Title Box 1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;p:cNvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:spLocks</span> <span style="color:#a6e22e">noGrp=</span><span style="color:#e6db74">&#34;1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/p:cNvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;p:nvPr&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;p:ph</span> <span style="color:#a6e22e">type=</span><span style="color:#e6db74">&#34;title&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/p:nvPr&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/p:nvSpPr&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">&lt;!-- 2. Visual shape properties (Position, size, geometry) --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;p:spPr&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:xfrm&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:off</span> <span style="color:#a6e22e">x=</span><span style="color:#e6db74">&#34;1524000&#34;</span> <span style="color:#a6e22e">y=</span><span style="color:#e6db74">&#34;1143000&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:ext</span> <span style="color:#a6e22e">cx=</span><span style="color:#e6db74">&#34;9144000&#34;</span> <span style="color:#a6e22e">cy=</span><span style="color:#e6db74">&#34;1828800&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:xfrm&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:prstGeom</span> <span style="color:#a6e22e">prst=</span><span style="color:#e6db74">&#34;rect&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:avLst/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:prstGeom&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:solidFill&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:schemeClr</span> <span style="color:#a6e22e">val=</span><span style="color:#e6db74">&#34;accent1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:solidFill&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/p:spPr&gt;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">&lt;!-- 3. Text Body (Paragraphs, runs, styling) --&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;p:txBody&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:bodyPr</span> <span style="color:#a6e22e">rtlCol=</span><span style="color:#e6db74">&#34;0&#34;</span> <span style="color:#a6e22e">anchor=</span><span style="color:#e6db74">&#34;ctr&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:lstStyle/&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:p&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;a:r&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;a:rPr</span> <span style="color:#a6e22e">lang=</span><span style="color:#e6db74">&#34;en-US&#34;</span> <span style="color:#a6e22e">sz=</span><span style="color:#e6db74">&#34;3200&#34;</span> <span style="color:#a6e22e">b=</span><span style="color:#e6db74">&#34;1&#34;</span><span style="color:#f92672">/&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;a:t&gt;</span>Mission Critical Architecture<span style="color:#f92672">&lt;/a:t&gt;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&lt;/a:r&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/a:p&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/p:txBody&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/p:sp&gt;</span>
</span></span></code></pre></div><h3 id="wesentliche-maßeinheiten-emus-und-hundertstel-eines-punktes">Wesentliche Maßeinheiten: EMUs und Hundertstel eines Punktes</h3>
<p>Beachten Sie die Koordinatennummern in <code>&lt;a:xfrm&gt;</code>:</p>
<ul>
<li><code>x=&quot;1524000&quot;</code></li>
<li><code>cx=&quot;9144000&quot;</code></li>
</ul>
<p>Dies sind <strong>Englische metrische Einheiten (EMUs)</strong>.</p>
<ul>
<li>$1 \text{ Zoll} = 914,400 \text{ EMUs}$</li>
<li>$1 \text{ cm} = 360,000 \text{ EMUs}$</li>
<li>$1 \text{ pt} = 12,700 \text{ EMUs}$</li>
</ul>
<p>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.</p>
<p>Beachten Sie auch die Schriftgröße:</p>
<ul>
<li><code>sz=\&quot;3200\&quot;</code> bedeutet <strong>32,00 pt</strong>. Schriftgrößen in DrawingML werden in Hundertsteln eines Punktes gemessen.</li>
</ul>
<h2 id="4-die-vererbungskette-warum-formen-unsichtbare-stile-erben">4. Die Vererbungskette: Warum Formen unsichtbare Stile erben</h2>
<p>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 <code>slideX.xml</code> deklariert ist.</p>
<p>In Wirklichkeit stützt sich OpenXML auf ein strenges <strong>4‑stufiges kaskadierendes Vererbungsmodell</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>[Theme: ppt/theme/theme1.xml]
</span></span><span style="display:flex;"><span>              │
</span></span><span style="display:flex;"><span>              ▼
</span></span><span style="display:flex;"><span>[Slide Master: ppt/slideMasters/slideMaster1.xml]
</span></span><span style="display:flex;"><span>              │
</span></span><span style="display:flex;"><span>              ▼
</span></span><span style="display:flex;"><span>[Slide Layout: ppt/slideLayouts/slideLayout1.xml]
</span></span><span style="display:flex;"><span>              │
</span></span><span style="display:flex;"><span>              ▼
</span></span><span style="display:flex;"><span>[Slide: ppt/slides/slide1.xml]
</span></span></code></pre></div><p>Wenn ein Textfeld in <code>slide1.xml</code> enthält:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;a:p&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;a:r&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;a:t&gt;</span>Revenue Projections<span style="color:#f92672">&lt;/a:t&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&lt;/a:r&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/a:p&gt;</span>
</span></span></code></pre></div><p>Es gibt keine Schriftfamilie, keine explizite Farbe und keine Größe, die für den Lauf (<code>&lt;a:r&gt;</code>) deklariert sind. Um herauszufinden, wie PowerPoint diesen Text rendert, muss Ihr Parser:</p>
<ol>
<li>Identifizieren Sie den Platzhaltertyp (<code>&lt;p:ph type=&quot;title&quot;/&gt;</code>).</li>
<li>Lesen Sie das Layout, das in <code>slide1.xml.rels</code> referenziert wird.</li>
<li>Überprüfen Sie, ob <code>slideLayout1.xml</code> Stilüberschreibungen für diesen Platzhalter bereitstellt.</li>
<li>Greifen Sie auf <code>slideMaster1.xml</code> zurück für die Standard‑Titel‑Textkörper‑Stile.</li>
<li>Verfolgen Sie Farb‑Tokens wie <code>accent1</code> oder <code>tx1</code> in <code>theme1.xml</code>, um den hexadezimalen Farbcode zu finden.</li>
</ol>
<p>Wenn Sie diesen Vererbungsgraphen überspringen, wird Ihr Parser Stile falsch lesen, fehlende Schriften, Schriftgrößen und Layout‑Anker übersehen.</p>
<h2 id="5-praktischer-reverse-engineering-workflow">5. Praktischer Reverse-Engineering-Workflow</h2>
<p>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:</p>
<h3 id="schritt-1-erstelle-ein-minimales-diff-paar">Schritt 1: Erstelle ein minimales &ldquo;Diff-Paar&rdquo;</h3>
<ol>
<li>Öffnen Sie PowerPoint und erstellen Sie eine leere Folie.</li>
<li>Speichern Sie es als <code>before.pptx</code>.</li>
<li>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).</li>
<li>Speichern Sie es als <code>after.pptx</code>.</li>
</ol>
<h3 id="schritt-2-entpacke-beide-archive">Schritt 2: Entpacke beide Archive</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>unzip before.pptx -d before/
</span></span><span style="display:flex;"><span>unzip after.pptx -d after/
</span></span></code></pre></div><h3 id="schritt-3-formatiere-das-xml">Schritt 3: Formatiere das XML</h3>
<p>Roh-XML in Office-Archiven wird normalerweise von Einrückungen und Zeilenumbrüchen befreit. Vor dem Vergleich formatieren Sie die Dateien:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>find before/ after/ -name <span style="color:#e6db74">&#34;*.xml&#34;</span> -exec xmllint --format <span style="color:#f92672">{}</span> --output <span style="color:#f92672">{}</span> <span style="color:#ae81ff">\;</span>
</span></span></code></pre></div><h3 id="schritt-4-führe-einen-unified-diff-aus">Schritt 4: Führe einen Unified Diff aus</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>diff -uNr before/ after/ &gt; changes.patch
</span></span></code></pre></div><p>Durch das Prüfen von <code>changes.patch</code> 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.</p>
<h2 id="6-aufbau-einer-benutzerdefinierten-mikro-engine-entpacken-modifizieren-wiederverpacken">6. Aufbau einer benutzerdefinierten Mikro-Engine: Entpacken, Modifizieren, Wiederverpacken</h2>
<p>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).</p>
<p>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:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> zipfile
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> io
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> xml.etree.ElementTree <span style="color:#66d9ef">as</span> ET
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">modify_slide_title</span>(input_pptx_bytes: bytes, new_title: str) <span style="color:#f92672">-&gt;</span> bytes:
</span></span><span style="display:flex;"><span>    input_zip <span style="color:#f92672">=</span> zipfile<span style="color:#f92672">.</span>ZipFile(io<span style="color:#f92672">.</span>BytesIO(input_pptx_bytes))
</span></span><span style="display:flex;"><span>    output_buffer <span style="color:#f92672">=</span> io<span style="color:#f92672">.</span>BytesIO()
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> zipfile<span style="color:#f92672">.</span>ZipFile(output_buffer, <span style="color:#e6db74">&#34;w&#34;</span>, zipfile<span style="color:#f92672">.</span>ZIP_DEFLATED) <span style="color:#66d9ef">as</span> output_zip:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> item <span style="color:#f92672">in</span> input_zip<span style="color:#f92672">.</span>infolist():
</span></span><span style="display:flex;"><span>            content <span style="color:#f92672">=</span> input_zip<span style="color:#f92672">.</span>read(item<span style="color:#f92672">.</span>filename)
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># Target slide 1</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> item<span style="color:#f92672">.</span>filename <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;ppt/slides/slide1.xml&#34;</span>:
</span></span><span style="display:flex;"><span>                namespaces <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#39;p&#39;</span>: <span style="color:#e6db74">&#39;http://schemas.openxmlformats.org/presentationml/2006/main&#39;</span>,
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#39;a&#39;</span>: <span style="color:#e6db74">&#39;http://schemas.openxmlformats.org/drawingml/2006/main&#39;</span>
</span></span><span style="display:flex;"><span>                }
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#75715e"># Register namespaces to preserve prefixes</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">for</span> prefix, uri <span style="color:#f92672">in</span> namespaces<span style="color:#f92672">.</span>items():
</span></span><span style="display:flex;"><span>                    ET<span style="color:#f92672">.</span>register_namespace(prefix, uri)
</span></span><span style="display:flex;"><span>                    
</span></span><span style="display:flex;"><span>                root <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>fromstring(content)
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                <span style="color:#75715e"># Find title placeholder text run</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">for</span> title_run <span style="color:#f92672">in</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;.//p:sp[p:nvSpPr/p:nvPr/p:ph[@type=&#39;title&#39;]]//a:t&#34;</span>, namespaces):
</span></span><span style="display:flex;"><span>                    title_run<span style="color:#f92672">.</span>text <span style="color:#f92672">=</span> new_title
</span></span><span style="display:flex;"><span>                    <span style="color:#66d9ef">break</span>
</span></span><span style="display:flex;"><span>                
</span></span><span style="display:flex;"><span>                content <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>tostring(root, encoding<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;utf-8&#34;</span>, xml_declaration<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            output_zip<span style="color:#f92672">.</span>writestr(item, content)
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> output_buffer<span style="color:#f92672">.</span>getvalue()
</span></span></code></pre></div><h3 id="wichtige-stolperfallen-beim-modifizieren-von-dateien-auf-byte-ebene">Wichtige Stolperfallen beim Modifizieren von Dateien auf Byte-Ebene:</h3>
<ol>
<li><strong>Namespace-Erhaltung</strong>: XML-Parser schreiben oft Präfixe um (<code>xmlns:p</code> könnte zu <code>xmlns:ns0</code> 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.</li>
<li><strong>ZIP-Komprimierungsmethoden</strong>: Stellen Sie sicher, dass Sie Dateien mit der Standard‑Deflate‑Kompression zurückschreiben (<code>zipfile.ZIP_DEFLATED</code>).</li>
<li><strong>Stream-Flushing</strong>: Überprüfen Sie stets, dass Ihr ZIP‑Puffer vollständig geschlossen und geleert wird, bevor Sie Bytes weiterleiten.</li>
<li><strong>Beziehungen erhalten</strong>: Wenn Sie eine Folie entfernen, müssen Sie deren Eintrag aus <code>ppt/presentation.xml</code> entfernen, die Beziehung in <code>ppt/_rels/presentation.xml.rels</code> löschen und den Inhaltstyp aus <code>[Content_Types].xml</code> bereinigen.</li>
</ol>
<h2 id="7-leistungs--und-sicherheitsüberlegungen">7. Leistungs- und Sicherheitsüberlegungen</h2>
<p>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.</p>
<h3 id="sicherheit-milliarden-lacher--xxe">Sicherheit: Milliarden Lacher &amp; XXE</h3>
<p>Da PPTX‑Dateien XML parsen, ist jede serverseitige Pipeline, die benutzer‑eingereichte Präsentationen verarbeitet, anfällig für:</p>
<ul>
<li><strong>XML External Entity (XXE)-Injection</strong>: Bösartige XML, die versucht, auf <code>/etc/passwd</code> zuzugreifen oder interne Cloud‑Metadaten‑Endpunkte abzufragen (<code>http://169.254.169.254/</code>).</li>
<li><strong>Entity‑Expansion‑Angriffe (Billion Laughs)</strong>: Exponentielle Entity‑Schleifen, die den Systemspeicher erschöpfen.</li>
</ul>
<p><strong>Abschwächung</strong>: Deaktivieren Sie immer <code>resolve_entities</code>, <code>load_dtd</code> und die Auflösung externer Netzwerke in Ihrem XML‑Parser (z. B. mit <code>defusedxml</code> in Python).</p>
<h3 id="sicherheit-makro-payloads-und-versteckte-streams">Sicherheit: Makro-Payloads und versteckte Streams</h3>
<p>Untersuchen Sie Dateien auf <code>.pptm</code>‑Inhalte, die sich als <code>.pptx</code>‑Erweiterungen tarnen. Achten Sie auf <code>ppt/vbaProject.bin</code>, das kompilierten Visual‑Basic‑Code enthält. In standardmäßigen <code>.pptx</code>‑Dateien ist VBA‑Code verboten; das Auffinden von Verweisen auf Binär‑Payloads in Beziehungen sollte sofort Quarantäne‑Flaggen auslösen.</p>
<h2 id="fazit">Fazit</h2>
<p>Reverse Engineering von <code>.pptx</code>‑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.</p>
<p>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.</p>
<h2 id="häufig-gestellte-fragen-faq">Häufig gestellte Fragen (FAQ)</h2>
<p>**Q: Können Sie eine .pptx‑Datei in einen normalen Ordner konvertieren und die Dateien direkt in einer IDE bearbeiten?</p>
<p><strong>A1:</strong> 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.</p>
<p>**Q: Warum sagt PowerPoint, dass meine manuell modifizierte PPTX-Datei repariert werden muss?</p>
<p><strong>A2:</strong> Dies passiert normalerweise, wenn Sie fehlerhaftes XML eingefügt haben, ein neues Asset aus <code>[Content_Types].xml</code> weggelassen haben oder eine lose Referenz in einer zugehörigen <code>.rels</code>-Datei zurückgelassen haben.</p>
<p>**Q: Welche Maßeinheit verwendet PowerPoint für Positionen und Ränder von Formen?</p>
<p><strong>A3:</strong> PowerPoint verwendet English Metric Units (EMUs), wobei 1 Zoll 914,400 EMUs und 1 Punkt 12,700 EMUs entspricht.</p>
<p>**Q: Wie kann ich alle Bilder aus einer Präsentation <a href="https://products.fileformat.com/presentation/python/python-pptx/">programmgesteuert extrahieren</a> ohne externe Bibliotheken?</p>
<p><strong>A4:</strong> Öffnen Sie einfach die <code>.pptx</code>-Datei mit einem beliebigen Standard‑Zip‑Programm und extrahieren Sie alle Binärdateien, die sich im Verzeichnis <code>ppt/media/</code> befinden.</p>
<p>**Q: Ist es sicher, benutzer‑hochgeladene PPTX‑Dateien mit Standard‑XML‑Parsern zu verarbeiten?</p>
<p><strong>A5:</strong> Nein, Sie müssen Ihren Parser härten oder sichere Wrapper wie <code>defusedxml</code> verwenden, um XML External Entity (XXE)- und Zip‑Bomb‑Angriffe zu blockieren.</p>
<h2 id="siehe-auch">Siehe auch</h2>
<ul>
<li><a href="https://blog.fileformat.com/presentation/powerpoint-file-formats/">Präsentationsdateiformate bei FileFormat.com?</a></li>
<li><a href="https://blog.fileformat.com/presentation/apache-poi-api-to-access-powerpoint-file-formats/">Java-API zum Zugriff auf PowerPoint-Dateiformate</a></li>
<li><a href="https://blog.fileformat.com/presentation/odp-vs-pptx-opendocument-vs-microsoft-powerpoint-format-comparison/">ODP vs PPTX: OpenDocument vs Microsoft PowerPoint Präsentationsformat Vergleich</a></li>
<li><a href="https://blog.fileformat.com/presentation/difference-between-ppt-and-pptx/">Unterschied zwischen PPT und PPTX</a></li>
<li><a href="https://blog.fileformat.com/presentation/create-presentation-in-java-with-apache-poi-api/">PowerPoint-Präsentation in Java mit Apache POI API erstellen</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
