
Dekompiler von Java-Bytecode nach Java, verwendet in IntelliJ IDEA.
Fernflower ist der erste tatsächlich funktionierende analytische Dekompiler für Java und wahrscheinlich für eine höhere Programmiersprache im Allgemeinen.
Veröffentlichungen werden im Intellij Community repository veröffentlicht.
Bitte senden Sie Ihre Fehlerberichte und Funktionswünsche an den issue tracker (im Subsystem Java. Decompiler. Engine).
Fernflower wird in IntelliJ IDEA mitgeliefert und hauptsächlich verwendet, um Java-Code beim Debuggen oder Navigieren durch Klassendateien anzuzeigen.
Fernflower kann im eigenständigen Modus über die Kommandozeile mit folgendem Befehl ausgeführt werden:
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
* bedeutet null oder mehr Wiederholungen
+ bedeutet ein oder mehrere Male
<source>: Datei oder Verzeichnis mit zu dekompilierenden Dateien. Verzeichnisse werden rekursiv durchsucht. Erlaubte Dateierweiterungen sind class, zip und jar. Quellen, die mit -e= beginnen, bedeuten „Library“-Dateien, die nicht dekompiliert, aber bei der Analyse von Beziehungen zwischen Klassen oder Methoden berücksichtigt werden. Insbesondere die Umbenennung von Bezeichnern (siehe Option ren) kann von Informationen über externe Klassen profitieren.
<destination>: Zielverzeichnis, in das der resultierende Java-Quellcode abgelegt wird
<option>=<value>: eine Kommandozeilenoption mit dem entsprechenden Wert (siehe „Kommandozeilenoptionen“ unten).
java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\
Außer bei mpm und urc bedeutet der Wert 1, dass die Option aktiviert ist, 0 - deaktiviert. Der Standardwert, falls vorhanden, ist in Klammern angegeben.
Typischerweise werden die folgenden Optionen vom Benutzer geändert, falls überhaupt: hes, hdc, dgs, mpm, ren, urc. Die restlichen Optionen können so belassen werden: Sie sind für professionelle Reverse Engineers gedacht.
rbr (1): Brückenmethoden ausblendenrsy (0): synthetische Klassenmitglieder ausblendendin (1): innere Klassen dekompilierendc4 (1): 1.4-Klassenreferenzen zusammenfassendas (1): Assertions dekompilierenhes (1): leeren Super-Aufruf ausblendenhdc (1): leeren Standardkonstruktor ausblendendgs (0): generische Signaturen dekompilierenner (1): annehmen, dass Rückgabe keine Ausnahmen wirftden (1): Aufzählungen dekompilierenrgn (1): getClass()-Aufruf entfernen, wenn er Teil einer qualifizierten new-Anweisung istlit (0): numerische Literale „wie sie sind“ ausgebenEinige Obfuskatoren vergeben kurze, bedeutungslose und vor allem mehrdeutige Namen für Klassen und ihre Member-Elemente. Das Neukompilieren solchen Codes führt zu einer großen Anzahl von Konflikten. Daher ist es ratsam, den Dekompiler seinerseits Elemente umbenennen zu lassen, um die Eindeutigkeit jedes Bezeichners zu gewährleisten.
Die Option ren (d.h. -ren=1) aktiviert die Umbenennungsfunktion. Die Standard-Umbenennungsstrategie ist wie folgt:
org.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer implementiert, in der Option urc (z.B. -urc=com.example.MyRenamer) an Fernflower. Die Klasse muss im Anwendungsklassenpfad verfügbar sein.Die Bedeutung jeder Methode sollte aus der Benennung klar sein: toBeRenamed bestimmt, ob das Element umbenannt wird, während die anderen drei neue Namen für Klassen, Methoden bzw. Felder bereitstellen.
Erstellen Sie ein ausführbares Startskript:
./gradlew :installDist
Das Startskript wird in build/install/engine/bin generiert.
Fernflower ist Teil des IntelliJ Community Projekts, Beiträge sind willkommen, die bevorzugte Methode zum Senden von Patches ist das Erstellen eines Pull Requests im IntelliJ Community Repository. Bitte folgen Sie beim Einreichen von Patches den Beitragsrichtlinien.
Fernflower ist unter der Apache License Version 2.0 lizenziert.
Fernflower wurde ursprünglich von Stiver entwickelt, wird aber seit 2014 von JetBrains gepflegt. Einige Patches von ForgeFlower wurden in dieses Repository eingefügt. Der Mirror von Fernflower wurde auch von Andrew McRae sehr lange gepflegt.
Der korrekte Name ist Fernflower, nicht FernFlower.
asc (0): nicht-ASCII-Zeichen in String- und Zeichenliteralen als Unicode-Escapes kodierenbto (1): int 1 als boolean true interpretieren (Workaround für einen Compilerfehler)nns (0): nicht gesetztes synthetisches Attribut erlauben (Workaround für einen Compilerfehler)uto (1): namenlose Typen als java.lang.Object betrachten (Workaround für einen Architekturfehler des Compilers)udv (1): Variablennamen aus Debug-Informationen rekonstruieren, falls vorhandenump (1): Parameternamen aus entsprechenden Attributen rekonstruieren, falls vorhandenrer (1): leere Ausnahmebereiche entfernenfdi (1): finally-Strukturen ent-inlinenmpm (0): maximale erlaubte Verarbeitungszeit pro dekompilierter Methode in Sekunden. 0 bedeutet keine Obergrenzeren (0): mehrdeutige (bzw. verschleierte) Klassen und Klassenelemente umbenennenurc (-): vollständiger Name einer benutzerdefinierten Klasse, die das Interface IIdentifierRenamer implementiert. Wird verwendet, um zu bestimmen, welche Klassenbezeichner umbenannt werden sollen, und liefert neue Bezeichnernamen (siehe „Umbenennen von Bezeichnern“)inn (1): auf IntelliJ IDEA-spezifische @NotNull-Annotation prüfen und eingefügten Code entfernen, falls gefundenlac (0): Lambda-Ausdrücke in anonyme Klassen dekompilierennls (0): ein Zeichen für neue Zeile definieren, das für die Ausgabe verwendet wird. 0 - '\r\n' (Windows), 1 - '\n' (Unix), Standard ist betriebssystemabhängigind: Einrückungszeichenfolge (Standard ist 3 Leerzeichen)crp (0): Record-Patterns verwenden, wo möglichcps (0): Switch mit Patterns verwenden, wo möglichlog (INFO): ein Protokollierungsgrad, mögliche Werte sind TRACE, INFO, WARN, ERRORiec (0): den gesamten Klassenpfad im Kontext beim Dekompilieren einschließenisl (1): einfache Lambda-Ausdrücke inline einfügenucrc (1): unnötigen Record-Konstruktor und Getter ausblendencci (1): prüfen, ob die Ressource in try-with-resources tatsächlich das Interface AutoCloseable implementiertjvn (0): alle lokalen Variablennamen mit JAD-Stil-Namen überschreibenjpr (0): Parameternamen in die JAD-Benennung einbeziehenpbo (0): klärende Klammern hinzufügen, wenn bitweise/Schiebeoperatoren mit arithmetischen Operatoren gemischt werden