Come decompilare un intero file Jar? [chiuso]


283

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.class


127
Ricorda altre due cose: 1) La semplice menzione di un decompilatore farà sì che il "più santo di te" venga fuori e dia giudizi di valore sui tuoi motivi nonostante non abbia idea di quale sia il tuo uso previsto, quindi fai attenzione con chi parli. 2) Il fantastico JavaDecompiler ti darà una resa eccellente del codice, ben strutturato e di facile lettura - mancano solo commenti. È sorprendentemente buono, recuperando un file JAR che aveva da tempo perso la fonte completa di nomi di variabili. Ovviamente non offuschiamo i nostri file JAR interni.
Andrew,

Vedi anche le osservazioni nel post Scegli e testa il decompilatore java .
dma_k,

8
Mi sono fermato da questa discussione tante volte quando avevo bisogno di studiare come qualcuno ha realizzato qualcosa per un plugin Bukkit ... Quel commento mi lascia sempre con un sorriso. Vorrei poterlo votare ogni volta che mi fermo.
Jane Panda,


Decompilatore online semplice se non si desidera scaricare alcun software. javadecompilers.com
Nick Graham,

Risposte:


313

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

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

Vedi anche la domanda "Come posso" decompilare "i file di classe Java?" .

JD-Eclipse non sembra essere cambiato dalla fine del 2009 (vedi Modifiche ).
Quindi la sua integrazione con l'ultimo Eclipse (3.8, 4.2+) potrebbe essere problematica.

JD-Core è attivamente mantenuto.

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


2018: un'opzione più moderna, menzionata nei commenti di David Kennedy Araujo :

JetBrains / IntelliJ-community / plugins / java-decompilatore / motore

Fernflower è il primo decompilatore analitico realmente funzionante per Java e probabilmente per un linguaggio di programmazione di alto livello in generale.

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

Vedi anche Come decompilare i file java intellij idea per un comando che funziona con IntelliJ IDEA recente.


5
a proposito, Java Decompiler funziona su Windows, Mac e Linux.
yanokwa,

4
@AlexS bello :) Il passo successivo: il controllo di versione ( stackoverflow.com/questions/59561/... ) E poi continua integrazione ( stackoverflow.com/questions/130592/... )
VonC

3
Con Java Decompiler puoi aprire il file JAR e andare su File, Salva tutte le fonti. Salva tutti i file di classe in file java = D
Akira Yamamoto

2
Ricorda che commette anche errori. Ho una classe con una variabile Member e l'ha spostata nel parametro di una funzione, distruggendo l'effetto del codice. Attento, ti prenderà.
CharlesW,

1
JD è un buon punto di partenza ma non riesce a decompilare il codice complesso. Una buona alternativa è usare github.com/JetBrains/intellij-community/tree/master/plugins/…
David Kennedy,

37

Prima di tutto, vale la pena ricordare che tutti i file di archivio Java ( .jar/ .war/ etc ...) sono fondamentalmente solo .zipfile di fantasia , con alcuni manifest e metadati aggiunti.

In secondo luogo, per affrontare questo problema uso personalmente diversi strumenti che gestiscono questo problema a tutti i livelli:

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

Il vantaggio di tutti i summenzionati è che non ho bisogno di alcun 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 in modo nativo con altri file.


lolz continuo a decomprimere le estensioni di Chrome e Firefox e ho dimenticato che .jar sono anche solo zip :)
Carter Cole,

36

Se ti capita di avere sia una shell bash che una 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 po 'piccolo con quello, ma dovrebbe funzionare più o meno come pubblicizzato. Dovresti finire con il $JAR.tmpcontenere i tuoi file decompilati.


1
su Ubuntu usa #! / bin / bash invece di #! / bin / sh perché pushd non funziona per la shell di ubuntu predefinita ...
mossplix

1
Sto usando javapall'interno di questa struttura ad anello di base e funziona per me.
Chris Prince,

25

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

L'ho trovato migliore della maggior parte dei decompilatori quando ho a che fare con le classi compilate per Java 5 e successive . Sfortunatamente, può ancora avere qualche singhiozzo in cui JAD avrebbe normalmente successo.


Impossibile scaricare la versione Windows o Linux di JD-GUI. Questo problema mi appare solo?
mmdemirbas,

@JanusTroelsen L'ho eliminato. Grazie per averlo notificato. Manteniamo le risposte pulite :)
pramodc84

@ Zero3: aggiornato
Gowtham Gopalakrishnan,

11

Qualcosa di simile a:

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

può essere?


1
Ho usato jad per un po 'e avevo bisogno di un modo rapido per estrarre e decompilare un intero vaso. Grazie, questo ha aiutato immensamente.
Alper Akture,

5

Inserisci quanto segue 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 per l'uso, basta digitare dj your.jare otterrai la your.jar.srccartella con le fonti. Utilizzare l' -dopzione per la modalità debug.


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

qualche ricompilatore? ricompila i file jad in jar?
N Jay,

2

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


1

Lo estrai e poi usi jad contro la dir.


Non penso che tu possa semplicemente lanciarlo contro il dir. Dovrai specificare {dir} / ** / *. Class
Vihung,

Estrai il vaso e usa qualcosa come jad {dir}, l'ho appena testato e non funziona su Windows
Jaime Hablutzel,

1

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

Ho anche provato a trovare Jad senza fortuna. La mia soluzione rapida è stata quella di scaricare MacJad che contiene jad . Una volta scaricato, puoi trovare jad in [dove-hai-scaricato-macjad] / MacJAD / Contenuti / Risorse / jad.

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.