{"id":463,"date":"2010-03-02T14:46:00","date_gmt":"2010-03-02T14:46:00","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=463"},"modified":"2010-03-02T14:46:00","modified_gmt":"2010-03-02T14:46:00","slug":"java-decompiler-jd-jad","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2010\/03\/java-decompiler-jd-jad\/","title":{"rendered":"Java Decompiler: JD, Jad"},"content":{"rendered":"<p>Der Java-Compilers erzeugt aus der Quellcodedatei eine Klassendatei und der Decompiler dreht die Arbeitsweise um. Decompiler gibt es f\u00fcr die verschiedenen Programmiersprachen und Java geh\u00f6rt zu den Sprachen, bei der die Zur\u00fcck\u00fcbersetzung einfacher ist als bei optimierten Maschinenprogrammen, die zum Beispiel ein C++-Compiler erzeugt. Der Grund ist, dass im Bytecode viele wertvolle Informationen enthalten sind, die in herk\u00f6mmlichen Maschinencode nicht auftauchen. Darunter sind etwa Typinformationen oder Hinweise, ob ein Methodenaufruf virtuell ist oder nicht. Sie sind f\u00fcr die Java-Laufzeitumgebung wichtig und eine gro\u00dfe Hilfe, wenn es darum geht, mit einem Decompiler verlorenen Quellcode wiederzubeleben oder an fehlende Informationen aus Paketen von Fremdherstellern zu gelangen. <\/p>\n<p>Ein Decompiler liest die Klassendatei als Bytefeld ein und beginnt mit der Analyse. Da der Bytecode gut dokumentiert ist, ist das Extrahieren von Variablen- oder Methodennamen einfach. Schwierig sind die Anweisungen. Aus dem Java-Bytecode f\u00fcr eine Methode baut ein Decompiler einen Kontrollfluss-Graphen auf und versucht, Anweisungen und Ausdr\u00fccke zu erkennen, die bei der \u00dcbersetzung bestimmter Sprachkonstrukte entstanden sein m\u00fcssten. Das ist eine nicht-triviale Aufgabe und immer noch Gegenstand einiger Diplomarbeiten. Und da Variablennamen durch einen Obfuscator eventuell ung\u00fcltig gemacht worden sind, muss ein guter Decompiler diese illegalen Bezeichnernamen korrigieren und weitere Tricksereien vom Obfuscator r\u00fcckg\u00e4ngig machen. Diese Umbenennung \u00e4ndert den Algorithmus nicht, und ein Decompiler hat es bei dieser Art von Verschleierung einfach.  <\/p>\n<p>Ist das legal?&nbsp;&nbsp; Lassen wir einen Decompiler auf den eigenen Programmcode los, weil etwa der Quellcode verschwunden ist, dann ist die Anwendung kein rechtliches Problem. Das Reverse Engineering von vollst\u00e4ndigen Anwendungen, die unter Urheberschutz stehen, muss nicht unbedingt ein Problem darstellen. Vielmehr beginnt die Straftat, wenn dieser Quelltext ver\u00e4ndert und als Eigenleistung verkauft wird. <\/p>\n<p>Da mittlerweile auch andere Compiler auf dem Markt sind, die Java-Bytecode erzeugen \u2013 etwa aus EIFFEL-Programmen oder aus diversen LISP-Dialekten \u2013, ist \u00fcber den Umweg Compiler\/Klassendatei\/Decompiler ein Crosscompiling denkbar. Hier sind jedoch einige Einschr\u00e4nkungen bez\u00fcglich der auf dem Markt befindlichen Decompiler erkennbar. Denn fremde Compiler, die Java-Bytecode erstellen, haben andere Techniken, die der Decompiler dann nicht immer passend \u00fcbersetzen kann.<\/p>\n<p><strong>Java Decompiler project (JD) und Alternativen<\/strong><\/p>\n<p>Der Markt an leistungsstarken Decompilatoren ist sehr \u00fcbersichtlich. Das beste Tool (aber auch nicht ganz fehlerfrei) ist zurzeit JD (<a href=\"http:\/\/java.decompiler.free.fr\/)\">http:\/\/java.decompiler.free.fr\/)<\/a>. Das frei verf\u00fcgbare \u2013 aber nicht quelloffene \u2013 Programm ist als Bibliothek JD-Core, als alleinstehende grafische Anwendung JD-GUI und Eclipse-Plugin&nbsp; JD-Eclipse verf\u00fcgbar. JD selbst ist in C++ geschrieben und ben\u00f6tigt daher keine JVM. JD verarbeitet den Bytecode verschiedener Compiler, wobei das JDK 1.1 bis JDK 6 selbstverst\u00e4ndlich mit in der Liste ist, genauso wie der Eclipse-Compiler. (Die Unterscheidung ist nicht ganz uninteressant, da die Compiler sich in machen Details in der Bytecode-Abbildung doch unterscheiden.) JD-GUI ist f\u00fcr die Plattformen Windows, Linux und Mac unter dem Punkt <a href=\"http:\/\/java.decompiler.free.fr\/?q=jdgui#downloads\">http:\/\/java.decompiler.free.fr\/?q=jdgui#downloads<\/a> verf\u00fcgbar und bietet neben dem Decompileren einzelner Java-Klassen und ganzen Java-Archiven eine angenehme Quellcodedarstellung mit farblicher Unterlegung und Drag &amp; Drop.<\/p>\n<p><a href=\"http:\/\/lh6.ggpht.com\/_gE1YIJtpGBw\/S40kpfIjJQI\/AAAAAAAAAMM\/VfKSksdJ2BM\/s1600-h\/JD%5B3%5D.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px\" title=\"JD\" border=\"0\" alt=\"JD\" src=\"http:\/\/lh4.ggpht.com\/_gE1YIJtpGBw\/S40kp5_3_JI\/AAAAAAAAAMQ\/jdavEqN8nw0\/JD_thumb%5B1%5D.png?imgmax=800\" width=\"560\" height=\"484\"><\/a> <\/p>\n<p>Sehr lange war der Decompiler Jad die Referenz. Doch nur von 1997 bis 2001 hat Pavel Kouznetsov das Kommandozeilenprogramm in C++ entwickelt und dann auch 2009 seine Webseite vom Netz genommen. Eine Privatperson hat jedoch die Webseite gespiegelt und unter <a href=\"http:\/\/www.varaneckas.com\/jad\">http:\/\/www.varaneckas.com\/jad<\/a> lebt das Projekt (auf unbestimmte Zeit) weiter. Wer Projekte bis Java 1.4 decompilieren m\u00f6chte, ist mit dem Tool sehr gut bedient. F\u00fcr Java 5 Projekte hilft JadRetro (<a href=\"http:\/\/jadretro.sourceforge.net\/)\">http:\/\/jadretro.sourceforge.net\/)<\/a>&nbsp; noch ein wenig nach, in dem es Java 5 Bytecode auf Java 1.4 anpasst und kleine \u00c4nderungen im Bytecode durchf\u00fchrt. FrontEnd Plus ist eine grafische Oberfl\u00e4che f\u00fcr Jad, doch auch sie ist vom Internet verschwunden, seit dem es Jad nicht mehr offiziell gibt. Unter <a href=\"http:\/\/jadclipse.sourceforge.net\/\">http:\/\/jadclipse.sourceforge.net\/<\/a> ist auch ein Plugin f\u00fcr Eclipse erh\u00e4ltlich, dessen Ende aber ebenfalls eingel\u00e4utet ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Java-Compilers erzeugt aus der Quellcodedatei eine Klassendatei und der Decompiler dreht die Arbeitsweise um. Decompiler gibt es f\u00fcr die verschiedenen Programmiersprachen und Java geh\u00f6rt zu den Sprachen, bei der die Zur\u00fcck\u00fcbersetzung einfacher ist als bei optimierten Maschinenprogrammen, die zum Beispiel ein C++-Compiler erzeugt. Der Grund ist, dass im Bytecode viele wertvolle Informationen enthalten sind, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-463","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/463","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=463"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/463\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}