2010-10-09 26 views
38

Ahora estoy tratando de encontrar la mejor decompilador java java, encontré esto:Elegir y prueba decompilador

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

Para probar, me escribió un código muy simple. ¿Qué piensas, qué código escribir para probar descompiladores? Tal vez la idea es mejor que un try {} catch() {} finally {}?

+2

Si está en OS X, también le daría una oportunidad a Jar Inspector: http://www.codeland.org/ –

+1

@Brent Nash, desafortunadamente Jar Inspector ya no se mantiene y no funciona bajo OSX Snow Leopard :( –

+1

Tenga en cuenta que java.decompiler.free.fr ya no funcionará, el proyecto está ahora en http://jd.benow.ca/ –

Respuesta

23

El código que utiliza para probar debe probar las funciones disponibles en el JDK utilizado para compilar la clase de destino. 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 decompilador elegido los maneja correctamente. En mi experiencia, los descompiladores de libre disponibilidad tienden a quedar rezagados con respecto a los lanzamientos de JDK en términos de las características que admiten en 1-2 lanzamientos.

Basado en prueba y error personal, JD tiende a hacer el mejor trabajo en general. Sin embargo, si está descompilando código escrito en 1.3 o inferior, también le sugiero que pruebe JODE.

1

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

En primer lugar, todos los códigos de archivos java se compilan en bytecode en su respectivo archivo .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 de programa de pila cuando la JVM procesa el archivo de clase.

La razón por la que su bloque de excepciones no se devuelve al código original que ha escrito se debe a la forma en que javac compiló & tradujo el código a bytecode de java.

Si desea saber qué descompilador funciona mejor, escriba todas las sentencias conocidas de java (para bucle, instrucción if, while loop) con algunas expresiones & vea qué representa mejor su código original.

Buena suerte.

+0

Se asignan variables locales directamente a una ranura de la pila. – EJP

5

Parece que fernflower y JD Java Decompiler producen código decompilado que es tan bueno como es posible para este caso de prueba en particular. Los otros dos no están haciendo un buen trabajo, IMO.

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

  1. Comentario más complicado código utilizando todas las construcciones disponibles.
  2. Pruébelas en un código real.
  3. Pruébelas en algún código real que haya sido ofuscado.

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

4

Para información, JD admite el interruptor (enum), el interruptor (cadena), las declaraciones de afirmación y para cada bucle.

Acerca de las opciones -g (javac),

  • si omite los números de línea, JD puede no reconstruir el flujo original de instrucciones: los tipos de bucle pueden ser no determinada, el múltiplo las asignaciones no se pueden regenerar, y el algoritmo utilizado para realinear el código fuente no puede funcionar.
  • si omite los datos variables locales , JD no puede, alguna vez, determinar el rango exacto de variables. Es problemático
+1

¿Quiere decir JD? Como en http://java.decompiler.free.fr/? Si es así, no puedo encontrar la opción -g y no es compatible con el interruptor (enum) sin él. – mjaggard

5

Si espera obtener resultados significativos, debería probar con un código un poco más no trivial. Fernflower fue creado con el objetivo de manejar bytecode altamente inusual y ofuscado. Por lo tanto, la descompilación de tales fragmentos simples no es gran cosa. Por cierto, si está interesado en probar la versión independiente de Fernflower, envíeme una nota a fernflower (dot) decompiler (at) gmail (dot) com. La versión 0.8.4 ahora está en beta semipública (pero aún no está disponible en el sitio web).

7

He estado usando http://java.decompiler.free.fr/ durante mucho tiempo y nos pareció que es la mejor. En particular, lo usé para descompilar un jar de terceros y pude modificar el código fuente también con él.

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.

0

Ha pasado bastante tiempo desde que recibí comentarios sobre este hilo.Sin embargo, desde que lo encontré y tomé la información en serio, creo que es importante dar una actualización.

He utilizado Java Decompiler Free con buen éxito. Sin embargo, recientemente borré accidentalmente bastante 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 en el que manejaba la inicialización de variables totalmente errónea. Lo que terminé con fue un desastre total.

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

+4

Sin embargo, otro argumento para usar el control de fuente ... –

Cuestiones relacionadas