Wie dekompiliere ich eine ganze Jar-Datei? [geschlossen]

283

Kennt jemand einen kostenlosen Dekompiler, der eine gesamte Jar-Datei anstelle einer einzelnen Klasse dekompilieren kann? Ich habe ein Problem mit Unterklassen wie Name $ 1.Klassenname $ 2.Klassenname.Klasse

Steinherz
quelle
127
Denken Sie an zwei weitere Dinge: 1) Die bloße Erwähnung eines Dekompilers führt dazu, dass der "Heiligere als du" herauskommt und Werturteile über Ihre Motive abgibt, obwohl Sie keine Ahnung haben, was Ihre geplante Verwendung ist. Seien Sie also vorsichtig, mit wem Sie sprechen. 2) Der ausgefallene JavaDecompiler bietet Ihnen eine hervorragende Wiedergabe des Codes, ist übersichtlich und leicht zu lesen - es fehlen nur Kommentare. Es ist erstaunlich gut, eine JAR-Datei wiederherzustellen, deren Quelle lange verloren gegangen ist, einschließlich der Variablennamen. Natürlich verschleiern wir unsere internen JAR-Dateien nicht.
Andrew
Siehe auch Anmerkungen im Beitrag Java-Dekompiler auswählen und testen .
dma_k
8
Ich habe diesen Thread so oft besucht, als ich untersuchen musste, wie jemand etwas für ein Bukkit-Plugin erreicht hat ... Dieser Kommentar lässt mich immer mit einem Lächeln zurück. Ich wünschte, ich könnte es jedes Mal verbessern, wenn ich vorbeischaue.
Jane Panda
SecureTeam Java Decompiler kann das.
SecureTeam Software
Einfacher Online-Dekompiler, wenn Sie keine Software herunterladen möchten. javadecompilers.com
Nick Graham

Antworten:

313

2009: JavaDecompiler kann mit einem JAR gute Arbeit leisten: Seit 0.2.5 werden alle Dateien in JAR-Dateien angezeigt.

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

Siehe auch die Frage "Wie" dekompiliere "ich Java-Klassendateien?" .

Die JD-Eclipse scheint sich jedoch seit Ende 2009 nicht geändert zu haben (siehe Änderungen ).
Daher kann die Integration in die neueste Version von Eclipse (3.8, 4.2+) problematisch sein.

JD-Core wird aktiv gewartet.

Beide sind das Ergebnis der fantastischen Arbeit von (SO-Benutzer) Emmanuel Dupuy .


2018: Eine modernere Option, die in den Kommentaren von David Kennedy Araujo erwähnt wird :

JetBrains / Intellij-Community / Plugins / Java-Dekompiler / Engine

Fernflower ist der erste tatsächlich funktionierende analytische Dekompiler für Java und wahrscheinlich für eine Programmiersprache auf hoher Ebene im Allgemeinen.

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\

Siehe auch Dekompilieren in Java-Dateien Intellij Idee für einen Befehl, der mit der neuesten IntelliJ IDEA arbeitet.

VonC
quelle
5
Zu Ihrer Information, Java Decompiler funktioniert unter Windows, Mac und Linux.
Yanokwa
4
@AlexS nice :) Nächster Schritt: Versionskontrolle ( stackoverflow.com/questions/59561/… ) und dann kontinuierliche Integration ( stackoverflow.com/questions/130592/… )
VonC
3
Mit Java Decompiler können Sie die JAR-Datei öffnen und zu Datei, Alle Quellen speichern wechseln. Es speichert alle Klassendateien in Java-Dateien = D
Akira Yamamoto
2
Bitte denken Sie daran, dass es auch Fehler macht. Ich habe eine Klasse mit einer Member-Variablen, die in den Parameter einer Funktion verschoben wurde, wodurch die Wirkung des Codes zerstört wurde. Pass auf, es wird dich kriegen.
CharlesW
1
JD ist ein guter Ausgangspunkt, kann jedoch komplexen Code nicht dekompilieren. Eine gute Alternative ist die Verwendung von github.com/JetBrains/intellij-community/tree/master/plugins/…
David Kennedy
37

Zunächst ist zu beachten, dass alle Java-Archivdateien ( .jar/ .war/ etc ...) im Grunde genommen nur ausgefallene .zipDateien sind , mit einigen zusätzlichen Manifesten und Metadaten.

Zweitens verwende ich persönlich mehrere Tools, um dieses Problem auf allen Ebenen zu lösen:

  • Jad + Jadclipse während der Arbeit in der IDE zum Dekompilieren von.classDateien
  • WinRAR , mein bevorzugtes Komprimierungswerkzeug, unterstützt nativ Java-Archive (siehe auch erster Absatz).
  • Über Compare hinaus kann mein bevorzugtes Diff-Tool bei korrekter Konfiguration spontane Vergleiche zwischen beliebigen Archivdateien, einschließlichjars, durchführen. Einen Versuch wert.

Der Vorteil all der oben genannten ist, dass ich kein anderes externes Werkzeug halten muss, das meine Arbeitsumgebung überfüllt. Alles, was ich jemals von einer dieser Dateien benötige, kann in meiner IDE verarbeitet oder nativ von anderen Dateien unterschieden werden.

Yuval Adam
quelle
lolz ich entpacke immer wieder Chrome und Firefox-Erweiterungen und ich habe vergessen, dass .jar auch nur Reißverschlüsse sind :)
Carter Cole
36

Wenn Sie zufällig sowohl eine Bash-Shell als auch einen Jad haben:

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

Ich mag ein kleines bisschen damit einverstanden sein, aber es sollte mehr oder weniger wie angekündigt funktionieren. Sie sollten am Ende $JAR.tmpIhre dekompilierten Dateien enthalten.

Chris R.
quelle
1
Verwenden Sie unter Ubuntu #! / bin / bash anstelle von #! / bin / sh, da pushd für die Standard-Ubuntu-Shell nicht
funktioniert
1
Ich verwende javapinnerhalb dieser grundlegenden Schleifenstruktur und es funktioniert für mich.
Chris Prince
25

Ich hatte vernünftigen Erfolg mit einem Tool namens (frustrierend) " JD: Java Decompiler ".

Ich habe es besser gefunden als die meisten Dekompilierer, wenn es um Klassen geht, die für Java 5 und höher kompiliert wurden . Leider kann es immer noch zu Schluckauf kommen, bei denen JAD normalerweise erfolgreich wäre.

Adam Paynter
quelle
Ich konnte keine Windows- oder Linux-Version von JD-GUI herunterladen. Erscheint mir dieses Problem nur?
mmdemirbas
@ JanusTroelsen Ich habe es gelöscht. Vielen Dank für die Benachrichtigung. Lasst
uns
@ Zero3: aktualisiert
Gowtham Gopalakrishnan
11

Etwas wie:

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

vielleicht?

Cybertoast
quelle
1
Ich habe Jad für eine Weile benutzt und brauchte einen schnellen Weg, um ein ganzes Glas zu extrahieren und zu dekompilieren. Danke, das hat immens geholfen.
Alper Akture
5

Fügen Sie Folgendes in decompile.jar.sh ein

# 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 // ausführbare Datei
  • ln -s ./decomplie.jar.s / usr / bin / dj

Gebrauchsfertig, geben Sie einfach ein dj your.jarund Sie erhalten einen your.jar.srcOrdner mit Quellen. Verwenden Sie die -dOption für den Debug-Modus.

Merzod
quelle
Danke, aber ich musste "jad" in "./jad" in Zeile 23 ändern und "bash decompile.jar.sh foo.jar -d" ausführen, da ich meinen bin-Ordner nicht verschmutzen wollte
Sam
irgendein Recompiler? JAD-Dateien in JAR neu kompilieren?
N Jay
2

Eine JAR-Datei ist nur eine Zip-Datei mit der JAR-Erweiterung. Sie sollten in der Lage sein, ein Glas wie eine Zip-Datei zu entpacken (winzip).

Cadoo
quelle
1

Sie extrahieren es und verwenden dann jad gegen das Verzeichnis.

yanchenko
quelle
Ich glaube nicht, dass man es einfach gegen das Dir laufen lassen kann. Sie müssen {dir} / ** / *. Class
Vihung
Extrahieren Sie das Glas und verwenden Sie etwas wie jad {dir}, ich habe es gerade getestet und funktioniert nicht unter Windows
Jaime Hablutzel
1

Hinweis: Diese Lösung funktioniert nur für Mac- und * nix-Benutzer.

Ich habe auch versucht, Jad ohne Glück zu finden. Meine schnelle Lösung bestand darin, MacJad herunterzuladen , das Jad enthält. Sobald Sie es heruntergeladen haben, finden Sie jad unter [wo Sie Macjad heruntergeladen haben] / MacJAD / Contents / Resources / jad.

Joel S.
quelle