如何在命令行中使用(Running from command line)
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
星号(*):0次或者多次。
加号(+):1次或者多次。
<option>, <value>
具有相应值的命令行选项(详见”Command-line options“部分)
<source>
需要反编译的文件或者目录。目录会进行递归扫描。允许的文件扩展格式为:class、zip、jar。
<source>以-e=表示“库”不会被反编译,但是会被用于分析方法和类之间的关系。特别是重命名标识符(选项’ren’),可以从有关外部类的信息中受益。
<destination>
输出目录。
简单示例(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)
除了mpm和urc之外,在括号中给出的是默认值(如果有),1:表示选项被激活;0:被禁用。
通常,以下选项将由用户更改,hes,hdc,dgs,mpm,ren,urc选项可以保留原样,它们针对专业的逆向工程师。
rbr (1)
隐藏桥接方法。
rsy (0)
隐藏合成的类成员。
din (1)
反编译内部类。
dc4 (1)
折叠1.4类引用
das (1)
反编译断言。
hes (1)
隐藏空super调用
hdc (1)
隐藏空的默认构造器。
dgs (0)
反编译通用签名。
ner (1)
假设return不抛出异常。
den (1)
反编译枚举。
rgn (1)
当getClass()是合格的new语句的一部分时,移除getClass()调用。
lit (0)
输出数字文字“原样”
asc (0)
将字符串和字符文字中的非ASCII字符编码为Unicode转义。
bto (1)
将int 1解释为布尔值true(编译器BUG的解决方法)
nns (1)
允许未设置的合成的属性(编译器错误的解决方法)
uto (1)
将无名称的类型视为java.lang.Object(编译器架构缺陷的解决方法)
udv (1)
从调试信息中重建变量名称(如果存在)。
rer (1)
删除空异常范围。
fdi (1)
不一致的finally结构。
mpm (0)
每个反编译方法的最大允许的处理时间,以秒为单位。0表示无上限。
ren (0)
重新命名模糊(或相应的混淆)类和类元素。
urc
用户提供的类实现IIdentifierRenamer的全名。它用于确定哪些类标识符应重命名,并提供新的标识符名称(请参阅“重命名标识符”)
inn (1)
检查IntelliJ IDEA特定的@NotNull注释,并删除插入的代码(如果找到)。
lac (0)
将lambda表达式反编译为匿名类
nls (0)
指定输出中使用的换行字符。
0 – ‘\r\n’ (使用Windows)
1 – ‘\n’ (Unix)
默认值与系统有关。
ind
字符串缩进,默认3个空格。
log (INFO)
日志等级:TRACE, INFO, WARN, ERROR
重命名标识符(Renaming identifiers)
一些混淆器给类名和类的成员元素一些简短、无意义、模糊的名字。重新编译这样的代码会导致大量的冲突。因此,建议让反编译器重新命名元素,确保每个标识符的唯一性。
‘ren’选项(i.e. -ren=1)用于激活重命名功能。默认的命名策略如下:
如果名字为保留字或者小于3个字符,则进行重命名。
根据简单的模式构建新的名字:(class|method|field)_<连续的唯一数字>。可以提供自己的「4个关键方法」的实现,来覆盖反编译时的重命名规则,这「4个关键方法」在反编译器反编译时进行调用。只需在urc选项中向Fernflower传递一个类(例如-urc=com.example.MyRenamer),该类实现了org.jetbrains.java.decompiler.main.extern.IIdentifierRenamer。该类必须在应用程序classpath中。
每个方法可以从命名中明白其含义:toBeRenamed用于确定元素是否被重命名,而其他三个方法分别为Class、Method、Field提供新的名称。
参考文献
源码目录下的README.md文件。