
Decompilatore, assemblatore e disassemblatore Java
Krakatau fornisce un assembler e un disassembler per bytecode Java, che ti permettono di convertire file di classe binari in un formato di testo leggibile, apportare modifiche e riconvertirli in un file di classe, anche per codice offuscato. Puoi anche creare tuoi file di classe da zero scrivendo bytecode manualmente e puoi esaminare e confrontare dettagli di basso livello di binari Java. A differenza di javap, il disassembler di Krakatau può gestire anche codice altamente offuscato e l'output disassemblato può essere riassemblato in un file di classe.
Krakatau fornisce anche un decompilatore per convertire binari Java in codice sorgente leggibile. A differenza di altri decompilatori, il decompilatore di Krakatau è stato progettato specificamente per lavorare con codice offuscato e può gestire facilmente trucchi che rompono altri decompilatori. Tuttavia, il decompilatore di Krakatau non supporta alcune funzionalità di Java 8+ come le lambda, quindi funziona meglio su codice più vecchio.
La sintassi dell'assembler di Krakatau è per lo più un superset della sintassi Jasmin con alcune piccole incompatibilità, ma a differenza di Jasmin, Krakatau ha pieno supporto per le specifiche bytecode di Java 19 e supporta anche alcune funzionalità non documentate presenti in vecchie versioni della JVM. Per una panoramica della sintassi dell'assembler, consulta il tutorial o la specifica completa.
Prima, dovrai installare Rust e Cargo. Poi clona questo repo ed esegui cargo build --release. Questo produrrà un binario in target/release/krak2, che puoi chiamare direttamente, aggiungere al PATH, creare un link simbolico, ecc.
Il disassembler ha due modalità: predefinita e roundtrip. La modalità predefinita è ottimizzata per la leggibilità e la facilità di modifica dei file assembly risultanti. Quando l'output viene riassemblato, produrrà file di classe che sono equivalenti nel comportamento all'originale dal punto di vista della specifica JVM, ma non necessariamente identici bit per bit (ad esempio, le voci del pool costante possono essere riordinate). La modalità roundtrip produce output che verrà riassemblato in file di classe bit per bit identici all'originale, ma ciò significa che i file assembly preservano informazioni di codifica di basso livello che li rendono più difficili da leggere, come l'ordine esatto delle voci del pool costante. Si consiglia di utilizzare la modalità roundtrip quando si lavora con codice che si basa su attributi non standard, come codice CLDC o codice Scala.
Esempio di utilizzo:
krak2 dis --out temp RecordTest.class
krak2 dis --out disassembled.zip --roundtrip r0lling-challenge.jar
Puoi disassemblare un singolo file di classe o un intero file jar. Se il nome del file di input termina con .jar o .zip, verrà trattato come un file jar e ogni file .class al suo interno verrà disassemblato.
L'opzione --out controlla la posizione di output. Se il valore di --out è una directory, l'output verrà inserito in singoli file all'interno di quella directory. Altrimenti, se il valore di --out termina con .jar o .zip, l'output verrà inserito in un singolo file zip in quella posizione. Se il valore di --out termina con .j, l'output verrà scritto in quel file (nota che un singolo file .j può contenere più classi - tutte le classi verranno disassemblate e scritte nello stesso file, una dopo l'altra). Se l'opzione --out viene omessa del tutto, le classi disassemblate verranno scritte sull'output standard.
Per disassemblare in modalità roundtrip come descritto sopra, passa l'opzione --roundtrip (o -r in breve).
L'assembler di Krakatau ti permette di scrivere bytecode Java in un formato testuale leggibile e convertirlo in file di classe Java binari.
krak2 asm --out temp Krakatau/tests/assembler/good/strictfp.j
Puoi assemblare un singolo file .j o un intero file jar. Se il nome del file di input termina con .jar o .zip, verrà trattato come un archivio zip e ogni file .j al suo interno verrà assemblato.
L'opzione --out controlla la posizione di output. Se il valore di --out è una directory, l'output verrà inserito in singoli file all'interno di quella directory. Altrimenti, se il valore di --out termina con .jar o .zip, l'output verrà inserito in un singolo file zip in quella posizione. Se il valore di --out termina con .class, il singolo file di classe di output verrà scritto in quel file (se l'input ha più classi, in questo caso verrà generato un errore).
Il decompilatore v2 è ancora un lavoro in corso. Per la decompilazione, al momento devi usare Krakatau v1.