
Ein Disassembler und experimenteller Decompiler für TLOU2 DC Scripts.

dconstruct ist ein Reverse-Engineering-Werkzeug für die DC-Script-Dateien, die in The Last of Us Part II verwendet werden. Es verfügt über einen Disassembler und einen Decompiler.
Es gibt .asm-Dateien aus, die die disassemblierten Strukturen und den Bytecode enthalten, sowie .dcpl-Dateien (DC Pseudo Language), die C-ähnlichen Pseudocode enthalten.
Sie können auch Änderungen an Dateien über die Befehlszeile vornehmen, einschließlich des Ersetzens ganzer Strukturen mit geringem Aufwand. Dies macht das Erstellen von Mods, die einfach ein paar Werte in den .bin-Dateien ändern, extrem einfach.
.bin-Datei im Spiel dauert nur wenige Sekunden-e-Flag, Erstellen neuer Dateien, die Sie für Mods verwenden könnenZunächst wird empfohlen, das entpackte dconstruct-Verzeichnis an einen sicheren Ort zu verschieben, z.B. C:\Program Files.
Um dconstruct so benutzerfreundlich wie möglich zu gestalten, wird empfohlen, das .\bin-Verzeichnis innerhalb des dconstruct-Ordners zu Ihrem PATH hinzuzufügen. Weitere Informationen finden Sie hier oder befolgen Sie diese kurzen Schritte:
.\bin-Verzeichnis ein. Es sollte in etwa so aussehen:
\bin endet und NICHT mit \dconstruct.dconstruct --about ein. Sie sollten eine Ausgabe des Programms sehen und keine Fehlermeldung erhalten.Führen Sie einen Befehl wie diesen in der Befehlszeile aus, um Ihre erste disassemblierte Datei zu generieren:```shell dconstruct my_bin_file.bin
Dies gibt dann eine Datei mit dem Namen `my_bin_file.bin.asm` im selben Verzeichnis wie Ihre Eingabedatei aus. Sie können diese Datei dann mit einem Text-/Code-Editor öffnen. Ich würde die Verwendung von etwas wie VSCode empfehlen, das erweiterte Suchfunktionen bietet und gut mit großen Dateien umgehen kann. Der standardmäßige Windows-Editor wird nicht empfohlen.
Um eine Datei zu dekompilieren, fügen Sie das `--decompile`-Flag beim Ausführen des Befehls hinzu.
# Command line arguments
- `-i` - Eingabedatei oder -ordner. Kann weggelassen werden, wenn der Eingabepfad als erstes Argument übergeben wird.
- `-o` - Ausgabepfad. Wenn Ihr Eingabepfad ein Ordner ist, darf dies keine Datei sein. Wenn keine Ausgabe angegeben wird, wird die .txt-Datei neben der Eingabedatei abgelegt. Wenn die Eingabe ein Ordner ist und keine Ausgabe angegeben wird, erstellt das Programm ein "output"-Verzeichnis im aktuellen Arbeitsverzeichnis und legt alle Dateien darin ab.
- Die sidbase wird aus `sidbase.bin` geladen, das sich neben der ausführbaren Datei befindet.
- `--no_decompile` - gibt keinen dekompilierten Pseudocode in eine .dcpl-Datei aus. Die Datei wird neben der .asm-Datei abgelegt. Standardmäßig ist dies deaktiviert.
- `--no_optimize` - optimiert und bereinigt den dcpl-Code nicht. Beinhaltet das Inlinen von Funktionsaufrufen, das Entfernen ungenutzter Variablen, das Umwandeln kompatibler for-Schleifen in foreach-Schleifen und das Umwandeln einiger if-else-Ketten in match-Ausdrücke.
- `--pascal_case` - wandelt die Funktionsnamen des Spiels in Pascal-Schreibweise in der dcpl-Ausgabe um, z.B. get-boolean -> GetBoolean.
- `--graphs` - gibt .svg-Dateien mit Kontrollflussgraphen für alle dekompilierten Funktionen aus. Jede .bin-Datei erhält einen eigenen Ordner mit all ihren Graphen. Dies **verlangsamt** die Dekompilierungsgeschwindigkeit erheblich, daher wird es nicht empfohlen, wenn Sie eine große Anzahl von Dateien gleichzeitig dekompilieren.
- `--emit_once` - verhindert, dass dieselbe Struktur zweimal in der Disassemblierung ausgegeben wird. Wenn eine Struktur mehrfach vorkommt, wird nur die erste Instanz vollständig ausgegeben, und alle weiteren Vorkommen werden durch ein `ALREADY_EMITTED`-Tag ersetzt. Dies kann die Dateigröße erheblich reduzieren.
- `-e` - eine Bearbeitung vornehmen. Weitere Informationen im folgenden Abschnitt.
- `--edit_file` - eine Bearbeitungsdatei bereitstellen. Eine Bearbeitungsdatei enthält eine Bearbeitung pro Zeile. Es wird dieselbe Syntax wie beim -e-Flag verwendet.
# Was ist ein Disassembler?
Ein [Disassembler](https://en.wikipedia.org/wiki/Disassembler) ist ein Werkzeug, das binäre Anweisungen (auch bekannt als [Bytecode](https://en.wikipedia.org/wiki/Bytecode) oder [Maschinencode](https://en.wikipedia.org/wiki/Machine_code)) liest und jede in eine für Menschen lesbare Version übersetzt, die als [Mnemonic](https://en.wikipedia.org/wiki/Assembly_language#Mnemonics) bezeichnet wird. Disassembler versuchen im Allgemeinen nicht, viel über die Bedeutung dieser Anweisungen zu interpretieren, sondern wandeln sie lediglich 1-1 in ihre lesbaren Versionen um. Zum Beispiel die Anweisungen:```arm
15 00 00 00
4A 01 01 00
43 31 01 00
1C 00 00 01
werden in die folgenden menschenlesbaren Versionen zerlegt:```arm LookupPointer r0, 0 LoadStaticU64Imm r1, 1 Move r49, r1 CallFf r0, r0, 1
Alle Zahlen im Bytecode sind in [hexadezimaler](https://en.wikipedia.org/wiki/hexadecimal) Schreibweise angegeben. Die erste Spalte in jeder Zeile stellt den `Opcode` dar, also den Befehlstyp, der ausgeführt wird. Die nächste Spalte ist das Zielregister, in dem das Ergebnis der Operation gespeichert wird. Die letzten beiden Spalten sind die Operanden 1 und 2, bei denen es sich entweder um Register oder Literalzahlen handelt, auf denen die Operation ausgeführt wird. Nicht alle Befehle nutzen alle 4 Bytes – zum Beispiel benötigt der erste `LookupPointer`-Befehl nur einen Operanden.