
Un disassemblatore e decompilatore sperimentale per script TLOU2 DC.

dconstruct è uno strumento di reverse engineering per i file DC-Script utilizzati in The Last of Us Parte II. Dispone di un disassemblatore e di un decompilatore.
Produce file .asm contenenti le strutture disassemblate e il bytecode, oltre a file .dcpl (DC Pseudo Language) contenenti pseudo-codice simile al C.
Puoi anche apportare modifiche ai file tramite la riga di comando, inclusa la sostituzione di intere strutture con poco sforzo. Ciò rende estremamente semplice la creazione di mod che modificano semplicemente un paio di valori all'interno dei file .bin.
-e, creando nuovi file che puoi utilizzare per le modPrima di tutto, si consiglia di spostare la directory dconstruct decompressa in una posizione sicura, ad esempio C:\Program Files.
Per rendere dconstruct il più facile possibile da usare, si consiglia di aggiungere la directory .\bin all'interno della cartella dconstruct al tuo PATH. Puoi scoprire di più qui, oppure seguire questi rapidi passaggi:

Assicurati che il percorso termini con '\bin' e NON con '\dconstruct'.
Fai clic su 'OK' su tutte le finestre di dialogo aperte.
Per verificare che abbia funzionato, apri un nuovo prompt dei comandi e digita dconstruct --about. Dovresti vedere un output dal programma e nessun messaggio di errore.
Esegui un comando come questo nella riga di comando per generare il tuo primo file disassemblato:```shell dconstruct my_bin_file.bin
Questo produrrà un file chiamato `my_bin_file.bin.asm` nella stessa directory del file di input. Puoi quindi aprire quel file con un editor di testo/codice. Raccomando di usare qualcosa come VSCode, che offre funzionalità avanzate di ricerca ed è adatto a gestire file di grandi dimensioni. Il Blocco note standard di Windows non è consigliato.
Per decompilare un file, aggiungi il flag `--decompile` quando esegui il comando.
# Argomenti della riga di comando
- `-i` - file o cartella di input. Può essere omesso se si passa il percorso di input come primo argomento.
- `-o` - percorso di output. Se il percorso di input è una cartella, questo non può essere un file. Se non viene specificato alcun output, il file .txt verrà posizionato accanto al file di input. Se l'input è una cartella e nessun output è specificato, il programma creerà una directory "output" nella directory di lavoro corrente e metterà tutti i file lì.
- Il sidbase viene caricato da `sidbase.bin` situato accanto all'eseguibile.
- `--no_decompile` - non emettere pseudo codice decompilato in un file .dcpl. Il file verrà posizionato accanto al file .asm. Questo è falso per impostazione predefinita.
- `--no_optimize` - non ottimizzare e pulire il codice dcpl. Implica l'inlining delle chiamate di funzione, la rimozione di variabili inutilizzate, la trasformazione di cicli for compatibili in cicli foreach e la conversione di alcune catene if-else in espressioni match.
- `--pascal_case` - convertire i nomi delle funzioni dei giochi in pascal case nell'output dcpl, ad esempio get-boolean -> GetBoolean.
- `--graphs` - emettere file .svg contenenti i grafi di flusso di controllo per tutte le funzioni decompilate. Ogni file .bin ottiene la propria cartella contenente tutti i suoi grafi. Questo **rallenta significativamente** la velocità di decompilazione, quindi non è consigliato quando si decompila un gran numero di file contemporaneamente.
- `--emit_once` - impedisce che la stessa struttura venga emessa due volte nel disassemblaggio. Se una struttura appare più volte, solo la prima istanza verrà completamente emessa, e tutte le altre occorrenze saranno sostituite da un tag `ALREADY_EMITTED`. Questo può ridurre significativamente la dimensione del file.
- `-e` - effettuare una modifica. Maggiori informazioni nella sezione seguente.
- `--edit_file` - fornire un file di modifica. Un file di modifica contiene una modifica per riga. Utilizza la stessa sintassi del flag -e.
# Cos'è un disassemblatore?
Un [disassemblatore](https://en.wikipedia.org/wiki/Disassembler) è uno strumento che legge istruzioni binarie (note anche come [bytecode](https://en.wikipedia.org/wiki/Bytecode) o [codice macchina](https://en.wikipedia.org/wiki/Machine_code)) e traduce ciascuna in una versione leggibile dall'uomo chiamata [mnemonico](https://en.wikipedia.org/wiki/Assembly_language#Mnemonics). I disassemblatori generalmente non cercano di interpretare molto il significato di queste istruzioni e le trasformano semplicemente 1-1 nelle loro versioni leggibili. Ad esempio, le istruzioni:```arm
15 00 00 00
4A 01 01 00
43 31 01 00
1C 00 00 01
vengono disassemblate nelle seguenti versioni leggibili dall'uomo:```arm LookupPointer r0, 0 LoadStaticU64Imm r1, 1 Move r49, r1 CallFf r0, r0, 1
Tutti i numeri nel bytecode sono scritti in [esadecimale](https://en.wikipedia.org/wiki/hexadecimal). La prima colonna in ogni riga rappresenta l'`opcode`, ovvero il tipo di istruzione da eseguire. La colonna successiva è il registro di destinazione, dove verrà memorizzato il risultato dell'operazione. Le ultime due colonne sono gli operandi 1 e 2, che sono registri o numeri letterali su cui verrà eseguita l'operazione. Non tutte le istruzioni utilizzano tutti e 4 i byte; ad esempio, la prima istruzione `LookupPointer` richiede un solo operando.