
Um desmontador & decompilador experimental para scripts TLOU2 DC.

dconstruct é uma ferramenta de engenharia reversa para os arquivos DC-Script usados em The Last of Us Part II. Possui um desmontador e um descompilador.
Ele gera arquivos .asm contendo as estruturas desmontadas e bytecode, bem como arquivos .dcpl (DC Pseudo Language) contendo pseudo-código semelhante a C.
Você também pode fazer edições nos arquivos via linha de comando, incluindo a substituição de estruturas inteiras com pouco esforço. Isso torna extremamente fácil criar mods que simplesmente alteram alguns valores dentro dos arquivos .bin.
-e, criando novos arquivos que você pode usar para mods.Primeiro, é recomendado que você mova o diretório dconstruct descompactado para algum local seguro, como C:\Program Files.
Para tornar o dconstruct o mais fácil de usar possível, é recomendado que você adicione o diretório .\bin dentro da pasta dconstruct ao seu PATH. Você pode saber mais aqui, ou seguir estes passos rápidos:

dconstruct --about. Você deve ver alguma saída do programa e nenhuma mensagem de erro.Execute um comando como este na linha de comando para gerar seu primeiro arquivo desmontado:```shell dconstruct my_bin_file.bin
Isto irá então gerar um ficheiro chamado `my_bin_file.bin.asm` no mesmo diretório que o seu ficheiro de entrada. Pode então abrir esse ficheiro usando um editor de texto/código. Recomendo usar algo como VSCode que oferece funcionalidades avançadas de pesquisa e é bom a lidar com ficheiros grandes. O bloco de notas padrão do Windows não é recomendado.
Para descompilar um ficheiro, adicione a flag `--decompile` ao executar o comando.
# Argumentos da linha de comandos
- `-i` - ficheiro ou pasta de entrada. Pode ser omitido se for passado o caminho de entrada como primeiro argumento.
- `-o` - caminho de saída. Se o seu caminho de entrada for uma pasta, este não pode ser um ficheiro. Se não for especificada uma saída, o ficheiro .txt será colocado junto ao ficheiro de entrada. Se a entrada for uma pasta e não for especificada uma saída, o programa criará um diretório "output" no diretório de trabalho atual e colocará todos os ficheiros lá.
- A sidbase é carregada de `sidbase.bin` localizado junto ao executável.
- `--no_decompile` - não emite código pseudo decompilado para um ficheiro .dcpl. O ficheiro será colocado junto ao ficheiro .asm. Isto é falso por predefinição.
- `--no_optimize` - não otimiza e limpa o código dcpl. envolve a inlining de chamadas de funções, remoção de variáveis não utilizadas, transformação de loops for compatíveis em loops foreach e transformação de algumas cadeias if-else em expressões match.
- `--pascal_case` - converte os nomes das funções dos jogos para pascal case na saída dcpl, por exemplo, get-boolean -> GetBoolean.
- `--graphs` - emite ficheiros .svg contendo grafos de fluxo de controlo para todas as funções descompiladas. Cada ficheiro .bin tem a sua própria pasta contendo todos os seus grafos. Isto **significativamente** atrasa a velocidade de descompilação, por isso não é recomendado quando se descompila um grande número de ficheiros ao mesmo tempo.
- `--emit_once` - proíbe que a mesma estrutura seja emitida duas vezes na desmontagem. Se uma estrutura aparecer múltiplas vezes, apenas a primeira instância será totalmente emitida, e todas as outras ocasiões serão substituídas por uma tag `ALREADY_EMITTED`. Isto pode reduzir significativamente o tamanho do ficheiro.
- `-e` - faz uma edição. Mais informações na secção abaixo.
- `--edit_file` - fornece um ficheiro de edição. um ficheiro de edição contém uma edição por linha. usa a mesma sintaxe que a flag -e.
# O que é um desassemblador?
Um [desassemblador](https://en.wikipedia.org/wiki/Disassembler) é uma ferramenta que lê instruções binárias (também conhecido como [bytecode](https://en.wikipedia.org/wiki/Bytecode) ou [código de máquina](https://en.wikipedia.org/wiki/Machine_code)) e traduz cada uma numa versão legível por humanos chamada de [mnemónico](https://en.wikipedia.org/wiki/Assembly_language#Mnemonics). Os desassembladores geralmente não tentam interpretar muito sobre o significado destas instruções e apenas as transformam 1-1 nas suas versões legíveis. Por exemplo, as instruções:```arm
15 00 00 00
4A 01 01 00
43 31 01 00
1C 00 00 01
são desmontados nas seguintes versões legíveis por humanos:```arm LookupPointer r0, 0 LoadStaticU64Imm r1, 1 Move r49, r1 CallFf r0, r0, 1
Todos os números no bytecode são escritos em [hexadecimal](https://en.wikipedia.org/wiki/hexadecimal). A primeira coluna em cada linha representa o `opcode`, ou o tipo de instrução a ser executada. A próxima coluna é o registo de destino, onde o resultado da operação será armazenado. As duas últimas colunas são os operandos 1 e 2, que são registos ou números literais sobre os quais a operação será realizada. Nem todas as instruções usam todos os 4 bytes; por exemplo, a primeira instrução `LookupPointer` precisa apenas de um operando.
O desmontador dconstruct também adiciona algumas informações adicionais destinadas a tornar a leitura das instruções um pouco mais fácil. Ele também insere rótulos (e.g. `L_0`) para tornar mais fácil rastrear a ramificação no código.```arm
15 00 00 00 LookupPointer r0, 0 r0 = ST[0] -> <is-player-abby?>
4A 01 01 00 LoadStaticU64Imm r1, 1 r1 = ST[1] -> <player>
43 31 01 00 Move r49, r1 r49 = player
1C 00 00 01 CallFf r0, r0, 1 r0 = is-player-abby?(player)
2F 0D 00 00 BranchIfNot r0, 0xD IF NOT r0 => L_0
Isso é útil quando você deseja visualizar o conteúdo bruto do arquivo sem que o programa faça muitas suposições. Mas pode ser difícil de ler para grandes blocos de código, pois não há estrutura alguma. É aí que entra um descompilador.