Wie man eine Godot-Standalone-EXE entpackt (am Beispiel von "Succulent Rest")
Dieser Artikel dokumentiert die praktische Vorgehensweise beim Entpacken des Steam-Spiels "Succulent Break" am 11.09.2026.

Wird gerendert...
Dieser Artikel dokumentiert die tatsächliche Vorgehensweise beim Entpacken des Steam-Spiels "Succulent Break" (App-ID **4536070**) am **11.09.2026**. Dies ist kein allgemeiner Tutorial zum Knacken von Spielen, sondern gilt nur für: Sie haben das Spiel legal installiert, die Ressourcenpakete sind **unverschlüsselt** und das Ziel ist es, die vom Spiel bereitgestellten Bestiarien-Tabellen und Icons auszulesen.
Die entpackten Ergebnisse werden als Daten für die Enzyklopädie auf der Website **MainGamers** verwendet: [Succulent Break Enzyklopädie - MainGamers](https://www.maingamers.com/zh/games/succulent-break)
---
## Kurze Übersicht der Entpackungsschritte
Es wurden keine GDRE Tools, AssetStudio, FModel oder zusätzliche Debugger verwendet.
Der Prozess ist wie folgt:
1. Betrachten Sie die Dateistruktur im Installationsverzeichnis, um die Engine als **Godot** zu identifizieren.
2. Finden Sie das eingebettete **PCK** (Ressourcenpaket) am Ende von `succulent-break.exe`.
3. Parsen Sie das Dateiverzeichnis gemäß dem Godot 4.7 pack format **4**.
4. Extrahieren Sie `assets/data/*.json` (Bestiarien-Tabellen im Klartext).
5. Folgen Sie `.png.import`, um `.ctex` zu finden, und schneiden Sie die eingebetteten **WebP**-Bilder aus GST2 als Icons aus.
Die Zahlen in den Bestiarien stammen alle aus diesen JSON-Dateien und wurden nicht erraten oder aus Spieler-Speicherständen ausgelesen.
---
## 1. Zuerst die Engine erkennen, dann den Entpacker wählen
Das Steam-Installationsverzeichnis von "Succulent Break" enthält nur drei Dateien:
| Datei | Zweck |
| --- | --- |
| `succulent-break.exe` (ca. 110 MB) | Engine + Spielressourcen in einem eigenständigen Paket |
| `steam_api64.dll` | Steamworks |
| `libgodotsteam.windows.template_debug.x86_64.dll` | GodotSteam Plugin |
Der Dateiname des letzteren gibt direkt die Engine preis: **Godot + GodotSteam**. Eine einzelne EXE-Datei ohne `data.win` / `Game_Data` / `Paks` / `UnityPlayer.dll` kann auch indirekt darauf hindeuten, dass es sich nicht um Unity / Unreal handelt.
Die Bedeutung der Erkennung der Engine:
| Engine | Häufiger Speicherort der Ressourcen | Vorherige Fälle in diesem Repository |
| --- | --- | --- |
| Godot eigenständiger Export | Eingebettetes PCK am Ende der EXE oder separates `.pck` daneben | Dieser Artikel / `scrape-pck.mjs` |
| Unity | `*_Data/sharedassets*`, Addressables | Über UnityFS wie in "Book of Gates" |
| Unreal | `*.pak` / `*.utoc` | FModel |
| Tauri / Electron | Eingebettetes JS in der EXE | Bull Run Clicker `scrape-exe.mjs` |
Wenn Sie die Engine falsch erkennen, suchen Sie nach einem nicht vorhandenen `globalgamemanagers`. Dieser Schritt erfordert nur die Betrachtung von Dateinamen und Verzeichnissen, das Ausführen des Spiels ist nicht erforderlich.
---
## 2. Wo Godot mit eigenständigem Export das PCK versteckt
Beim Export von Godot mit "eingebettetem PCK" ist das Layout wie folgt:
```
[ PE-Ausführbare Datei (Engine) | PCK-Ressourcenpaket | 12-Byte-Footer ]
```
Der Footer ist fest **12 Bytes** lang, Little-Endian:
| Offset (relativ zum Dateiende) | Typ | Bedeutung |
| --- | --- | --- |
| `-12 .. -4` | `uint64` | Anzahl der PCK-Bytes (ohne diesen 12-Byte-Footer) |
| `-4 .. 0` | `uint32` | Magische Zahl `GDPC` (`0x43504447`) |
Praxistest dieses Spiels:
```
Dateigröße = 115247400
Letzte 4 Bytes ASCII = GDPC
PCK-Größe = 12264220
PCK-Start = 115247400 - 12 - 12264220 = 102983168
```
Entsprechender Code in Node:
```js
const magic = buffer.readUInt32LE(buffer.length - 4); // Muss 0x43504447 sein
const pckSize = Number(buffer.readBigUInt64LE(buffer.length - 12));
const offset = buffer.length - 12 - pckSize;
```
Wenn das Ende nicht `GDPC` ist, prüfen Sie, ob sich eine separate `succulent-break.pck`-Datei im selben Verzeichnis befindet. Wenn beides nicht zutrifft, kommen Sie zum Zweig "Ressourcenverschlüsselung / Nicht-Godot".
---
## 3. Parsen des PCK-Headers und des Dateiverzeichnisses
Lesen Sie ab dem PCK-Start eine weitere Gruppe von Headern (Godot 4.x, format ≥ 2):
| Feld | Größe | Dieses Spiel |
| --- | --- | --- |
| magic | 4 | Wieder ein `GDPC` |
| pack format | 4 | **4** (Godot 4.5+ hat das Verzeichnis ans Ende des Pakets verschoben) |
| Engine Major/Minor/Patch | 4+4+4 | **4.7.1** |
| flags | 4 | `2` = `PACK_REL_FILEBASE` (Dateioffsets relativ zu `file_base`) |
| file_base | 8 | `112` |
| reserved[16] | 64 | `reserved[0] = 12181696`, d.h. **Offset des Verzeichnisses relativ zum PCK-Start** |
Format 2 alte Pakete: Das Verzeichnis folgt direkt auf `reserved`.
Format 3/4: Das Verzeichnis befindet sich am Ende des Pakets, der Offset wird in `reserved[0]` gespeichert. Wenn dieses Spiel die 4 Bytes nach `reserved` als `file_count` interpretiert, liest es **0** – dies ist ein Signal, dass das Verzeichnis verschoben wurde, also nicht stoppen.
Verzeichniseintrag (für jede Datei):
```
uint32 path_len
bytes path // UTF-8, Godot-Ressourcenpfad, ohne "res://" Präfix
uint64 offset
uint64 size
bytes md5[16]
uint32 flags // Verschlüsselungs-/Löschmarkierung; in diesem Paket alles 0
```
Dieses Paket hat **862** Dateien. Beim tatsächlichen Auslesen des Inhalts:
```
Absoluter Offset = pck-Start + (PACK_REL_FILEBASE ? file_base : 0) + Eintrag.offset
```
Die Verteilung der Dateierweiterungen sagt Ihnen direkt, wo sich die Daten befinden:
| Erweiterung | Ungefähre Anzahl | Bedeutung |
| --- | --- | --- |
| `.ctex` / `.import` | Jeweils über dreihundert | Importierte Texturen und Sidecars |
| `.gdc` / `.remap` | Dutzende | Kompilierte GDScripts, werden in diesem Durchgang nicht gelesen |
| `.json` | **7** | Tatsächliche Quelle der Bestiarien |
| `.scn` / `.sample` / Audio | Der Rest | Szenen und Soundeffekte |
Häufige Muster bei Indie-Spielen: "Tabellen in JSON / CSV / Tres, Code in Skripten". Suchen Sie zuerst nach `assets/data/`, `data/`, `json` nach Pfad, nicht zuerst dekompilieren.
---
## 4. Extrahieren der Bestiarien-JSONs
Die sieben Tabellen in diesem Paket befinden sich alle in `assets/data/`:
| Datei | Zweck |
| --- | --- |
| `succulents.json` | Sukkulenten: Farbgruppe, Schwierigkeit der Farbgebung, alte Setzlinge, Freischaltketten, Wahrscheinlichkeit für Blattstecklinge |
| `pots.json` | Blumentöpfe: Serie, Ladenpreis |
| `soils.json` | Erde: Trocknungsrate, Spezialeffekte |
| `shelves.json` | Regale / Tische: Steckplätze, Preis |
| `leaf.json` | Blattfarben und Verkaufspreise |
| `weather_tools.json` | Wetterwerkzeuge |
| `translations.json` | Offizielle **zh / en** Namen und Beschreibungen |
Godot-JSONs erlauben **Endkommas**, was zu einem Fehler bei `JSON.parse` führt. Entfernen Sie zuerst das Komma vor `}` / `]` und parsen Sie dann:
```js
JSON.parse(text.replace(/,(\s*[}\]])/g, "$1"))
```
Die Originaltexte werden unverändert in `admin/resources/succulent-break/raw/assets/data/` gespeichert; nach dem Entfernen des Endkommas und dem Hinzufügen von chinesischen und englischen Namen wird es als `catalog.json` geschrieben. Ändern Sie die Werte in den Originalquellen nicht.
Spieler-Speicherstände sind eine andere Sache:
```
%APPDATA%\Godot\app_userdata\Succulent Break\succulentbreak.json
```
Dies sind Fortschrittsdaten (welche Blumen besitzen, Gold, freigeschaltete Haken), **nicht** die Definitionen der Bestiarien. Sammeln Sie für die Enzyklopädie keine Speicherstände als Hauptquelle und committen Sie sie nicht in Git.
---
## 5. Icons: `.import` → `.ctex` → WebP
Im exportierten Projekt sind die ursprünglichen PNGs oft nicht mehr vorhanden, nur noch:
1. `assets/sprites/ui/succulents/campfire.png.import` (Text-Sidecar)
2. `.godot/imported/campfire.png-<hash>.ctex` (Godot komprimierte Textur)
In `.import` gibt es eine Zeile:
```
path="res://.godot/imported/campfire.png-98faa0cccb7f279e7901ae49e55b370b.ctex"
```
Entfernen Sie `res://`, um es im PCK-Verzeichnis mit `.ctex` abzugleichen.
`.ctex` beginnt mit `GST2` (Godot Stream Texture 2). Die UI-Bilder dieses Spiels sind 32×32 und **betten WebP in GST2 ein** (`DATA_FORMAT_WEBP`): Suchen Sie im Blob nach `RIFF....WEBP` und schneiden Sie das vollständige WebP gemäß der `uint32`-Länge von RIFF aus.
```js
const start = blob.indexOf(Buffer.from("RIFF"));
const size = blob.readUInt32LE(start + 4); // RIFF-Payload-Länge (ohne 8-Byte-Header)
const webp = blob.subarray(start, start + 8 + size);
```
Extrahieren Sie nur die UI-Bilder der Bestiarien (`assets/sprites/ui/...`), und behandeln Sie nicht die Wachstumsphasen-Porträts oder Animationsframes (z.B. `orange_left` / `orange_right` für Blätter) als Icon-Einträge. In diesem Durchgang gibt es **69** UI-Icons, 0 fehlen.
Wenn `.ctex` kein `RIFF`/`WEBP` enthält, handelt es sich möglicherweise um eine PNG-Payload, Basis oder VRAM-Komprimierung (DXT/BPTC). Diese müssen gemäß Godot `Image::Format` dekodiert werden und können nicht auf diese Weise ausgeschnitten werden.
---
## 6. Die gesamte Pipeline
```mermaid
flowchart TD
A["Steam Installationsverzeichnis"] --> B["Libgodotsteam / Einzel-EXE gesehen"]
B --> C["Lese GDPC-Footer am Ende der EXE"]
C --> D["PCK-Header: Godot 4.7.1 format 4"]
D --> E["reserved[0] lokalisiert Verzeichnis"]
E --> F["Listet 862 Pfade auf"]
F --> G["assets/data/*.json"]
F --> H["ui/*.png.import"]
G --> I["Entferne Endkommas + Übersetzungen"]
I --> J["catalog.json"]
H --> K["GST2 eingebettetes WebP"]
K --> L["icons-raw/"]
```
Ein-Klick-Neustart im Repository (ohne Spielstart, ohne Datenbankschreibung):
```bash
cd admin
node scripts/succulent-break/scrape-pck.mjs
```
Standardpfad: `D:\SteamLibrary\steamapps\common\Succulent Break\succulent-break.exe`
Überschreiben: Umgebungsvariable `SUCCULENT_BREAK_EXE` oder den Pfad der EXE als erstes Argument übergeben.
Die Produkte befinden sich in `admin/resources/succulent-break/` (wird von Git ignoriert):
| Pfad | Inhalt |
| --- | --- |
| `raw/assets/data/*.json` | Original-PCK |
| `raw/catalog.json` | Analysierbare zusammengeführte Tabelle |
| `raw/pck-manifest.json` | Liste mit 862 Pfaden |
| `icons-raw/{type}/*.webp` | UI-Icons |
---
## 7. Klare Aussage, was nicht getan wurde
| Vorgehensweise | Warum nicht getan |
| --- | --- |
| GDRE Tools zur Wiederherstellung des Projekts | Nur Tabellen und Icons benötigt, keine Wiederherstellung von `.tscn` / Editor-Projekten |
| Dekompilierung von `.gdc` | Skripte in diesem Paket sind kompilierte Bytecodes (Avatar `GDSC`), nicht entschlüsselt; daher sind die Formeln für Gießen / Färben als "unentschieden" markiert |
| Lesen des Speichers / Anhängen an einen laufenden Prozess | Statisches PCK ist ausreichend |
| Lesen von Speicherständen als Hauptquelle für die Enzyklopädie | Speicherstände sind Fortschrittsdaten |
| Systemübersetzung oder KI-Übersetzung ins Japanische | Das Spiel enthält nur zh/en (G11) |
| Schreiben von `game_data_*` | Nur Datenerfassung in diesem Durchgang |
Steam-Erfolge (6 Einträge auf der Shop-Seite) befinden sich nicht in den PCK-JSONs, sondern werden über die gemeinsame `GetSchemaForGame`-Pipeline abgerufen. Siehe `docs/060-steam-achievements-game-hub.md`.
---
## 8. Wiederverwendung für ein anderes Godot-Spiel
Wenn Sie diese Liste befolgen, können Sie die gleiche Analyse wiederverwenden:
1. Das Installationsverzeichnis enthält `*godot*`-DLLs oder die EXE endet mit `GDPC`.
2. Das PCK ist **unverschlüsselt** (Verzeichniseintrag `flags` enthält nicht das Verschlüsselungs-Bit; extrahierte JSONs können als Text geöffnet werden).
3. Tabellen befinden sich in `json` / `csv` / `tres`, nicht nur in Skriptkonstanten.
Was normalerweise geändert werden muss, ist normalerweise: der Standard-EXE-Pfad, ob `assets/data/` umbenannt wird, das Präfix von `.import`-Icons.
Die folgenden Situationen sollten **nicht** mit diesem Skript behandelt werden:
- Unity / Unreal / RPG Maker / GameMaker.
- PCK-Verzeichnisverschlüsselung (`PACK_DIR_ENCRYPTED`) oder Einzeldatei-Verschlüsselung (`PACK_FILE_ENCRYPTED`).
- Bestiarien nur in `.gdc`-Konstanten, ohne JSON.
- `.ctex` ist keine WebP/PNG-Payload (echte VRAM-Komprimierung).
Für solche Fälle benötigen Sie andere Werkzeuge (Paketentpacker für die entsprechende Engine, GDRE oder ein offizielles Debug-Paket) und sollten keine Patches auf diesem Skript erzwingen.
---
## 10. Compliance-Hinweis
Wir empfehlen allen, nur Clients zu entpacken, die sie gekauft und installiert haben, und die entpackten Inhalte auf legale und konforme Weise zu verwenden!Kommentar
Melde dich an, um Kommentare anzuzeigen und zu veröffentlichen
Zur Anmeldung