Come faccio a “decompilare” i file di class Java?

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

Sulle domande relative alle prestazioni Java su questo sito, vedo spesso le risposte di persone che hanno “decompilato” il file di class Java per vedere come il compilatore ottimizza alcune cose.

Aggiornamento febbraio 2016:

http://www.javadecompilers.com elenca JAD come:

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

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

Lo stesso sito elenca altri strumenti.

E javadecompiler, come notato da Salvador Valencia nei commenti (settembre 2017), offre un SaaS in cui si carica il file .class nel cloud e si 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 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 sorgenti Java 5.

Java Decompiler (ancora un altro decompilatore Fast Java) ha:

  • Supporto esplicito per la decompilazione e l’analisi dei file “.class” di Java 5+ .
  • Una bella interfaccia grafica:

immagine dello schermo

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

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

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

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

E molti altri.

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

Per vedere il codice sorgente Java controlla qualche decompilatore. Vai a cercare jad .

Se vuoi vedere i bytecode, usa semplicemente javap che viene fornito con JDK.

Ho provato 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ò gli occhi su questo. Sviluppato anche triggersmente con il supporto delle ultime funzionalità Java.
  • Krakatau
    • Prende un approccio diverso nel tentativo di produrre un codice Java equivalente invece di provare a ribuild la fonte originale, che ha il potenziale di renderlo migliore per il codice offuscato. Dai miei test era approssimativamente alla pari con Procyon, ma comunque bello avere qualcosa di diverso. Dovevo usare il -skip della -skip comando -skip modo che non si fermasse sugli errori. Sviluppato triggersmente, e abbastanza interessante è scritto in Python.
  • JD-GUI
    • Ha funzionato, ma l’output di Procyon è stato molto meglio. Ecco una pagina che confronta l’output di Procyon con l’originale e la JD-GUI . JD-GUI è disponibile anche come plugin Eclipse , che non ha funzionato affatto per me. Non sembra essere open source e lo sviluppo sembra sporadico.
  • JAD
    • Funzionato, ma supporta solo Java 1.4 e versioni successive. Disponibile anche come plugin Eclipse . Non più in fase di sviluppo.

Io uso JAD Decompiler .

C’è un plugin Eclipse per esso, jadeclipse . È carino

Procyon include un decompilatore. È FOSS.

Fuliggine è un’opzione per il nuovo codice Java. Almeno ha il vantaggio di essere stato recentemente mantenuto …

Inoltre, Java Decompiler è un decompilatore con una GUI stand-alone e l’integrazione di Eclipse.

Infine, Jdec non è stato menzionato, sebbene non sia shiny come altre opzioni.

La JD-GUI è davvero buona. Si potrebbe semplicemente aprire un file JAR e sfogliare il codice come se si stesse lavorando su un IDE. Roba buona.

Ecco una lista di decompilatori a partire da febbraio 2015:

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

CFR , gratis, 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 ragioni storiche. Gratuito, nessun codice sorgente disponibile, http://varaneckas.com/jad/ Non aggiornato, non supportato e non decompilare correttamente Java 5 e versioni successive.

È ansible testare online i decompilatori sopra menzionati, nessuna installazione richiesta e fare la propria scelta istruita.

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

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

DJ Decompiler Mocha

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 che gestisca correttamente 1.5+ classi.

Dai un’occhiata a Cavaj .

Tutti i collegamenti JAD elencati finora sembrano essere interrotti, 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

  • JAD è uno che funziona ed è semplice.

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

Se vuoi vedere come il compilatore Java fa certe cose, non vuoi la decompilazione, vuoi lo sassembly. 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 l’informazione che ti interessa.

Ad ogni modo, mi è capitato di aver scritto un disassemblatore Java open source . A differenza di Javap, 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.

JAD non funziona per me (problema di Ubuntu 11.10) quindi ho spostato in avanti e interrotto su JODO . Almeno ha il codice sorgente Open Java ed è stato in grado di decompilare correttamente la mia class .

Consiglio di controllare prima il ramo “filiali / generico” . I tronchi non sono stabili.

Sulla piattaforma IntelliJ IDEA è ansible utilizzare Java Decompiler IntelliJ Plugin . Ti permette di visualizzare tutti i sorgenti Java durante il tuo processo di debug, anche se non li hai tutti. È basato sui famosi strumenti JD-GUI .

inserisci la descrizione dell'immagine qui

Con AndroChef Java Decompiler è ansible decompilare i file di class apk, dex, jar e java. È semplice e facile. AndroChef JD è basato su FernFlower . Puoi valutarlo in 10 utilizzi gratuiti.

AndroChef supporta funzionalità di 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 tradizionali compilatori Java: una percentuale di recupero molto elevata. È uno strumento semplice ma potente che consente di decompilare il bytecode Java e Dalvik (DEX, APK) in una sorgente Java leggibile.

Per OSX consiglio: jarzilla o JD-GUI

Entrambi ti permettono di vedere barattolo, guerra, ecc. file contenuto e decompila qualsiasi file di class all’interno di essi.

Jarzilla: https://code.google.com/p/jarzilla/
JD-GUI: http://jd.benow.ca/