Der Decompiler Jad
Jad (von Java Decompiler) ist ein frei verfügbarer Decompiler von Pavel Kouznetsov und oft unter der folgenden Adresse zu beziehen: http://www.kpdus.com/jad.html. Jad ist in C++ geschrieben und decompiliert die Dateien sehr schnell. Bedauerlicherweise hat der Autor die Entwicklung von Jad eingestellt und möchte auch den Quellcode nicht freigeben, um eine Weiterentwicklung zu ermöglichen.
Da Jad auf jeden Fall den Bytecode auseinandernehmen muss, lässt sich zum Disassemblieren der Java-Bytecode auch in den Quellcodezeilen einblenden; eine prima Möglichkeit, Bytecode zu lernen und zu sehen, wie der Compiler funktioniert. Einen weiteren Pluspunkt bekommt Jad im Umgang mit Klassendateien, die ein Obfuscator (leicht) verunstaltete. Daraus wird wieder gültiger Java-Code erzeugt. Manchmal muss Jad aber auch aufgeben, und dann verschwinden beispielsweise Zuweisungen.
Vom Download zur Installation
Jad liegt zurzeit in der Version 1.5.8 vor. Obwohl Jad im Quelltext nicht existiert, ist die Unterstützung von verschiedenen Betriebssystemen gewährleistet, unter anderem von Windows 9x/NT/2000, Linux und Mac OS X auf Intel-Plattformen.
Das Programm ist schnell geladen und ebenso schnell entpackt. Danach offenbaren sich zwei Dateien, eine ausführbare Datei namens jad.exe (Windows 95/NT) oder jad (Unix) sowie eine Liesmich-Datei readme.txt, die eine kurze Anleitung für Jad enthält. Eine grafische Oberfläche wie FrontEnd Plus vereinfacht die Anwendung noch weiter, da sie zusammen mit Jad in einem leicht zu nutzenden Windows-Programm daherkommt. Unter http://jadclipse.sourceforge.net/ ist auch ein Plugin für Eclipse erhältlich. Doch bleiben wir bei der Kommandozeile.
Jad benutzen
Um eine Klassendatei zu decompilieren, wird Jad einfach auf diese Datei losgelassen:
$ jad example1.class
Ohne zusätzliche Option legt Jad eine Datei example1.jad im Arbeitsverzeichnis an. Jad verwendet nicht den Namen der Datei als Ausgabe, sondern den Namen der Klasse. Enthält also example1.class keine Klasse mit dem Namen example1, sondern mit dem Namen expl1, so heißt die Datei auch expl1.jad und nicht example1.jad. Existiert schon eine Datei dieses Namens, dann fragt Jad vorher nach, ob sie überschrieben werden kann. Die Option -o überschreibt, ohne zu fragen. Jad lässt auch Wildcards zum Aussortieren der Dateien zu. Ist der Standardname nicht sinnvoll, lässt sich über den Schalter -s eine andere Extension erzeugen. Statt der Endung jad legen wir im folgenden Beispiel .java fest:
$ jad -sjava example1.class
Beim gleichzeitigen Verwenden der beiden Schalter -o und -sjava muss darauf geachtet werden, dass Jad beim Experimentieren die ursprüngliche Quelldatei nicht überschreibt.
Soll Jad alle Java-Klassen eines ganzen Dateibaums decompilieren, eignet sich dafür der Schalter -r. Denn dieser erstellt auch Unterverzeichnisse im angegebenen Stammverzeichnis (Option -d):
$ jad -o -r -sjava -dsrc tree/**/*.class (WIN) $ jad -o -r -sjava -dsrc ’tree/**/*.class’ (Unix)
Gibt es also in der Datei tree/a/b/c.class die Klasse »c« vom Paket a.b, dann geht die Ausgabe in src/a/b/c.java. Die möglichen Schalter, wie –o oder –r, gibt jad dann aus, wenn es auf der Kommandozeile ohne weitere Angaben aufgerufen wird.