jarjarbigs

Ein Tool zum Zusammenführen von JAR Dateien für Java Remote-Debugging Szenarien

Dies ist eine übersetzte Version. Das englische Original finden Sie hier.

Wenn es um die Analyse von Closed-Source-Java-Anwendungen geht, starten die meisten Forscher schnell einen Decompiler wie JD-GUI und beginnen mit der Analyse. Diese Tools sind gut, erlauben aber nur eine statische Analyse. Bei komplexem Code ist es oft sinnvoller, einen Debugger zu verwenden und die Anwendung während der Laufzeit zu analysieren.

Anders als dnspy (ein Decompiler für .NET-Anwendungen) bietet JD-GUI selbst keine Debugging-Funktionen. Es ist jedoch möglich, IDEs wie Intellij oder Eclipse mit einem Decompiler-Plugin zu erweitern.

Um eine externe Java Applikation zu debuggen, gehen Sie grundsätzlich wie folgt vor:

  • Erstelle ein neues Java-Projekt, und nehme die .class- und jar-Dateien als externe Dateien in den Build-Pfad auf.
  • Aktivieren der Remote-Debugging Funktionalität im Java Startaufruf der Zielapplikation.
  • Konfiguration von Remote-Debugging innerhalb von Eclipse

JD-Eclipse hat seine eigenen Probleme, eines davon ist das Auffindens/Dekompilieren einer .class-Datei, die sich in einer anderen jar-Datei befindet. Wir können dieses Problem umgehen, indem wir alle .class-Dateien in einer großen jar-Datei ablegen.

jarjarbigs.py ist ein einfaches Python-Skript, das genau das tut. Es durchläuft rekursiv ein Verzeichnis, entpackt alle jar/war/ear-Dateien und fügt die Class-Dateien in eine einzelnen jar-Datei zusammen. Die so erstellte Datei kann dann als externe JAR Archiv in ein Eclipse-Projekt eingebunden werden. Das Skript basiert auf einer Idee von Matthias Kaiser, wechler rsync für diese Aufgabe verwendete.

h0ng10@rocksteady ~/w/jarjarbigs> python3 jarjarbigs.py -h
--- jarjarbigs.py 0.1 by MOGWAI LABS GmbH --------------------------------------

usage: jarjarbigs.py [-h] [-l LOGFILE] [-x XML] source destination

jarjarbigs.py - create a huge jar file from existing jar/war/ear files

positional arguments:
  source                source directory with jar/war/ear files
  destination           destination jar file

optional arguments:
  -h, --help            show this help message and exit
  -l LOGFILE, --logfile LOGFILE
                        Create a log file which jar contains which classes
  -x XML, --xml XML     Create a second zip archive that contains all xml- and
                        property files

Das Verwenden von jarjarbigs.py ist recht einfach, es genügt die Angabe des Verzeichnisses mit den JAR Dateien sowie den Namen der zu generierenden JAR Datei anzugeben.

python3 jarjarbigs.py /home/h0ng10/temp/java/testclient/ /home/h0ng10/temp/merged.jar                                                                                                  
--- jarjarbigs.py 0.1 by MOGWAI LABS GmbH --------------------------------------

[+] Processing /home/h0ng10/temp/java/testclient/applications/ScriptGridBean-v2.2.jar
[+] Processing /home/h0ng10/temp/java/testclient/applications/POVRayGridBean-v3.6.jar
[+] new archive(s) found: ['/tmp/jarjarbigsugf0yecm/png.jar']
[+] Processing /tmp/jarjarbigsugf0yecm/png.jar
[+] Processing /home/h0ng10/temp/java/testclient/applications/GenericGridBean-v2.3.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/charsets.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/management-agent.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/resources.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/jce.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/jsse.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/ext/nashorn.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/ext/zipfs.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/ext/sunec.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/ext/cldrdata.jar
[+] Processing /home/h0ng10/temp/java/testclient/jre_1.8.101/lib/ext/sunjce_provider.jar
[+] Processing /home/h0ng10/temp/java/testclient/plugins/de.fzj.unicore.rcp.terminal_7.4.0.jar  
[+] Processing /home/h0ng10/temp/java/testclient/plugins/org.eclipse.swt.gtk.linux.x86_64_3.107.0.v20180611-0422.jar  
[+] Processing /home/h0ng10/temp/java/testclient/plugins/org.sat4j.pb_2.3.5.v201404071733.jar  
[+] Creating jar archive /home/h0ng10/temp/merged.jar

jarjarbigs.py geht rekursiv durch alle Unterverzeichnisse und führt alle Klassendateien aus jar-, war- und ear-Archiven zusammen. Dies beinhaltet auch jar-Dateien ein, die Teil von extrahierten war/ear-Archiven sind. Das dabei erzeugte Archiv kann dann als externes JAR zum Eclipse-Projekt hinzugefügt werden.

Hinzufügen einer exterenn JAR Datei zu einem Eclipse Java Project

Weitere Funktionen

Logdateien
jarjarbigs.py erlaubt das Erstellen einer Textdatei, die protokolliert welches JAR Archiv welche .class-Datei enthält. Dies kann nützlich sein, wenn beispielsweise ein kleines PoC-Tool erstellt werden muss das nur auf die notwendigen Klassen/jar-Dateien enthält. Zum Erstellen einer Logdatei verwendet das Kommandozeilenargument “-l”.

jarjarbigs.py can create a text file that logs which archive contained which .class file. This can be useful if you need to create a small PoC tool that only references the necessary classes/jar files. Use the “-l” parameter to do that.

python3 jarjarbigs.py /opt/path/to/application /home/h0ng10/work/merged.jar -l /tmp/jarjarbigs.log

Eine typische Logdatei sieht wie folgt aus:

POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_oFFs.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_gIFx.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_pHYs.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngBitMover8RGBA.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_iTXt.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngBitMover4G.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngUnfilterInputStream.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_IHDR.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_tIME.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_iCCP.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngBitMover8G.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngAbstractTextChunk.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngBitMover16G.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_IEND.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngAdam7Interlacer.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_sBIT.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_hIST.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngBitMover16GA.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngBitMover.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngTextChunk.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngIDATInputStream.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngPngImage$Data.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_tRNS.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_pCAL.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngPngExceptionSoft.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunkHandler.class
POVRayGridBean-v3.6.jar: com/sixlegs/image/pngChunk_PLTE.class

Speichern von xml-/properties Dateien
war/ear-Archive enthalten auch XML- oder .properties Dateien, die nicht in das erzeugte JAR-Archiv übernommen werden. Da diese Dateien oft nützliche Informationen für die Analyse einer Anwendung liefern, erlaubt jarjarbigs.py diese in einem separaten Zip-Archiv zu speichern.

python3 jarjarbigs.py /opt/path/to/application /home/h0ng10/work/merged.jar -x /tmp/application.xml

Ihr findet jarjarbigs auf unserem GitHub account.


Vielen Dank an Ethan Sykes bei Unsplash für das Titelbild.