Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
fernflower — Dekompiler von Java-Bytecode nach Java, verwendet in IntelliJ IDEA. | Kitploit
Tools/GitHubGitHub/jetbrains/fernflower
Statische AnalyseReverse EngineeringBinäranalyse
GitHubjetbrains/fernflower

fernflower

Dekompiler von Java-Bytecode nach Java, verwendet in IntelliJ IDEA.

Repository anzeigenWebseite
4.4k726vor 10 TagenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Fernflower

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).

IntelliJ-Nutzung

Fernflower wird in IntelliJ IDEA mitgeliefert und hauptsächlich verwendet, um Java-Code beim Debuggen oder Navigieren durch Klassendateien anzuzeigen.

Kommandozeilen-Nutzung

Fernflower kann im eigenständigen Modus über die Kommandozeile mit folgendem Befehl ausgeführt werden:

root@kitploit:~
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).

Beispiele

root@kitploit:~
java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
root@kitploit:~
java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\

Kommandozeilenoptionen

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 ausblenden
  • rsy (0): synthetische Klassenmitglieder ausblenden
  • din (1): innere Klassen dekompilieren
  • dc4 (1): 1.4-Klassenreferenzen zusammenfassen
  • das (1): Assertions dekompilieren
  • hes (1): leeren Super-Aufruf ausblenden
  • hdc (1): leeren Standardkonstruktor ausblenden
  • dgs (0): generische Signaturen dekompilieren
  • ner (1): annehmen, dass Rückgabe keine Ausnahmen wirft
  • den (1): Aufzählungen dekompilieren
  • rgn (1): getClass()-Aufruf entfernen, wenn er Teil einer qualifizierten new-Anweisung ist
  • lit (0): numerische Literale „wie sie sind“ ausgeben

Umbenennen von Bezeichnern

Einige 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:

  • benenne ein Element um, wenn sein Name ein reserviertes Wort oder kürzer als 3 Zeichen ist
  • neue Namen werden nach einem einfachen Muster gebildet: (class|method|field)_<consecutive unique number>
    Sie können diese Regeln überschreiben, indem Sie Ihre eigene Implementierung der 4 Schlüsselmethoden bereitstellen, die vom Dekompiler beim Umbenennen aufgerufen werden. Übergeben Sie einfach eine Klasse, die das Interface 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.

Entwicklung

Erstellen Sie ein ausführbares Startskript:

root@kitploit:~
./gradlew :installDist

Das Startskript wird in build/install/engine/bin generiert.

Mitwirken

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.

Lizenz

Fernflower ist unter der Apache License Version 2.0 lizenziert.

Danksagungen

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.

Namensgebung

Der korrekte Name ist Fernflower, nicht FernFlower.

Tool herunterladen
  • asc (0): nicht-ASCII-Zeichen in String- und Zeichenliteralen als Unicode-Escapes kodieren
  • bto (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 vorhanden
  • ump (1): Parameternamen aus entsprechenden Attributen rekonstruieren, falls vorhanden
  • rer (1): leere Ausnahmebereiche entfernen
  • fdi (1): finally-Strukturen ent-inlinen
  • mpm (0): maximale erlaubte Verarbeitungszeit pro dekompilierter Methode in Sekunden. 0 bedeutet keine Obergrenze
  • ren (0): mehrdeutige (bzw. verschleierte) Klassen und Klassenelemente umbenennen
  • urc (-): 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 gefunden
  • lac (0): Lambda-Ausdrücke in anonyme Klassen dekompilieren
  • nls (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ängig
  • ind: Einrückungszeichenfolge (Standard ist 3 Leerzeichen)
  • crp (0): Record-Patterns verwenden, wo möglich
  • cps (0): Switch mit Patterns verwenden, wo möglich
  • log (INFO): ein Protokollierungsgrad, mögliche Werte sind TRACE, INFO, WARN, ERROR
  • iec (0): den gesamten Klassenpfad im Kontext beim Dekompilieren einschließen
  • isl (1): einfache Lambda-Ausdrücke inline einfügen
  • ucrc (1): unnötigen Record-Konstruktor und Getter ausblenden
  • cci (1): prüfen, ob die Ressource in try-with-resources tatsächlich das Interface AutoCloseable implementiert
  • jvn (0): alle lokalen Variablennamen mit JAD-Stil-Namen überschreiben
  • jpr (0): Parameternamen in die JAD-Benennung einbeziehen
  • pbo (0): klärende Klammern hinzufügen, wenn bitweise/Schiebeoperatoren mit arithmetischen Operatoren gemischt werden