Pregunta

Ahora estoy tratando de encontrar el mejor descompilador de Java, los encontré:

Con estos descompiladores manejo el código de byte 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:

Fernflower:

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 es el mejor resultado en el descompilador: http://java.decompiler.free.fr/

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

¿Fue útil?

Solución

El código que usa para probar debería Pruebe las funciones disponibles en JDK utilizadas para compilar la clase de destino. Por ejemplo, si sabe que su objetivo está escrito en Java 1.5, es razonable suponer que el código podría incluir genéricos, por lo que querrá asegurarse de que su descompilador elegido los maneje correctamente. En mi experiencia, los descompiladores disponibles libremente tienden a quedarse atrás de las versiones de JDK en términos de las características que apoyan en 1-2 lanzamientos.

Basado en prueba personal y error, JD tiende a hacer el mejor trabajo en general. Sin embargo, si está descomponiendo código que fue escrito en 1.3 o inferior, también le sugiero que dé Jode un intento.

Editar, 5 años después:

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

Otros consejos

he estado usando http://java.decompiler.free.fr/ Durante mucho tiempo y descubrió que era el mejor. En particular, lo usé para descompilar un frasco de terceros y también pude modificar el código fuente.

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

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

Si anticipa obtener resultados significativos, realmente debe probar con un poco más de código no trivial. Fernflower fue creado con el objetivo de manejar un bytecode altamente inusual y ofuscado. Por lo tanto, descomparar fragmentos tan simples no es gran cosa. Por cierto, si está interesado en probar la versión independiente de Fernflower, déjame una nota en el descompilador de Fernflower (DOT) (AT) Gmail (DOT) com. La versión 0.8.4 ahora está en beta semi-pública (sin embargo, aún no está disponible en el sitio web).

Parece que fernflower y Descompilador JD Java están produciendo un código descompilado que es lo más bueno posible para esta prueba de prueba en particular. Los otros dos no están haciendo un buen trabajo, en mi opinión.

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

  1. Escriba un código más complicado utilizando todas las construcciones disponibles.
  2. Pruébalos en algún código real.
  3. Pruébelos 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.

http://www.reversed-java.com/fernflower/, Vea mi comparación en github.com /vorburger /scratchapplet

Para obtener información, JD admite Switch (ENUM), Switch (String), afirmaciones de afirmaciones y bucles para cada uno.

Sobre 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 se pueden determinar, los asignaciones múltiples no pueden regenerarse y el algoritmo utilizado para realinear el código fuente no puede funcionar.
  • Si omite los datos variables locales, JD no puede, en algún momento, determinar el rango exacto de las variables. Es problemático.

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

Primero de todos, cada código de archivo Java se compilan en Bytecode en sus respectivos .clase expediente. Esto significa que se almacenan las constantes AS IS (Por lo tanto, se pueden recuperar fácilmente las cadenas) y las variables se asignan a un registro que luego se coloca en una ejecución del programa de pila cuando el 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 es por la forma en que Javac compiló y tradujo el código al Bytecode Java.

Si desea saber qué descompilador funciona mejor, escriba todas las declaraciones de Java bien conocidas (para bucle, si la declaración, durante el bucle) con algunas expresiones y vea lo que mejor representa su código original.

Buena suerte.

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

He usado 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 código donde manejaba la inicialización de la variable totalmente incorrecta. Lo que terminé fue un desastre total.

Puede que no haya nada por ahí que lo hará para el trabajo correctamente. En mi caso, es solo otra lección en copia de seguridad, copia de seguridad, copia de seguridad. Necesito un descargador que maneje los genéricos correctamente para recuperar una masa. Pero cierta precisión de las variables de manejo también ayudaría. Es demasiado pedirle a una herramienta que escupe el código original. Pero lo que he visto hasta ahora se compilará pero no funcionará correctamente, aparte de los genéricos. ¡Así que supongo que será una larga semana antes de Navidad!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top