
Un désassembleur et décompilateur expérimental pour les scripts TLOU2 DC.

dconstruct est un outil de rétro-ingénierie pour les fichiers DC-Script utilisés dans The Last of Us Part II. Il dispose d'un désassembleur et d'un décompilateur.
Il produit des fichiers .asm contenant les structures et bytecode désassemblés, ainsi que des fichiers .dcpl (DC Pseudo Language) contenant du pseudo-code proche du C.
Vous pouvez également modifier des fichiers via la ligne de commande, y compris remplacer des structures entières avec peu d'effort. Cela rend la création de mods qui changent simplement quelques valeurs dans les fichiers .bin extrêmement facile.
-e, créant de nouveaux fichiers utilisables pour les mods.Tout d'abord, il est recommandé de déplacer le répertoire dconstruct décompressé vers un emplacement sûr, par exemple C:\Program Files.
Pour faciliter au maximum l'utilisation de dconstruct, il est recommandé d'ajouter le répertoire .\bin (situé dans le dossier dconstruct) à votre PATH. Vous trouverez plus d'informations ici, ou suivez ces étapes rapides :

Assurez-vous que votre chemin se termine par "\bin" et NON par "\dconstruct".
Cliquez sur 'OK' dans toutes les boîtes de dialogue ouvertes.
Pour vérifier que cela a fonctionné, ouvrez une nouvelle invite de commande et tapez dconstruct --about. Vous devriez voir une sortie du programme et aucun message d'erreur.
Exécutez une commande comme celle-ci dans la ligne de commande pour générer votre premier fichier désassemblé :```shell dconstruct my_bin_file.bin
Cela produira ensuite un fichier nommé `my_bin_file.bin.asm` dans le même répertoire que votre fichier d'entrée. Vous pouvez ensuite ouvrir ce fichier à l'aide d'un éditeur de texte/code. Je recommande d'utiliser quelque chose comme VSCode qui offre des fonctionnalités de recherche avancées et est adapté aux fichiers volumineux. Le bloc-notes Windows standard n'est pas recommandé.
Pour décompiler un fichier, ajoutez le drapeau `--decompile` lors de l'exécution de la commande.
# Arguments de ligne de commande
- `-i` - fichier ou dossier d'entrée. Peut être omis si le chemin d'entrée est passé comme premier argument.
- `-o` - chemin de sortie. Si votre chemin d'entrée est un dossier, cela ne peut pas être un fichier. Si aucune sortie n'est spécifiée, le fichier .txt sera placé à côté du fichier d'entrée. Si l'entrée est un dossier et qu'aucune sortie n'est spécifiée, le programme créera un répertoire "output" dans le répertoire de travail actuel et y placera tous les fichiers.
- La base sid est chargée à partir de `sidbase.bin` situé à côté de l'exécutable.
- `--no_decompile` - ne pas émettre de code pseudo décompilé dans un fichier .dcpl. Le fichier sera placé à côté du fichier .asm. Ceci est faux par défaut.
- `--no_optimize` - ne pas optimiser et nettoyer le code dcpl. Cela implique l'inlining des appels de fonctions, la suppression des variables inutilisées, la transformation des boucles for compatibles en boucles foreach, et la conversion de certaines chaînes if-else en expressions match.
- `--pascal_case` - convertir les noms de fonctions du jeu en casse Pascal dans la sortie dcpl, par exemple get-boolean -> GetBoolean.
- `--graphs` - émettre des fichiers .svg contenant des graphes de flux de contrôle pour toutes les fonctions décompilées. Chaque fichier .bin obtient son propre dossier contenant tous ses graphes. Cela ralentit **considérablement** la vitesse de décompilation, il n'est donc pas recommandé lors de la décompilation d'un grand nombre de fichiers en même temps.
- `--emit_once` - interdit à la même structure d'être émise deux fois dans le désassemblage. Si une structure apparaît plusieurs fois, seule la première instance sera entièrement émise, et toutes les autres occurrences seront remplacées par une balise `ALREADY_EMITTED`. Cela peut réduire considérablement la taille du fichier.
- `-e` - effectuer une modification. Plus d'informations dans la section ci-dessous.
- `--edit_file` - fournir un fichier d'édition. Un fichier d'édition contient une modification par ligne. Il utilise la même syntaxe que le drapeau -e.
# Qu'est-ce qu'un désassembleur ?
Un [désassembleur](https://en.wikipedia.org/wiki/Disassembler) est un outil qui lit des instructions binaires (aussi appelées [bytecode](https://en.wikipedia.org/wiki/Bytecode) ou [code machine](https://en.wikipedia.org/wiki/Machine_code)) et traduit chacune en une version lisible par l'humain appelée [mnémotechnique](https://en.wikipedia.org/wiki/Assembly_language#Mnemonics). Les désassembleurs ne tentent généralement pas d'interpréter
beaucoup la signification de ces instructions et les transforment simplement 1-1 en leurs versions lisibles. Par exemple, les instructions :```arm
15 00 00 00
4A 01 01 00
43 31 01 00
1C 00 00 01
sont désassemblés dans les versions lisibles par l'homme suivantes :```arm LookupPointer r0, 0 LoadStaticU64Imm r1, 1 Move r49, r1 CallFf r0, r0, 1
Tous les nombres dans le bytecode sont écrits en [hexadécimal](https://en.wikipedia.org/wiki/hexadecimal). La première colonne de chaque ligne représente l'`opcode`, ou le type d'instruction à exécuter. La colonne suivante est le registre de destination, où le résultat de l'opération sera stocké. Les deux dernières colonnes sont les opérandes 1 et 2, qui sont soit des registres, soit des nombres littéraux sur lesquels l'opération sera effectuée. Toutes les instructions n'utilisent pas les 4 octets ; par exemple, la première instruction `LookupPointer` ne nécessite qu'un seul opérande.