Utoljára frissítve: 16 Sept, 2026

PPTX Reverse Engineering: Understanding PowerPoint Files Internally

Visszafejtés PPTX fájlok: Fejlesztőknek szóló útmutató

A modern prezentációs anyagok mindent meghajtnak, az befektetői bemutatóktól a belső negyedéves mutatókig. De ha valaha is programozottan kellett szöveget kinyerni, sablonokat helyettesíteni futásidőben, automatikus diakészítőket építeni, vagy bizalmas prezentációkat tisztítani, valószínűleg gyorsan rájöttél valamire: a szabványos magas szintű prezentációs könyvtárak gyakran kiszámíthatatlan fekete dobozként érződnek.

Amikor a python-pptx, Apache POI vagy OpenXML SDK könyvtárak elérik a határaikat – vagy dokumentálatlan elrendezési hibákat vezetnek be – az egyetlen kiút a belülről való áthaladás. Meg kell értened, hogy egy PowerPoint prezentáció valójában mi a bájt- és séma szinten.

Ebben a mélyreható elemzésben leleplezzük a .pptx formátumot, kibontjuk annak belső felépítését, nyomon követjük a kapcsolati gráfot, szétbontjuk a rajzolási hierarchiákat, és gyakorlati stratégiákat mutatunk be a visszafejtéshez, vizsgálathoz és a prezentációk nyers kóddal történő manipulálásához.

1. Mi is valójában egy .pptx fájl?

Alapvetően a .pptx fájl nem egy saját tulajdonú monolitikus bináris, mint az 1990-es évek ősi .ppt formátuma. Amióta a Microsoft bevezette az Office Open XML-et (ECMA-376 és ISO/IEC 29500), a modern Office dokumentumok Open Packaging Conventions (OPC) archívumok.

Egyszerűen fogalmazva: a .pptx fájl csupán egy zip archívum, amely XML dokumentumokat és médiaeszközöket tartalmaz, egy determinisztikus könyvtárfában szervezve.

Ezt másodpercek alatt bizonyíthatod a szokásos terminál eszközök segítségével:

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

Az eredményül kapott könyvtárfa figyelemre méltóan konzisztensnek tűnik:

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

Minden egyes vizuális eszköz, átmenet, diamester öröklődés, szövegdoboz koordináta és vektorgrafika kódolva van ebben a fájlhierarchiában.

2. A csomag felépítése: kulcsfontosságú alrendszerek

A prezentációk hatékony visszafejtéséhez meg kell értened minden felső szintű komponens feladatait.

[Content_Types].xml

Ez az OPC olvasó belépő manifesztje. A fájlkiterjesztéseket és a kifejezett belső részneveket szabványos MIME/tartalomtípusokhoz rendeli. Ha új diát hozol létre vagy képet adsz hozzá, és nem jelented be a [Content_Types].xml-ben, a PowerPoint a prezentációt sérültnek jelzi, és helyreállítást kér.

Példa kódrészlet:

<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>

A _rels/ kapcsolati gráf

Az OpenXML egyik legfontosabb fogalma a kapcsolatokon keresztüli indirekció. Az alkatrészek ritkán mutatnak közvetlenül a nyers fájlutakra. Ehelyett egy fájl (pl. slide1.xml) egy kapcsolati fájlhoz kapcsolódik, amely egy testvér _rels mappában található (pl. _rels/slide1.xml.rels).

A kapcsolatok meghatározzák:

  • Hiperhivatkozások (r:id="rId2", TargetMode=“External”)
  • Képek és hangfájlok, amelyek a ppt/media/ mappában tárolódnak
  • Elrendezés öröklési mutatók (slideLayout1.xml)
  • Jegyzet diák, megjegyzések és beágyazott betűtípusok

docProps/ (Metaadatok)

  • core.xml: Dublin Core metaadatok—szerző, cím, létrehozás dátuma, módosítás időbélyege.
  • app.xml: Alkalmazás-specifikus statisztikák—PowerPoint verzió, összes dia száma, rejtett diák száma, szavak száma, bemutató sablonnevek.

ppt/ (A prezentációs motor)

Itt található a tényleges prezentáció:

  • presentation.xml: A fő gerinc. Regisztrálja a diaazonosítókat, a dia méretméreteket, a jegyzetek főreferenciáit és az alapértelmezett betűtípus-beállításokat.
  • slides/: Az egyes diák (slide1.xml, slide2.xml, stb.).
  • slideLayouts/: Mester struktúra előbeállítások (Címdiák, Két oszlop, Szakaszfejléc).
  • slideMasters/: Globális stílusok, alapértelmezett paletták, háttérkitöltések és helyőrző öröklődés.
  • theme/: Színpaletták (akcentus 1‑től 6‑ig, sötét/világos változatok) és betűtípus-sémák (fő/segéd betűk).
  • media/: Nyers képek (PNG, JPEG, SVG), hang- és videofájlok.

3. Diapozitív felbontása: a PresentationML (p:) és a DrawingML (a:) dialektusok

Amikor megnyitja a ppt/slides/slide1.xml fájlt, két elsődleges XML névtérrel találkozik:

  1. PresentationML (p:): Irányítja a strukturális prezentációs elemeket (diák, alakfa, vászoncsoportok).
  2. DrawingML (a:): Irányítja a tipográfiát, geometriát, 2D koordinátákat, színátmenetes kitöltéseket és a vektoros megjelenítést.

Itt egy leegyszerűsített példa arra, hogy néz ki egy szabványos szöveges alakzat:

<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>

Létfontosságú mértékegységek: EMU-k és pont századok

Figyelje meg a koordinátszámokat a <a:xfrm> elemben:

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

Ezek angol metrikus egységek (EMUs).

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

Az EMU-k lehetővé teszik, hogy egész számok pontos tört részeket ábrázoljanak mind hüvelyk, mind milliméter esetén, anélkül, hogy lebegőpontos kerekítési hibák lépnének fel különböző hardverarchitektúrák között.

Figyelje meg a betűméretet is:

  • sz=\"3200\" azt jelenti, hogy 32,00 pt. A DrawingML-ben a betűméreteket a pont századrészében mérik.

4. Az öröklődési lánc: Miért örökölnek a formák láthatatlan stílusokat

Az egyik leggyakoribb buktató a PPTX fájlok visszafejtésekor az, amikor azt feltételezzük, hogy egy alakzat vizuális stílusa teljes mértékben a saját slideX.xml fájljában van deklarálva.

Valójában az OpenXML egy szigorú 4 szintű kaszkádos öröklődési modellre támaszkodik:

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

Ha egy szövegdoboz a slide1.xml-ben a következőt tartalmazza:

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

A <a:r> futáshoz nincs megadva betűcsalád, explicit szín és méret sem. Ahhoz, hogy kiderítsd, hogyan jeleníti meg a PowerPoint ezt a szöveget, a parserednek a következőket kell tennie:

  1. Azonosítsd a helyőrző típusát (<p:ph type="title"/>).
  2. Olvasd el a slide1.xml.rels-ben hivatkozott elrendezést.
  3. Ellenőrizd, hogy a slideLayout1.xml biztosít-e stílus felülírásokat az adott helyőrzőhöz.
  4. Térj vissza a slideMaster1.xml-hez az alapértelmezett cím szövegtörzs stílusokért.
  5. Kövesd nyomon a szín tokeneket, mint a accent1 vagy tx1, a theme1.xml-ben, hogy megtaláld a hexadecimális színkódot.

Ha kihagyod ezt az öröklődési gráfot, a parsered helytelenül olvassa a stílusokat, hiányzó betűtípusokat, betűméreteket és az elrendezés horgonyait.

5. Gyakorlati fordított mérnöki munkafolyamat

Amikor meg kell vizsgálnod, hogy egy adott PowerPoint funkció hogyan működik a háttérben (pl. morph átmenetek, összetett táblázatok, vektor útvonalak), kövesd ezt az empirikus megközelítést:

1. lépés: Hozzon létre egy minimális “Diff párost”

  1. Nyissa meg a PowerPointot, és hozzon létre egy üres diát.
  2. Mentse el before.pptx néven.
  3. Alkalmazza a pontos egyetlen módosítást, amelyet visszafejteni szeretne (például adjon árnyékot egy körnek, változtassa meg a felsorolás stílusát, szúrjon be egy beágyazott videót).
  4. Mentse el after.pptx néven.

2. lépés: Csomagolja ki mindkét archívumot

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

3. lépés: Formázza az XML-t

Az Office-archívumokban lévő nyers XML általában elveszíti a behúzásokat és az újsor karaktereket. A diffelés előtt formázza a fájlokat:

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

4. lépés: Futtasson egy egységes diff-et

diff -uNr before/ after/ > changes.patch

A changes.patch áttekintése feltárja a pontos címke nevét, a névtér attribútumát és a PowerPoint által bevezetett konténer hierarchiát. Ez a leggyorsabb módja annak, hogy dokumentálatlan vagy rejtett séma tulajdonságokat fedezzünk fel anélkül, hogy ezrek oldalait kellene átböngészni az ECMA-376 dokumentációnak.

6. Egyedi mikro-motor építése: kibontás, módosítás, újracsomagolás

Néha nem szeretne nehéz vállalati függőséget, mint az Apache POI vagy a Microsoft OpenXML SDK—különösen könnyű, szerver nélküli környezetekben (AWS Lambda, Cloudflare Workers, edge node-ok).

Itt egy önálló Python minta, amely bemutatja, hogyan lehet biztonságosan kicsomagolni egy memóriában lévő PPTX-et, egyedi adatokat injektálni a szabványos könyvtári eszközökkel, és újra csomagolni azt:

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()

Kulcsfontosságú buktatók a fájlok nyers bájtszinten történő módosításakor:

  1. Névtér megőrzése: Az XML-elemzők gyakran átírják az előtagokat (xmlns:p lehet, hogy xmlns:ns0). Bár érvényes XML, a PowerPoint szigorú belső sémaellenőrzése időnként elutasítja a nem szabványos előtag aliasokat. Regisztrálja a névtereket kifejezetten.
  2. ZIP tömörítési módszerek: Győződjön meg róla, hogy a fájlokat a szabványos deflate tömörítéssel (zipfile.ZIP_DEFLATED) írja vissza.
  3. Stream kiürítése: Mindig ellenőrizze, hogy a zip puffer teljesen lezárul és kiürül, mielőtt a bájtokat továbbküldené.
  4. Kapcsolatok megőrzése: Ha eltávolít egy diát, akkor azt is el kell távolítania a ppt/presentation.xml-ből, törölnie kell a kapcsolódását a ppt/_rels/presentation.xml.rels-ben, és tisztítania kell a tartalomtípusát a [Content_Types].xml-ből.

7. Teljesítmény- és biztonsági szempontok

A PPTX fájlok visszafejtése nem csak a diák szerkesztéséről szól; hanem arról is, hogy ellenőrizze, mi kerül a rendszereibe.

Biztonság: Milliárd Nevetés & XXE

Mivel a PPTX fájlok XML-t dolgoznak fel, bármely szerveroldali folyamat, amely felhasználók által beküldött prezentációkat dolgoz fel, sebezhető a következőkre:

  • XML külső entitás (XXE) befecskendezés: Rosszindulatú XML, amely megpróbál hozzáférni a /etc/passwd-hez vagy lekérdezni a belső felhő metaadat végpontokat (http://169.254.169.254/).
  • Entitás bővítési támadások (Billion Laughs): Exponenciális entitásciklusok, amelyek kimerítik a rendszer RAM-át.

Mérséklés: Mindig tiltsa le a resolve_entities, load_dtd és a külső hálózati feloldást az XML elemzőjében (például a Pythonban a defusedxml használatával).

Biztonság: Makró Terhek és Rejtett Adatfolyamok

Ellenőrizze a fájlokat, hogy van-e .pptm tartalom, amely .pptx kiterjesztés alatt rejtőzik. Figyeljen a ppt/vbaProject.bin fájlra, amely lefordított Visual Basic kódot tartalmaz. A szabványos .pptx fájlokban a VBA kód tiltott; ha bináris payload hivatkozásokat talál a kapcsolatokban, azonnal karanténjelzést kell kiváltani.

Összegzés

A .pptx fájlok visszafejtése leleplezi a prezentációs szoftver titkait. Amint felismeri, hogy a PowerPoint fájlok egyszerűen felépített zip csomagok, amelyek koordinátákkal, séma hivatkozásokkal és XML kapcsolati fákkal vannak telepítve, már nem korlátozzák a meglévő harmadik fél absztrakciói.

Akár a diák generálásának áteresztőképességét optimalizálja, egyedi automatizált szanitizálókat ír, vagy a renderelési hibákat hárítja, a mögöttes OpenXML architektúrára való közvetlen tekintés teljes irányítást biztosít a prezentációs folyamat felett.

Gyakran Ismételt Kérdések (GYIK)

**Q: Átalakíthatja a .pptx fájlt egy szabványos mappává, és közvetlenül egy IDE-ben szerkesztheti a fájlokat?

A1: Igen, kicsomagolhatja az archívumot, szerkesztheti az XML-t egy olyan szerkesztőben, mint a VS Code, majd újra zip-elheti a könyvtár tartalmát, hogy újra megnyithassa a PowerPointban.

**Q: Miért mondja a PowerPoint, hogy a manuálisan módosított PPTX fájlom javítást igényel?

A2: Ez általában akkor fordul elő, ha hibás XML-t vezet be, kihagy egy új eszközt a [Content_Types].xml-ból, vagy egy függőben lévő hivatkozást hagy egy kapcsolódó .rels fájlban.

**Q: Milyen mérőegységet használ a PowerPoint az alakzatok pozícióihoz és margóihoz?

A3: A PowerPoint az angol metrikus egységeket (EMU-k) használja, ahol 1 hüvelyk 914,400 EMU-nak, 1 pont pedig 12,700 EMU-nak felel meg.

**Q: Hogyan tudom programozottan kinyerni az összes képet egy prezentációból külső könyvtárak nélkül?

A4: Egyszerűen nyissa meg a .pptx fájlt bármely szabványos zip eszközzel, és csomagolja ki az összes bináris fájlt, amely a ppt/media/ könyvtárban található.

**Q: Biztonságos-e a felhasználók által feltöltött PPTX fájlok feldolgozása szabványos XML elemzőkkel?

A5: Nem, meg kell erősítenie az elemzőjét, vagy biztonságos burkolókat kell használnia, például a defusedxml-t, hogy megakadályozza az XML külső entitás (XXE) és zip-bomb támadásokat.

Lásd még