Come posso "decompilare" i file di classe Java? [chiuso]


556

Quale programma posso usare per decompilare un file di classe? Riceverò effettivamente il codice Java o è solo il codice assembly JVM?

Sulle domande sulle prestazioni Java su questo sito vedo spesso le risposte di persone che hanno "decompilato" il file di classe Java per vedere come il compilatore ottimizza determinate cose.


4
L'arte del "decompilare" può anche essere pensata come ingegneria inversa. Anche se a volte quando si esegue il reverse engineering di qualcosa non si ha sempre accesso ai file binari.
Makach,

Nessuno menzionato datecodeviewer.com , che può decompilare in java source e in bytecode (per java source si basa su JAD).
Fernando Gonzalez Sanchez,

Risposte:


588

Aggiornamento febbraio 2016:

www.javadecompilers.com elenca JAD come:

il più popolare decompilatore Java, ma principalmente di questa età. Scritto in C ++, molto veloce.
Non aggiornato, non supportato e non decompila correttamente Java 5 e versioni successive

Quindi il tuo chilometraggio può variare con jdk recente (7, 8).

Lo stesso sito elenca altri strumenti.

E javadecompiler, come notato da Salvador Valencia nei commenti (settembre 2017), offre un SaaS in cui carichi il .classfile sul cloud e ti restituisce il codice decompilato.


Risposta originale: ottobre 2008

  • La versione finale di JSR 176, che definisce le principali funzionalità di J2SE 5.0 (Java SE 5), è stata pubblicata il 30 settembre 2004.
  • L'ultima versione di Java supportata da JAD, il famoso decompilatore Java scritto da Pavel Kouznetsov, è JDK 1.3 .
  • La maggior parte dei decompilatori Java scaricabili oggi da Internet, come "DJ Java Decompiler" o "Cavaj Java Decompiler", sono alimentati da JAD: non possono visualizzare fonti Java 5.

Decompilatore Java (l'ennesimo decompilatore Fast Java) ha:

  • Supporto esplicito per la decompilazione e l'analisi di Java 5+ file ".class" di .
  • Una bella interfaccia grafica:

immagine dello schermo

Funziona con compilatori da JDK 1.1.8 fino a JDK 1.7.0 e altri ( Jikes , JRockit , ecc.).

È dotato di una versione demo live online che è in realtà completamente funzionale! Puoi semplicemente rilasciare un file jar sulla pagina e vedere il codice sorgente decompilato senza installare nulla.


5
+1 Vale la pena ricordare che è anche modulare, quindi il core (implementato in C ++) può essere sfruttato altrove.
Quinn Taylor,

1
jd-gui-0.3.3 disponibile anche qui
amaidment

1
Nel caso in cui uno avesse installato il plug-in di decompilatore java Eclipse su Eclipse Juno, Eclipse ha iniziato a bloccarsi sull'inizializzazione DND del marketplace costringendo a terminare l'intero processo: rimuovendo il jd. *. Jar dalla directory dei plugin di Eclipse, l'ho risolto per me.
LSerni

4
@Rishi nello stesso modo in cui proteggi il tuo IP in qualsiasi lingua o piattaforma - buoni avvocati. DRM è solo un cerotto.
Antimonio,

1
Ora offre SaaS dove carichi il file .class sul cloud e ti restituisce il codice decompilato. Ha lavorato per un semplice POJO.
Salvador Valencia,

101

Ci sono alcuni decompilatori là fuori ... Una rapida ricerca produce:

  1. Procyon : open-source (Apache 2) e sviluppato attivamente
  2. Krakatau : open-source (GPLv3) e sviluppato attivamente
  3. CFR : open-source (MIT) e sviluppato attivamente
  4. JAD
  5. DJ Java Decompiler
  6. moca

E molti altri.

Questi producono codice Java. Java viene fornito con qualcosa che ti consente di vedere il codice byte JVM ( javap ).


2
Vorrei anche aggiungere che Procyon, CFR, JAD e DJ sono disponibili come servizio web: javadecompilers.com
Andrew Rukin,


kpdus.com/jad.html è un collegamento AD
marcinj

Grazie @marcinj, ho trovato un altro collegamento che contiene collegamenti per scaricarlo.
billjamesdev,

51

Per vedere il codice sorgente Java controlla alcuni decompilatori. Vai a cercare jad .

Se vuoi vedere i bytecode, usa solo javap fornito con JDK.


5
Raccomanderei invece uno dei decompilatori open-source, poiché sono attivamente sviluppati. Utilizzare invece Procyon , il decompilatore CFR o Krakatau (Python).
Janus Troelsen,

29

Ne ho provati diversi e Procyon sembrava funzionare al meglio per me. È in fase di sviluppo attivo e supporta molte funzionalità delle ultime versioni di Java.

Questi sono gli altri che ho provato:

  • CFR
    • Decompilazione del metodo promettente, ma spesso fallita. Terrò d'occhio questo. Sviluppato anche attivamente con il supporto per le ultime funzionalità Java.
  • Krakatau
    • Adotta un approccio diverso in quanto tenta di generare codice Java equivalente invece di provare a ricostruire l'origine originale, che ha il potenziale per renderlo migliore per il codice offuscato. Dai miei test è stato grosso modo alla pari con Procyon, ma comunque bello avere qualcosa di diverso. Ho dovuto usare il -skipflag della riga di comando in modo che non si fermasse agli errori. Sviluppato attivamente e abbastanza interessante è scritto in Python.
  • JD-GUI
  • JAD
    • Funzionato, ma supporta solo Java 1.4 e versioni precedenti. Disponibile anche come plug-in Eclipse . Non più in fase di sviluppo.

1
Nota che la IGNORE_EXCEPTIONScosa è stata ora cambiata nel flag della riga di comando -skip.
Antimonio



13

Fuliggine è un'opzione per il codice Java più recente. Almeno ha il vantaggio di essere ancora mantenuto di recente ...

Inoltre, Java Decompiler è un decompilatore con una GUI autonoma e l'integrazione con Eclipse.

Infine, Jdec non è stato menzionato, anche se non è raffinato come altre opzioni.


Sai come decompilare un file di classe concreto con Soot? Non sono sicuro che sia possibile ...
Janus Troelsen,

12

JD-GUI è davvero buona. Potresti semplicemente aprire un file JAR e sfogliare il codice come se stessi lavorando su un IDE. Roba buona.


11

Ecco un elenco di decompilatori a partire da febbraio 2015:

Procyon , open-source, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR , gratuito, nessun codice sorgente disponibile, http://www.benf.org/other/cfr/

JD , gratuito solo per uso non commerciale, http://jd.benow.ca/

Fernflower , open-source, https://github.com/fesh0r/fernflower ,

JAD - dato qui solo per motivi storici. Gratuito, nessun codice sorgente disponibile, http://varaneckas.com/jad/ Non aggiornato, non supportato e non si decompila correttamente Java 5 e versioni successive.

Puoi testare i decompilatori sopra menzionati online, non è necessaria l'installazione e fare la tua scelta colta.

Decompilatori Java nel cloud: http://www.javadecompilers.com/


1
Procyon funziona meglio !!!!
MarcoZen,

10

Ci sono alcuni programmi che puoi usare. Otterrai il codice Java effettivo, ma a volte il codice sarà stato offuscato, quindi i metodi sono nominati da una lettera o un numero o un mix casuale di lettere e numeri.

DJ Decompiler Mocha


9

La maggior parte dei decompilatori per Java sono basati su JAD . È un ottimo strumento, ma sfortunatamente non è stato aggiornato per un po 'e non gestisce molto bene le classi Java 1.5+. Non ho visto nessuno strumento in grado di gestire correttamente le classi 1.5+.


3
ecco qua: ho appena pubblicato una risposta alla tua risposta;) JDK1.5 e altro supportato!
VonC,

"Non ho visto nessuno strumento in grado di gestire correttamente le classi 1.5+" - Procion, Fernflower, JDCore e CFR (questo gestisce Java 8!)
Andrew Rukin,


6

Tutti i link JAD elencati finora sembrano essere rotti, quindi ho trovato questo sito. Funziona alla grande (almeno per Linux)! Su Ubuntu 11.10 ho dovuto scaricare quello statico per qualsiasi motivo.

http://www.varaneckas.com/jad


5
  • JAD è uno che funziona ed è semplice.

  • Inoltre, se vuoi solo vedere i metodi, usa javap.


5

Se vuoi vedere come il compilatore Java fa certe cose, non vuoi decompilare, vuoi disassemblare. La decompilazione comporta la trasformazione del bytecode in sorgente Java, il che significa che molte informazioni di basso livello vengono perse e se ti stai chiedendo l'ottimizzazione del compilatore, questa è probabilmente la stessa informazione che ti interessa.

Comunque, mi è capitato di aver scritto un disassemblatore Java open source . A differenza di Javap, questo funziona anche su classi altamente patologiche, quindi puoi vedere quali strumenti di offuscamento stanno facendo anche alle tue classi. Può anche fare la decompilazione, anche se non lo consiglierei.


4

JAD non funziona per me (problema di Ubuntu 11.10), quindi sono andato avanti e mi sono imbrogliato su JODO . Almeno ha il codice sorgente Open Java ed è stato in grado di decompilare correttamente il mio .class .

Consiglio di controllare prima il ramo "rami / generico" . I tronchi non sono stabili.


1
JODO viene mantenuto sporadicamente mentre CFR e Procyon sono sviluppati attivamente e hanno il supporto JDK 8.
Janus Troelsen,

4

Sulla piattaforma IDEA IntelliJ è possibile utilizzare il plug-in IntelliJ Decompiler Java . Ti consente di visualizzare tutte le fonti Java durante il processo di debug, anche se non le possiedi tutte. Si basa sui famosi strumenti JD-GUI .

inserisci qui la descrizione dell'immagine


@ NoOP's Sei un robot? O semplicemente non prestando attenzione a un argomento di revisione?
naXa,

Scusatemi, a prima vista sembra che il link risponda solo. Forse dovresti aggiungere maggiori dettagli e anche la tua risposta deve rispettare solo il titolo della domanda e non il contenuto della domanda.
ashiquzzaman33,

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post.
Kristijan Iliev il

@Chris hai provato la soluzione suggerita? Hai mai letto la domanda ?
naXa,

1
@ NoOP è dispiaciuto per essere stato maleducato = (Sono sopraffatto dal numero di recensori che non prestano attenzione.
NaXa

1

Con AndroChef Java Decompiler puoi decompilare i file di classe apk, dex, jar e java. È semplice e facile AndroChef JD si basa su FernFlower . Puoi valutarlo in 10 usi gratuiti.

AndroChef supporta funzionalità del linguaggio Java come generici, enumerazioni e annotazioni. Secondo alcuni studi, AndroChef Java Decompiler è in grado di decompilare il 98,04% delle applicazioni Java generate con i compilatori Java tradizionali, con un tasso di recupero molto elevato. È uno strumento semplice ma potente che consente di decompilare il bytecode Java e Dalvik (DEX, APK) in una sorgente Java leggibile.


1
@Dimitrius, leggi attentamente le risposte durante una recensione. Come immagini di includere FernFlower o AndroChef qui?
naXa,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.