Domanda

Ora sto cercando di trovare il miglior decompilatore Java, ho trovato questi:

Con queste decompilers gestisco byte di codice di questa classe:

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");}
}
}

ed ho ottenuto i seguenti risultati:

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");
    }
  }
}

Vedo che il miglior risultato in decompilatore: http://java.decompiler.free.fr/

Per prova, ho scritto il codice molto semplice. Cosa ne pensi, quale codice scrivere a decompilers di prova? Forse l'idea è di meglio di un try {} catch () {} finally {}?

È stato utile?

Soluzione

Il codice che si utilizza per test dovrebbe prova le funzioni disponibili della in JDK utilizzato per compilare la classe di destinazione . Ad esempio, se si sa che il vostro obiettivo è scritto in Java 1.5, è ragionevole supporre che il codice potrebbe includere generici , così si vuole fare in modo che i tuoi Decompiler maniglie in modo corretto scelti. Nella mia esperienza, i decompilatori liberamente disponibili tendono a restare indietro i rilasci JDK in termini di funzionalità che supportano di 1-2 rilasci.

In base a prove ed errori personali, JD tende a fare il miglior lavoro in generale. Tuttavia, se si sta decompilazione del codice che è stato scritto in 1.3 o inferiore, mi piacerebbe anche suggerisco di dare JODE una prova.

Modifica, 5 anni dopo:

CFR , Procione , e Fernflower aprire la strada in questo spazio.

Altri suggerimenti

Sono stato con http://java.decompiler.free.fr/ per un molto tempo e c'è sembrato il migliore. In particolare ho usato per decompilare un barattolo di terze parti e sono stato in grado di modificare il codice sorgente, come bene con esso.

E 'facile da usare e l'interfaccia utente è anche ordinato e pulito.

Aggiornamento: Java Decompiler non è più disponibile su http://java.decompiler.free.fr/ . Ha nuovo link http://jd.benow.ca/ da dove può essere scaricato.

Se si prevede di ottenere risultati significativi, si dovrebbe verificare con il codice di un po 'di più non banale. Fernflower è stato creato con lo scopo di gestire bytecode molto insolito e offuscato. Così la decompilazione tali frammenti semplici è un grosso problema. A proposito, se siete interessati a testare la versione stand-alone di Fernflower mandatemi una nota alla fernflower (dot) decompilatore (at) gmail (dot) com. La versione 0.8.4 è ora in beta semi-pubblico (comunque non disponibile sul sito web ancora).

Sembra che fernflower e JD Java Decompiler stanno producendo il codice decompilato che è buono come è possibile per questo particolare TestCase. Gli altri due non stanno facendo un lavoro buono, IMO.

  

Cosa ne pensi, quale codice scrivere a decompilers prova?

  1. Scrivi codice più complicato con tutti i costrutti disponibili.
  2. Prova fuori su un codice vero e proprio.
  3. Prova fuori su un codice vero e proprio che è stato offuscato.

Quando si cerca fuori il codice che si compila dai sorgenti, sperimentare con diversi "-g" opzioni, e con diversi compilatori Java.

http://www.reversed-java.com/fernflower/ , vedere il mio confronto su github.com / Vorburger / ScratchApplet

Per informazioni, supporti JD interruttore (enum), interruttore (stringa), assert dichiarazioni e for-each loop.

Il -g (javac) opzioni,

  • se si omette i numeri di riga, JD lattina Non ricostruire il flusso originale Istruzioni: i tipi di loop può non essere determinato, il multiplo assigments non possono essere rigenerati, e l'algoritmo utilizzato per fonte riallineamento il codice non può funzionare.
  • se si omette il dati variabili locali, JD non può, qualche volta, determinare l'esatto campo di variabili. E 'problematico.

Ok, questo è scritto dal mio telefono cellulare in modo da portare con me.

prima di tutto, ogni codici di file java vengono compilati in bytecode nei rispettivi file .class . Ciò significa che le costanti sono memorizzate AS IS (quindi stringhe possono essere facilmente recuperate) e le variabili sono assegnati ad un registro che viene poi messo su un'esecuzione del programma stack quando JVM elaborare il file di classe.

Il motivo per il vostro blocco eccezione non vengono restituiti al codice originale che hai scritto è a causa del modo in cui javac compilato e tradotto il codice bytecode Java.

Se volete sapere quali decompilatore funziona meglio, scrivere tutto java dichiarazioni ben noto (per loop, if, while) con alcune espressioni e vedere ciò che meglio rappresentano il codice originale.

In bocca al lupo.

E 'passato un po' da tutte le risposte a questo thread. Tuttavia dal momento che ho trovato e ha preso sul serio l'ingresso mi sembra importante dare un aggiornamento.

Ho usato Java Decompiler libero con buon successo. Tuttavia, di recente ho cancellato per sbaglio un po 'di codice di un'applicazione di produzione J2EE. presume JD libero sarebbe gestire la cosa, ma non gestire generici a tutti. Inoltre, c'era codice in cui ha gestito l'inizializzazione variabile totalmente sbagliato. Quello che ho finito con era un disastro totale.

Non ci può essere nulla che possa al lavoro correttamente là fuori. Nel mio caso è solo un'altra lezione di backup, il backup, il backup. Ho bisogno di un de-compilatore che gestisce i generici correttamente al fine di fare un recupero di massa. Ma una certa precisione di variabili movimentazione aiuterebbe anche. E 'troppo chiedere uno strumento per sputare il codice originale. Ma quello che ho visto finora compilerà, ma non funzionerà correttamente, farmaci generici da parte. Quindi suppongo che sarà una settimana di tempo prima di Natale !!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top