Domanda:
Cos'è un buon decompilatore e deoffuscatore Java?
user56
2013-03-29 20:44:07 UTC
view on stackexchange narkive permalink

Sto usando JD-GUI per decompilare i file JAR Java, ma il problema è che lascia molti errori, come le variabili duplicate che devo correggere da solo e controllare se il programma è ancora funziona (se ho corretto gli errori correttamente).

Ho provato anche Fernflower, ma questo lascia le classi vuote se manca una dipendenza.

Mi piacerebbe sapere quale decompilatore:

  • fornisce il minor numero di errori
  • deoffuscato di più.
Sono solo curioso, quali funzionalità ti aspetti che un deoffuscatore possa offrire? Oltre a rinominare manualmente le variabili, non vedo alcun modo per deoffuscare effettivamente del codice.
Sette risposte:
#1
+33
Mike Strobel
2013-05-30 19:26:11 UTC
view on stackexchange narkive permalink

Le mie scuse per la risposta tardiva.
Sto lavorando a un nuovo decompilatore Java open source. Sentiti libero di verificarlo.
Non l'ho testato contro alcun codice offuscato, ma ho visto che decompila molti metodi che JD-GUI non è riuscito a gestire. Nota che è un lavoro in corso e sono sicuro che troverai un sacco di codice che non riuscirà a decompilare.

Innanzitutto, il suo decompilatore è Procyon che vedi in altre risposte. In secondo luogo, anche se di solito esito a dire "Guarda la mia libreria che fa questo!" risposte, sarebbe un errore qui. Il [readme] di Strobel (https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler) a cui si collega, sopra, merita una lettura approfondita. Sarebbe stata una * ottima * risposta in sé, ma è certamente un po 'troppo lunga per SE.
+10000 Questo è davvero un ottimo lavoro e ha appena decompilato una classe che ho passato ore a cercare di ricostruire dopo che JD-GUI ne aveva ottenuto solo la metà.
Anche se personalmente odio i commenti +1, devo dire che hai un buon progetto che mi ha aiutato in un punto difficile. Continuate così!
@Signus Grazie, sono contento che il mio lavoro ti sia stato utile :).
#2
+14
Alexandre Dumont
2016-08-26 02:49:18 UTC
view on stackexchange narkive permalink

Vecchie e mancanti voci

JAD Qualche tempo fa, il decompilatore preferito da tutti era jad. Attualmente, il progetto è morto (inoltre non era open source), ma si vedono ancora molte persone che lo fanno riferimento.

Java DeObfuscator Anche uno strumento più vecchio da fileoffset.com, ma funziona ancora più o meno. L'interfaccia è piuttosto scomoda da utilizzare per progetti più grandi, ma lo strumento è open source.

JODE JODE è un pacchetto java contenente un decompilatore e un ottimizzatore per Java. Questo pacchetto è disponibile gratuitamente sotto la GNU GPL. Non viene aggiornato da un po 'di tempo.

Strumento proprietario di AndroChef per decompilare programmi Android e file Java, disponibile qui. Non vale i soldi date le alternative, proprio come DJ Decompiler.

Candle Un decompilatore open source di Brad Davis. Lo cito per completezza, ma è ben lungi dall'essere una funzionalità completa.


Strumenti moderni

JD-Gui Probabilmente uno degli strumenti più utilizzati per la decompilazione Java, poiché è facile da usare e fornisce un'interfaccia utente grafica che consente di aprire e ispezionare rapidamente un file di classe o JAR. Puoi trovarlo qui.

FernFlower Decompilatore Java analitico molto nuovo e promettente (che diventa parte integrante di IntelliJ 14).

È uno strumento da riga di comando. Questo è in grado di mostrare i parametri Unicode con il loro nome completo.

Scarica da qui. È uno strumento a riga di comando. Questo è in grado di mostrare i parametri Unicode con il loro nome completo.
Notare che è anche già integrato di default in IntelliJ.

CFR

Gratuito e open source. Questo mira a decompilare le moderne funzionalità di Java, comprese le espressioni di commutazione di Java 12, le espressioni lambda Java 8 (modifiche pre e successive a Java beta 103), gli interruttori di stringa Java 7 ecc.

Anche uno strumento da riga di comando. Questo fa un lavoro ancora migliore ed è leggermente più veloce.

Procyon

Open source, e mira anche a gestire Funzionalità di Java 8 (lambda, :: operator). Richiede Java 7 per funzionare.

Krakatau Krakatau è interessante perché è stato scritto in Python. Attualmente contiene tre strumenti: un decompilatore e disassemblatore per file di classe Java e un assemblatore per creare file di classe.

Non supporta ancora le funzionalità di Java 8.

Soot

Soot è un framework per analizzare e trasformare applicazioni Java e Android, originariamente sviluppato dal Sable Research Group della McGill University. Non è molto comunemente usato "solo" come decompilatore, in quanto definisce anche un linguaggio di codice byte intermedio.

Recaf

Un editor Java Bytecode e viceversa strumento di ingegneria volto ad essere intuitivo da usare. Può presentare il bytecode tramite più decompilatori (CFR, FernFlower, Procyon) o in un layout di tabella per consentire la visualizzazione di elementi di classe che sono indecifrabili nei decompilatori standard. Recaf utilizza menu sensibili al contesto per interagire con classi, metodi e campi, consentendo agli utenti di cercare casi d'uso, rinominare elementi e modificare le definizioni in un formato disassemblato.

Supporta vasi, guerre, classi, ed estrarre classi dall'esecuzione di processi Java.

È scritto completamente in Java ed è completamente open source.

Visualizzatore Bytecode di Konloch

Un visualizzatore di byte Java avanzato leggero, decompilatore GUI Java, editor di byte GUI, GUI Smali, GUI Baksmali, GUI APK Editor, GUI Dex Editor, GUI APK Decompiler, GUI DEX Decompiler, GUI Procyon Java Decompiler, GUI Krakatau, GUI CFR Java Decompiler, GUI FernFlower Java Decompiler, GUI DEX2Jar, GUI Jar2DEX, GUI Jar-Jar, Hex Viewer, Code Searcher, Debugger e altro ancora.

Scritto completamente in Java, ed è open source.

Utilizza FernFlower, Procyon e CFR per la decompilazione, il che lo rende un fantastico strumento visivo che utilizza decompilatori all'avanguardia:

Enigma

Uno strumento specifico per l'offuscamento:

Originariamente utilizzato per deoffuscare le versioni di Minecraft. Utilizza Procyon internamente.

Un fork più aggiornato può essere trovato qui

È divertente notare che molti sforzi nei decompilatori e de-offuscatori per Java è il risultato della scena di modding intorno a Minecraft, uno dei giochi più popolari implementati in Java.

Fonte: http://blog.macuyiko.com /post/2015/a-quick-look-at-java-decompilers.html

Potrebbe essere necessario aggiornare questa risposta. Sembra che JD-GUI è attivamente sviluppato a partire dal marzo 2019. https://java-decompiler.github.io/
Ho del codice Java 7 per cui sto tentando di scrivere alcuni aspetti. Il decompilatore intellij incorporato in alcuni casi ha nomi di variabili errati e può escludere blocchi di codice. JD-Gui mostra quei blocchi e mostra anche quelli che sembrano essere nomi di variabili più accurati. Mostra anche fianco a fianco le differenze tra una vecchia versione e una nuova versione di JD-Gui. Vale la pena guardare se stai facendo una seria inversione.
#3
+10
amccormack
2013-03-29 23:20:27 UTC
view on stackexchange narkive permalink

Non posso parlare di quale di questi sia il migliore, ma ci sono alcuni decompilatori Java là fuori, come indicato da questa domanda SO. Nessuno di questi decompilatori sembra tentare di gestire attivamente l'offuscamento e molti di questi progetti vengono abbandonati.

Non ho provato Krakatau, ma sembra che possa aiutare con quello che tu stanno cercando.

  • Dal readme: "Il decompilatore Krakatau adotta un approccio diverso alla maggior parte dei decompilatori Java. Può essere considerato più come un compilatore il cui linguaggio di input è codice byte Java e la cui lingua di destinazione è essere codice sorgente Java. Krakatau accetta bytecode arbitrario e tenta di trasformarlo in codice Java equivalente. Questo lo rende resistente a piccoli offuscamenti, sebbene abbia l'inconveniente di non ricostruire la sorgente "originale", portando a un output meno leggibile di un pattern il decompilatore corrispondente produrrebbe classi Java non offuscate. "
  • Questo è open source e sembra essere attivamente (al momento della stesura) mantenuto.
Questa è effettivamente l'uscita del disassemblatore. Il decompilatore si decompila in output Java. (P.S. Sono lo sviluppatore)
JD-GUI è uno dei migliori decompilatori Java al momento, ma deve essere usato in congiunzione con i deoffuscatori sul Bytecode prima di decompilare il codice. I migliori deoffuscatori per java che io sappia provengono da http://www.rune-server.org o http://www.moparscape.org/smf o http://www.moparisthebest.org/smf quelli sono hacking community per Runescape Game che è completamente scritto in Java e altamente offuscato.
#4
+4
Konloch
2014-11-19 17:45:58 UTC
view on stackexchange narkive permalink

Prova a dare un'occhiata a Bytecode Viewer https://github.com/Konloch/bytecode-viewer Ha l'opzione di decompilare usando 5 diversi decompilatori:

  • FernFlower
  • Procyon
  • CFR
  • Krakatau
  • JD-GUI
#5
+3
Vladimir Protasov
2014-03-04 02:10:49 UTC
view on stackexchange narkive permalink

Prima di tutto, c'è una soluzione al problema di Fernflower con classi mancanti qui. Puoi dire grazie ad agaricusb per questo.

Per ora Fernflower rimane il miglior decompilatore Java anche se non è stato mantenuto negli ultimi anni. Ho provato a contattare l'autore di recente, ma ancora senza fortuna.

Per quanto riguarda AndroChef Java Decompiler, utilizza Fernflower come motore con il permesso dell'autore. Ancora non sono sicuro se usa una versione patchata / modificata o è solo una GUI.

Il decompilatore Procyon sviluppato da @ mike-strobel sembra essere buono, ma Fernflower ha ancora un enorme vantaggio ed è stato in grado di decompilarne circa 95 % della mia domanda (~ 3000 classi) mentre procyon è stato in grado di gestire solo il 60% (controllato a gennaio 2014).

La tua applicazione è Java "nativa" o è stata convertita dal formato Android? Nel primo caso, sarei molto interessato a mettere le mani sui tuoi binari per vedere dove si rompe Procyon rispetto a Fernflower.
@MikeStrobel È un'applicazione Java "nativa". È solo per uso interno, quindi non posso condividerla comunque.
qualche possibilità che tu possa inviarmi un'e-mail descrivendo quali tipi di problemi hai incontrato? Sono sempre ansioso di sapere come si potrebbe migliorare Procyon. Le mie informazioni di contatto sono sul sito BitBucket del progetto.
@MikeStrobel ringrazia per l'interesse, cercherò di fornirti informazioni estese e lezioni di esempio, ma nessuna promessa.
#6
+3
David Kennedy
2018-06-29 20:24:15 UTC
view on stackexchange narkive permalink

Sto usando https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine È il decompilatore di IntelliJ, decompila i codici in cui JD -GUI fallisce.

È un mirror non ufficiale da scaricare: http://files.minecraftforge.net/maven/net/minecraftforge/fernflower/

#7
+1
Atanas
2013-10-27 16:15:14 UTC
view on stackexchange narkive permalink

Vorrei raccomandarti AndroChef Java Decompiler AndroChef Java Decompiler decompila con successo i file offuscati Java 6 e Java 7 .class e .jar.

PRESTATE ATTENZIONE CON ANDROCHEF! AndroChef è solo un wrapper per il decompilatore di fiori di felce abbandonato, non sprecare i tuoi soldi con esso!


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...