2009-03-15 9 views
218

Qualcuno sa di un decompilatore gratuito che può decompilare un intero file Jar invece di una singola classe? Ho un problema con le sottoclassi come name $ 1.class name $ 2.class name.classCome decompilare un intero file Jar?

+4

Ricorda due cose: 1) I copyright esistono per la fonte, la decompilazione e il riutilizzo sono un po 'sfuggenti e illegali nella maggior parte dei paesi 2) Anche con il fantasioso JavaDecompiler non otterrai la fonte originale. – Esko

+1

grazie, ed è una piccola applet e voglio solo vedere e studiare il codice sorgente, non rubarlo. – StoneHeart

+110

Ricorda altre due cose: 1) La semplice menzione di un decompilatore farà sì che il "più santo di te" esca e formuli giudizi di valore sui tuoi motivi, pur non avendo idea di quale sia l'utilizzo previsto, quindi fai attenzione a chi parli. 2) Il fantasioso JavaDecompiler ti darà un'eccellente interpretazione del codice, ben strutturata e di facile lettura - mancano solo commenti. È incredibilmente buono, recuperando un file JAR che aveva una fonte persa da tempo completa di nomi di variabili. Ovviamente non nascondiamo i nostri file JAR interni. – Andrew

risposta

264

JavaDecompiler può fare un buon lavoro con un barattolo: da 0.2.5, vengono visualizzati tutti i file, in file JAR.

http://java.decompiler.free.fr/sites/default/screenshots/screenshot1.png

Vedi anche the question "How do I “decompile” Java class files?".

La JD-Eclipse non sembra essere cambiata dalla fine del 2009 (vedi Changes).
Quindi la sua integrazione con l'ultimo Eclipse (3.8, 4.2+) potrebbe essere problematico.

JD-Core viene mantenuto attivamente.

Entrambi sono il risultato del fantastico lavoro di (utente SO) Emmanuel Dupuy.

+5

fyi, java decompiler funziona su windows, mac e linux. – yanokwa

+4

@AlexS nice :) Passaggio successivo: controllo della versione (http://stackoverflow.com/questions/59561/what-tools-techniques-can-benefit-a-solo-developer) E quindi Integrazione continua (http: // stackoverflow .com/questions/130592/is-continuous-integration-important-for-a-solo-developer) – VonC

+0

Chiunque ha il plug-in di eclipse per funzionare più con l'ultima eclissi e jdk7? Ho provato ma ottengo un errore di download. JD-Gui funziona ma jd-eclipse sembra fallire per me ... –

1

Si estrae e poi si usa jad contro la dir.

+0

Non penso che tu possa semplicemente farlo contro la dir. Dovrai specificare {dir}/**/*. Classe – Vihung

+0

Estrarre il jar e usare qualcosa come jad {dir}, l'ho appena testato e non funziona su Windows –

2

Un file jar è solo un file zip con estensione jar. Dovresti essere in grado di decomprimere (winzip) un jar proprio come un file zip.

29

Se vi capita di avere sia una shell bash e Jad:

JAR=(your jar file name) 
unzip -d $JAR.tmp $JAR 
pushd $JAR.tmp 
for f in `find . -name '*.class'`; do 
    jad -d $(dirname $f) -s java -lnc $f 
done 
popd 

potrei essere un piccolo, minuscolo po 'fuori con questo, ma dovrebbe funzionare più o meno come pubblicizzato. Dovresti finire con $JAR.tmp contenente i tuoi file decompilati.

+1

su ubuntu usa #!/Bin/bash invece di #!/Bin/sh perché beccous push non funziona per la shell di ubuntu predefinita ... – mossplix

+0

Sto usando 'javap' all'interno di questa struttura di loop di base, e funziona per me. –

31

Prima di tutto, vale la pena ricordare che tutti i file Java Archive (.jar/.war/ecc ...) sono tutti .zip file fondamentalmente solo fantasia, con un paio di manifesti aggiunto e metadati.

In secondo luogo, per affrontare questo problema Io personalmente uso diversi strumenti che trattano questo problema su tutti i livelli:

  • Jad + Jadclipse mentre si lavora in IDE per decompilazione .class file
  • WinRAR, il mio strumento di compressione preferito nativamente supporta gli archivi Java (di nuovo, vedi il primo paragrafo).
  • Beyond Compare, il mio strumento diff preferito, se configurato correttamente, può effettuare confronti al volo tra qualsiasi file di archivio, incluso jar s. Vale la pena provare.

Il vantaggio di tutti i suddetti è che non è necessario tenere nessun altro strumento esterno che ingombra il mio ambiente di lavoro. Tutto ciò di cui avrò mai bisogno da uno di questi file può essere gestito all'interno del mio IDE o diffuso con altri file in modo nativo.

+0

lolz continuo a decomprimere le estensioni di chrome e firefox e ho dimenticato che .jar sono solo delle zip :) –

+1

Il link a Jad è morto. – Zero3

1

Nota: questa soluzione funziona solo per utenti Mac e * nix.

Ho anche provato a trovare Jad senza fortuna. La mia soluzione rapida era scaricare MacJad che contiene jad. Una volta scaricato, puoi trovare jad in [where-you-download-macjad]/MacJAD/Contents/Resources/jad.

23

Ho avuto un discreto successo con uno strumento chiamato (frustrante) "JD: Java Decompiler".

L'ho trovato migliore della maggior parte dei decompilatori quando si tratta di classi compilate per Java 5 e successive. Sfortunatamente, può ancora avere qualche singhiozzo in cui normalmente il JAD avrebbe avuto successo.

+0

Non è stato possibile scaricare la versione Windows o Linux di JD-GUI. Questo problema mi sembra solo? – mmdemirbas

+0

@JanusTroelsen L'ho cancellato. Grazie per avermelo informato. Consente di mantenere pulite le risposte :) – pramodc84

+1

Il collegamento è morto. – Zero3

9

Qualcosa di simile:

jar -xf foo.jar && find . -iname "*.class" | xargs /opt/local/bin/jad -r 

forse?

+1

Ho usato jad per un po 'e avevo bisogno di un modo rapido per estrarre e decompilare un intero barattolo. Grazie, questo ha aiutato immensamente. –

3

Inserire il seguente in decompile.jar.sh

# Usage: decompile.jar.sh some.jar [-d] 

# clean target folders 
function clean_target { 
    rm -rf $unjar $src $jad_log 
} 

# clean all debug stuff 
function clean_stuff { 
    rm -rf $unjar $jad_log 
} 

# the main function 
function work { 
    jar=$1 
    unjar=`basename $jar.unjar` 
    src=`basename $jar.src` 
    jad_log=jad.log 

    clean_target 

    unzip -q $jar -d $unjar 
    jad -d $src -ff -r -lnc -o -s java $unjar/**/*.class > $jad_log 2>&1 

    if [ ! $debug ]; then 
    clean_stuff 
    fi 

    if [ -d $src ] 
    then 
     echo "$jar has been decompiled to $src" 
    else 
     echo "Got some problems check output or run in debug mode" 
    fi 
} 

function usage { 
    echo "This script extract and decompile JAR file" 
    echo "Usage: $0 some.jar [-d]" 
    echo " where: some.jar is the target to decompile" 
    echo " use -d for debug mode" 
} 

# check params 
if [ -n "$1" ] 
    then 
    if [ "$2" == "-d" ]; then 
     debug=true 
     set -x 
    fi 
    work $1 
    else 
    usage 
fi 
  • chmod + x decomplie.jar.sh // eseguibile
  • ln -s ./decomplie.jar.s/usr/bin/dJ

pronto all'uso, basta digitare dj your.jar e si otterrà cartella your.jar.src con le fonti. Utilizzare l'opzione -d per la modalità di debug.

+0

Grazie, ma ho dovuto cambiare "jad" in "./jad" sulla riga 23 ed eseguire "bash decompile.jar.sh foo.jar -d" perché non volevo inquinare la mia cartella bin – Sam

+0

nessun ricompilatore? ricompila i file jad in jar? –