portable decompile cavaj best java decompiler

cavaj - Elegir y probar java decompiler



java decompiler netbeans (9)

Ahora estoy tratando de encontrar el mejor decompilador de java, encontré estos:

Con estos descompiladores, manejo el código de bytes de esta clase:

public class ss { public static void main(String args[]) { try{ System.out.println("try"); } catch(Exception e) { System.out.println("catch"); } finally {System.out.println("finally");} } }

y obtuve los siguientes resultados:

flor de helecho

public class ss { public static void main(String[] var0) { try { System.out.println("try"); } catch (Exception var5) { System.out.println("catch"); } finally { System.out.println("finally"); } } }

DJ Java Decompiler:

import java.io.PrintStream; public class ss { public ss() { } public static void main(String args[]) { System.out.println("try"); System.out.println("finally"); break MISSING_BLOCK_LABEL_50; Exception exception; exception; System.out.println("catch"); System.out.println("finally"); break MISSING_BLOCK_LABEL_50; Exception exception1; exception1; System.out.println("finally"); throw exception1; } }

cavaj

import java.io.PrintStream; public class ss { public ss() { } public static void main(String args[]) { System.out.println("try"); System.out.println("finally"); break MISSING_BLOCK_LABEL_50; Exception exception; exception; System.out.println("catch"); System.out.println("finally"); break MISSING_BLOCK_LABEL_50; Exception exception1; exception1; System.out.println("finally"); throw exception1; } }

http://java.decompiler.free.fr/ :

import java.io.PrintStream; public class ss { public static void main(String[] paramArrayOfString) { try { System.out.println("try"); } catch (Exception localException) { System.out.println("catch"); } finally { System.out.println("finally"); } } }

Veo que el mejor resultado en decompiler: http://java.decompiler.free.fr/

Para probar, escribí código muy simple. ¿Qué piensas, qué código escribir para probar los descompiladores? Tal vez la idea es mejor que un intento {} catch () {} finalmente {}?


El código que utiliza para probar debe probar las funciones disponibles en JDK utilizadas para compilar la clase objetivo . Por ejemplo, si sabe que su destino está escrito en Java 1.5, es razonable suponer que el código puede incluir generics , por lo que querrá asegurarse de que el descompilador elegido los maneje adecuadamente. En mi experiencia, los descompiladores disponibles de forma gratuita tienden a quedarse atrás de los lanzamientos de JDK en cuanto a las características que soportan entre los lanzamientos de 1-2.

Basado en pruebas y errores personales, jd.benow.ca tiende a hacer el mejor trabajo en general. Sin embargo, si está descompilando el código que fue escrito en 1.3 o inferior, también le sugiero que pruebe a JODE .

EDITAR, 5 años después:

CFR , Procyon y Fernflower lideran el camino en este espacio.


Ha pasado un tiempo desde cualquier comentario a este hilo. Sin embargo, desde que lo encontré y tomé la información en serio, me parece importante dar una actualización.

He utilizado Java Decompiler gratis con buen éxito. Sin embargo, recientemente eliminé accidentalmente un poco de código de una aplicación J2EE de producción. asumió que JD Free lo manejaría, pero no maneja los genéricos en absoluto. Además había un código donde manejaba la inicialización de la variable totalmente errónea. Lo que terminé fue un desastre total.

Puede que no haya nada que vaya al trabajo correctamente. En mi caso, es solo otra lección en copia de seguridad, copia de seguridad, copia de seguridad. Necesito un descompilador que maneje los genéricos de manera adecuada para poder realizar una recuperación masiva. Pero algo de precisión en el manejo de las variables también ayudaría. Es demasiado pedir una herramienta para escupir el código original. Pero lo que he visto hasta ahora se compilará pero no funcionará correctamente, dejando a un lado los genéricos. ¡Así que supongo que va a ser una semana larga antes de Navidad!


He estado usando http://java.decompiler.free.fr/ durante mucho tiempo y he encontrado que es el mejor. En particular, lo utilicé para descompilar un frasco de un tercero y pude modificar el código fuente también con él.

Es fácil de usar y la interfaz de usuario también es limpia y ordenada.

Actualización: Java Decompiler ya no está disponible en http://java.decompiler.free.fr/ . Tiene un nuevo enlace jd.benow.ca desde donde se puede descargar.


Ok, esto está escrito desde mi teléfono móvil, así que tengan paciencia conmigo.

En primer lugar, todos los códigos de archivos java se compilan en bytecode en sus respectivos archivos .class . Esto significa que las constantes se almacenan AS IS (por lo tanto, las cadenas se pueden recuperar fácilmente) y las variables se asignan a un registro que luego se coloca en una ejecución del programa de pila cuando la JVM procesa el archivo de clase.

La razón por la que su bloque de excepción no se devuelve al código original que ha escrito se debe a la forma en que javac compiló y tradujo el código al código de bytes de Java.

Si desea saber qué decompilador funciona mejor, escriba todas las declaraciones bien conocidas de java (para bucle, si sentencia, mientras que bucle) con algunas expresiones y vea qué representa mejor su código original.

Buena suerte.


Para obtener información, JD admite switch (enum), switch (cadena), afirmaciones y bucles para cada uno.

Acerca de las opciones -g (javac),

  • si omite los números de línea, JD no puede reconstruir el flujo original de instrucciones: los tipos de bucle no pueden determinarse, las múltiples asigimientos no pueden regenerarse y el algoritmo utilizado para realinear el código fuente no puede funcionar.
  • Si omite los datos de variables locales, JD no puede, en algún momento, determinar el rango exacto de variables. Es problematico

Parece que fernflower y jd.benow.ca producen código descompilado que es tan bueno como es posible para este caso de prueba en particular. Los otros dos no están haciendo un buen trabajo, OMI.

¿Qué piensas, qué código escribir para probar los descompiladores?

  1. Escribe código más complicado usando todas las construcciones disponibles.
  2. Pruébalos en algún código real.
  3. Pruébalos en algún código real que haya sido ofuscado.

Al probar el código que compila desde la fuente, experimente con diferentes opciones "-g" y con diferentes compiladores de Java.


Si anticipa obtener resultados significativos, debería probar con un poco más de código no trivial. Fernflower se creó con el objetivo de manejar un código de bytes muy inusual y ofuscado. Por lo tanto, descompilar fragmentos tan simples no es gran cosa. Por cierto, si está interesado en probar la versión independiente de Fernflower, envíeme una nota en fernflower (punto) decompiler (at) gmail (punto) com. La versión 0.8.4 ahora está en versión beta pública (sin embargo, aún no está disponible en el sitio web).