|
|
@ -1,4 +1,4 @@ |
|
|
|
1. About the decompiler |
|
|
|
## About fernflower |
|
|
|
|
|
|
|
|
|
|
|
Fernflower is the first actually working analytical decompiler for Java and |
|
|
|
Fernflower is the first actually working analytical decompiler for Java and |
|
|
|
probably for a high-level programming language in general. Naturally it is still |
|
|
|
probably for a high-level programming language in general. Naturally it is still |
|
|
@ -6,12 +6,11 @@ under development, please send your bug reports and improvement suggestions at |
|
|
|
fernflower.decompiler@gmail.com |
|
|
|
fernflower.decompiler@gmail.com |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. License |
|
|
|
## Licence |
|
|
|
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
Fernflower is licenced under the Apache Licence Version 2.0. It can be found here: http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Running from command line |
|
|
|
3. Running from the command line |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination> |
|
|
|
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination> |
|
|
|
|
|
|
|
|
|
|
@ -24,14 +23,14 @@ java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination> |
|
|
|
<destination>: destination directory |
|
|
|
<destination>: destination directory |
|
|
|
<option>,<value>: command line option with the corresponding value, see 4. |
|
|
|
<option>,<value>: command line option with the corresponding value, see 4. |
|
|
|
|
|
|
|
|
|
|
|
Examples: |
|
|
|
### Examples |
|
|
|
|
|
|
|
|
|
|
|
java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\ |
|
|
|
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\ |
|
|
|
java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4. Command line options |
|
|
|
## Command line options |
|
|
|
|
|
|
|
|
|
|
|
With the exception of mpm and urc the value of 1 means the option is activated, 0 - deactivated. Default |
|
|
|
With the exception of mpm and urc the value of 1 means the option is activated, 0 - deactivated. Default |
|
|
|
value, if any, is given between parentheses. |
|
|
|
value, if any, is given between parentheses. |
|
|
@ -39,39 +38,39 @@ value, if any, is given between parentheses. |
|
|
|
Typically, the following options will be changed by user, if any: hes, hdc, dgs, mpm, ren, urc |
|
|
|
Typically, the following options will be changed by user, if any: hes, hdc, dgs, mpm, ren, urc |
|
|
|
The rest of options can be left as they are: they are aimed at professional reverse engineers. |
|
|
|
The rest of options can be left as they are: they are aimed at professional reverse engineers. |
|
|
|
|
|
|
|
|
|
|
|
rbr (1): hide bridge methods |
|
|
|
- rbr (1): hide bridge methods |
|
|
|
rsy (0): hide synthetic class members |
|
|
|
- rsy (0): hide synthetic class members |
|
|
|
din (1): decompile inner classes |
|
|
|
- din (1): decompile inner classes |
|
|
|
dc4 (1): collapse 1.4 class references |
|
|
|
- dc4 (1): collapse 1.4 class references |
|
|
|
das (1): decompile assertions |
|
|
|
- das (1): decompile assertions |
|
|
|
hes (1): hide empty super invocation |
|
|
|
- hes (1): hide empty super invocation |
|
|
|
hdc (1): hide empty default constructor |
|
|
|
- hdc (1): hide empty default constructor |
|
|
|
dgs (0): decompile generic signatures |
|
|
|
- dgs (0): decompile generic signatures |
|
|
|
ner (1): assume return not throwing exceptions |
|
|
|
- ner (1): assume return not throwing exceptions |
|
|
|
den (1): decompile enumerations |
|
|
|
- den (1): decompile enumerations |
|
|
|
rgn (1): remove getClass() invocation, when it is part of a qualified new statement |
|
|
|
- rgn (1): remove getClass() invocation, when it is part of a qualified new statement |
|
|
|
lit (0): output numeric literals "as-is" |
|
|
|
- lit (0): output numeric literals "as-is" |
|
|
|
asc (0): encode non-ASCII characters in string and character literals as Unicode escapes |
|
|
|
- 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) |
|
|
|
- bto (1): interpret int 1 as boolean true (workaround to a compiler bug) |
|
|
|
nns (1): allow for not set synthetic attribute (workaround to a compiler bug) |
|
|
|
- nns (1): allow for not set synthetic attribute (workaround to a compiler bug) |
|
|
|
uto (1): consider nameless types as java.lang.Object (workaround to a compiler architecture flaw) |
|
|
|
- uto (1): consider nameless types as java.lang.Object (workaround to a compiler architecture flaw) |
|
|
|
udv (1): reconstruct variable names from debug information, if present |
|
|
|
- udv (1): reconstruct variable names from debug information, if present |
|
|
|
rer (1): remove empty exception ranges |
|
|
|
- rer (1): remove empty exception ranges |
|
|
|
fdi (1): de-inline finally structures |
|
|
|
- fdi (1): de-inline finally structures |
|
|
|
mpm (0): maximum allowed processing time per decompiled method, in seconds. 0 means no upper limit |
|
|
|
- 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 |
|
|
|
- ren (0): rename ambiguous (resp. obfuscated) classes and class elements |
|
|
|
urc : full name of user-supplied class implementing IIdentifierRenamer. It is used to determine which class identifiers |
|
|
|
- urc : full name of user-supplied class implementing IIdentifierRenamer. It is used to determine which class identifiers |
|
|
|
should be renamed and provides new identifier names. For more information see section 5 |
|
|
|
should be renamed and provides new identifier names. For more information see section 5 |
|
|
|
inn (1): check for IntelliJ IDEA-specific @NotNull annotation and remove inserted code if found |
|
|
|
- inn (1): check for IntelliJ IDEA-specific @NotNull annotation and remove inserted code if found |
|
|
|
lac (0): decompile lambda expressions to anonymous classes |
|
|
|
- lac (0): decompile lambda expressions to anonymous classes |
|
|
|
nls (0): define new line character to be used for output. 0 - '\r\n' (Windows), 1 - '\n' (Unix), default is OS-dependent |
|
|
|
- nls (0): define 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)) |
|
|
|
- ind : indentation string (default is " " (3 spaces)) |
|
|
|
|
|
|
|
|
|
|
|
The default logging level is INFO. This value can be overwritten by setting the option 'log' as follows: |
|
|
|
The default logging level is INFO. This value can be overwritten by setting the option 'log' as follows: |
|
|
|
log (INFO): possible values TRACE, INFO, WARN, ERROR |
|
|
|
log (INFO): possible values TRACE, INFO, WARN, ERROR |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5. Renaming identifiers |
|
|
|
## Renaming identifiers |
|
|
|
|
|
|
|
|
|
|
|
Some obfuscators give classes and their member elements short, meaningless and above all ambiguous names. Recompiling of such |
|
|
|
Some obfuscators give classes and their member elements short, meaningless and above all ambiguous names. Recompiling of such |
|
|
|
code leads to a great number of conflicts. Therefore it is advisable to let the decompiler rename elements in its turn, |
|
|
|
code leads to a great number of conflicts. Therefore it is advisable to let the decompiler rename elements in its turn, |