
descompilador, ensamblador y desensamblador de Java
Krakatau proporciona un ensamblador y desensamblador para bytecode de Java, lo que permite convertir archivos de clase binarios a un formato de texto legible por humanos, realizar cambios y convertirlos de vuelta a un archivo de clase, incluso para código ofuscado. También puedes crear tus propios archivos de clase desde cero escribiendo bytecode manualmente, y puedes examinar y comparar detalles de bajo nivel de binarios de Java. A diferencia de javap, el desensamblador de Krakatau puede manejar incluso código altamente ofuscado, y la salida desensamblada se puede reensamblar en un archivo de clase.
Krakatau también proporciona un descompilador para convertir binarios de Java en código fuente legible. A diferencia de otros descompiladores, el descompilador de Krakatau fue diseñado específicamente para trabajar con código ofuscado y puede manejar fácilmente trucos que rompen otros descompiladores. Sin embargo, el descompilador de Krakatau no soporta algunas funciones de Java 8+ como lambdas, por lo que funciona mejor en código antiguo.
La sintaxis del ensamblador de Krakatau es principalmente un superconjunto de la sintaxis de Jasmin con algunas incompatibilidades menores, pero a diferencia de Jasmin, Krakatau tiene soporte completo para la especificación de bytecode de Java 19 e incluso soporta algunas características no documentadas presentes en versiones antiguas de la JVM. Para una visión general de la sintaxis del ensamblador, consulta el tutorial o la especificación completa.
Primero, necesitarás instalar Rust y Cargo. Luego clona este repositorio y ejecuta cargo build --release. Esto generará un binario en target/release/krak2, que puedes llamar directamente, agregar al PATH, crear un enlace simbólico, etc.
El desensamblador tiene dos modos: predeterminado y de ida y vuelta. El modo predeterminado está optimizado para la legibilidad y facilidad de modificación de los archivos de ensamblaje resultantes. Cuando la salida se reensambla, resultará en archivos de clase que son equivalentes en comportamiento al original desde la perspectiva de la especificación de la JVM, pero no necesariamente bit por bit idénticos (por ejemplo, las entradas del pool constante pueden reordenarse). El modo de ida y vuelta produce una salida que se reensamblará en archivos de clase bit por bit idénticos al original, pero esto significa que los archivos de ensamblaje preservan información de codificación de bajo nivel que los hace más difíciles de leer, como el orden exacto de las entradas del pool constante. Se recomienda usar el modo de ida y vuelta cuando se trabaja con código que depende de atributos no estándar, como código CLDC o código Scala.
Ejemplo de uso:
krak2 dis --out temp RecordTest.class
krak2 dis --out disassembled.zip --roundtrip r0lling-challenge.jar
Puedes desensamblar un archivo de clase individual o un archivo jar completo. Si el nombre del archivo de entrada termina en .jar o .zip, se tratará como un archivo jar y se desensamblará cada archivo .class dentro del jar.
La opción --out controla la ubicación de salida. Si el valor de --out es un directorio, la salida se colocará en archivos individuales dentro de ese directorio. De lo contrario, si el valor de --out termina en .jar o .zip, la salida se colocará en un único archivo zip en esa ubicación. Si el valor de --out termina en .j, la salida se escribirá en ese archivo (nota que un solo archivo .j puede contener múltiples clases; todas las clases se desensamblarán y se escribirán en el mismo archivo, una tras otra). Si la opción --out se omite por completo, las clases desensambladas se escribirán en la salida estándar.
Para desensamblar en modo de ida y vuelta como se describió anteriormente, pasa la opción --roundtrip (o -r para abreviar).
El ensamblador de Krakatau te permite escribir bytecode de Java en un formato de texto legible y amigable y convertirlo en archivos de clase binarios de Java.
krak2 asm --out temp Krakatau/tests/assembler/good/strictfp.j
Puedes ensamblar un archivo .j individual o un archivo jar completo. Si el nombre del archivo de entrada termina en .jar o .zip, se tratará como un archivo zip y se ensamblará cada archivo .j dentro.
La opción --out controla la ubicación de salida. Si el valor de --out es un directorio, la salida se colocará en archivos individuales dentro de ese directorio. De lo contrario, si el valor de --out termina en .jar o .zip, la salida se colocará en un único archivo zip en esa ubicación. Si el valor de --out termina en .class, el archivo de clase de salida único se escribirá en ese archivo (si la entrada tiene múltiples clases, se producirá un error en este caso).
El descompilador v2 aún está en desarrollo. Para la descompilación, actualmente necesitas usar Krakatau v1.