
Décompilateur, assembleur et désassembleur Java
Krakatau fournit un assembleur et un désassembleur pour le bytecode Java, ce qui vous permet de convertir des fichiers de classe binaires en un format texte lisible par l'homme, d'effectuer des modifications, puis de les reconvertir en fichier classe, même pour du code obfusqué. Vous pouvez également créer vos propres fichiers de classe à partir de zéro en écrivant du bytecode manuellement, et examiner et comparer les détails de bas niveau des binaires Java. Contrairement à javap, le désassembleur de Krakatau peut gérer même du code hautement obfusqué, et la sortie désassemblée peut être réassemblée en un fichier classe.
Krakatau fournit également un décompilateur pour convertir les binaires Java en code source lisible. Contrairement aux autres décompilateurs, le décompilateur de Krakatau a été spécialement conçu pour fonctionner avec du code obfusqué et peut facilement gérer des astuces qui cassent d'autres décompilateurs. Cependant, le décompilateur de Krakatau ne prend pas en charge certaines fonctionnalités Java 8+ comme les lambdas, il fonctionne donc mieux sur du code plus ancien.
La syntaxe de l'assembleur de Krakatau est principalement un sur-ensemble de la syntaxe Jasmin avec quelques incompatibilités mineures, mais contrairement à Jasmin, Krakatau prend entièrement en charge la spécification du bytecode Java 19 et prend même en charge certaines fonctionnalités non documentées trouvées dans les anciennes versions de la JVM. Pour un aperçu de la syntaxe de l'assembleur, consultez le tutoriel ou la spécification complète.
Tout d'abord, vous devrez installer Rust et Cargo. Clonez ensuite ce dépôt et exécutez cargo build --release. Cela produira un binaire dans target/release/krak2, que vous pouvez appeler directement, ajouter au PATH, créer un lien symbolique, etc.
Le désassembleur a deux modes : par défaut et roundtrip. Le mode par défaut est optimisé pour la lisibilité et la facilité de modification des fichiers d'assembly résultants. Lorsque la sortie est réassemblée, elle produira des fichiers de classe dont le comportement est équivalent à l'original du point de vue de la spécification JVM, mais pas nécessairement identiques bit pour bit (par exemple, les entrées du pool constant peuvent être réordonnées). Le mode roundtrip produit une sortie qui sera réassemblée en fichiers de classe identiques bit pour bit à l'original, mais cela signifie que les fichiers d'assembly préservent les informations de codage de bas niveau qui les rendent plus difficiles à lire, comme l'ordre exact des entrées du pool constant. Il est recommandé d'utiliser le mode roundtrip lorsque vous travaillez avec du code qui repose sur des attributs non standard, comme le code CLDC ou le code Scala.
Exemple d'utilisation :
krak2 dis --out temp RecordTest.class
krak2 dis --out disassembled.zip --roundtrip r0lling-challenge.jar
Vous pouvez désassembler soit un fichier classe individuel, soit un fichier jar entier. Si le nom du fichier d'entrée se termine par .jar ou .zip, il sera traité comme un fichier jar et chaque fichier .class à l'intérieur du jar sera désassemblé.
L'option --out contrôle l'emplacement de sortie. Si la valeur de --out est un répertoire, la sortie sera placée dans des fichiers individuels sous ce répertoire. Sinon, si la valeur de --out se termine par .jar ou .zip, la sortie sera placée dans un seul fichier zip à cet emplacement. Si la valeur de --out se termine par .j, la sortie sera écrite dans ce fichier (notez qu'un seul fichier .j peut contenir plusieurs classes - toutes les classes seront désassemblées et écrites dans le même fichier, les unes après les autres). Si l'option --out est omise, les classes désassemblées seront écrites sur la sortie standard.
Pour désassembler en mode roundtrip comme décrit ci-dessus, passez l'option --roundtrip (ou -r en abrégé).
L'assembleur Krakatau vous permet d'écrire du bytecode Java dans un format texte convivial et de le convertir en fichiers de classe binaires Java.
krak2 asm --out temp Krakatau/tests/assembler/good/strictfp.j
Vous pouvez assembler soit un fichier .j individuel, soit un fichier jar entier. Si le nom du fichier d'entrée se termine par .jar ou .zip, il sera traité comme une archive zip et chaque fichier .j à l'intérieur sera assemblé.
L'option --out contrôle l'emplacement de sortie. Si la valeur de --out est un répertoire, la sortie sera placée dans des fichiers individuels sous ce répertoire. Sinon, si la valeur de --out se termine par .jar ou .zip, la sortie sera placée dans un seul fichier zip à cet emplacement. Si la valeur de --out se termine par .class, le fichier classe de sortie unique sera écrit dans ce fichier (si l'entrée contient plusieurs classes, une erreur sera générée dans ce cas).
Le décompilateur v2 est encore en développement. Pour la décompilation, vous devez actuellement utiliser Krakatau v1.