Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Decompiler from Java bytecode to Java, used in IntelliJ IDEA.

License

NotificationsYou must be signed in to change notification settings

JetBrains/fernflower

Repository files navigation

Fernflower is the first actually working analytical decompiler for Java and probably for a high-level programming language in general.

Releases are published in theIntellij Community repository.

Please send your bug reports and feature requests to theissue tracker (in subsystemJava. Decompiler. Engine).

IntelliJ usage

Fernflower is bundles as in IntelliJ IDEA and is primarily used to show Java code when debugging or navigating through class files.

Command line usage

Fernflower can be run from the command line in stand-alone mode using the following command:

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>`

* means zero or more times

+ means one or more times

<source>: file or directory with files to be decompiled.Directories are recursively scanned.Allowed file extensions are class, zip and jar.Sources prefixed with -e= mean "library" files that won't be decompiled but taken into account when analyzingrelationships between classes or methods.Especially renaming of identifiers (see theren option) can benefit from information about external classes.

<destination>: destination directory to place the resulting Java source into

<option>=<value>: a command-line option with the corresponding value (see "Command-line options" below).

Examples

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\

Command-line options

Except formpm andurc the value of 1 means the option is activated, 0 - deactivated.The default value, if any, is given between parentheses.

Typically, the following options will be changed by user, if any: hes, hdc, dgs, mpm, ren, urcThe rest of options can be left as they are: they are aimed at professional reverse engineers.

  • rbr (1): hide bridge methods
  • rsy (0): hide synthetic class members
  • din (1): decompile inner classes
  • dc4 (1): collapse 1.4 class references
  • das (1): decompile assertions
  • hes (1): hide empty super invocation
  • hdc (1): hide empty default constructor
  • dgs (0): decompile generic signatures
  • ner (1): assume return not throwing exceptions
  • den (1): decompile enumerations
  • rgn (1): removegetClass() invocation, when it is part of a qualified new statement
  • lit (0): output numeric literals "as-is"
  • asc (0): encode non-ASCII characters in string and character literals as Unicode escapes
  • bto (1): interpret int 1 as boolean true (workaround to a compiler bug)
  • nns (0): allow for not set synthetic attribute (workaround to a compiler bug)
  • uto (1): consider nameless types asjava.lang.Object (workaround to a compiler architecture flaw)
  • udv (1): reconstruct variable names from debug information, if present
  • ump (1): reconstruct parameter names from corresponding attributes, if present
  • rer (1): remove empty exception ranges
  • fdi (1): de-inline finally structures
  • mpm (0): maximum allowed processing time per decompiled method, in seconds. 0 means no upper limit
  • ren (0): rename ambiguous (resp. obfuscated) classes and class elements
  • urc (-): full name of a user-supplied class implementingIIdentifierRenamer interface. It is used to determine which class identifiers should be renamed and provides new identifier names (see "Renaming identifiers")
  • inn (1): check for IntelliJ IDEA-specific @NotNull annotation and remove inserted code if found
  • lac (0): decompile lambda expressions to anonymous classes
  • nls (0): define a new line character to be used for output. 0 -'\r\n' (Windows), 1 -'\n' (Unix), default is OS-dependent
  • ind: indentation string (default is 3 spaces)
  • crp (0): use record patterns where it is possible
  • cps (0): use switch with patterns where it is possible
  • log (INFO): a logging level, possible values are TRACE, INFO, WARN, ERROR
  • iec (0): include the entire classpath in context when decompiling
  • isl (1): inline simple lambda expressions
  • ucrc (1): hide unnecessary record constructor and getters
  • cci (1): check if resource in try-with-resources actually implementsAutoCloseable interface
  • jvn (0): overwrite any local variable names with JAD style names
  • jpr (0): include parameter names in JAD naming

Renaming identifiers

Some obfuscators give classes and their member elements short, meaningless and above all ambiguous names. Recompiling of suchcode leads to a great number of conflicts. Therefore, it is advisable to let the decompiler rename elements in its turn,ensuring uniqueness of each identifier.

Optionren (i.e.-ren=1) activates renaming functionality. The default renaming strategy goes as follows:

  • rename an element if its name is a reserved word or is shorter than 3 characters
  • new names are built according to a simple pattern: (class|method|field)_<consecutive unique number>
    You can overwrite these rules by providing your own implementation of the 4 key methods invoked by the decompiler while renaming. Simplypass a class that implementsorg.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer in the optionurc(e.g. -urc=com.example.MyRenamer) to Fernflower. The class must be available on the application classpath.

The meaning of each method should be clear from naming: toBeRenamed determine whether the element will be renamed, while the other threeprovide new names for classes, methods and fields respectively.

Development

Build an executable start-up script:

./gradlew :installDist

The startup script is generated inbuild/install/engine/bin.

Contributing

Fernflower is part of theIntelliJ Community project, contributions are welcome, thepreferred way of sending patches is by creating a pull request in the IntelliJ community repository. When submitting patches, pleasefollow thecontribution guidelines.

License

Fernflower is licensed under theApache License Version 2.0.

Credits

Fernflower was originally developed byStiver but has been maintained byJetBrains since 2014. Some patches fromForgeFlower were merged into this repository. Themirror of Fernflower was also maintained byAndrew McRae for a very long time.

Contributors59

Languages


[8]ページ先頭

©2009-2026 Movatter.jp