「cfr-0.122.jar」

cfr.jar,反编译.class文件、JAR文件等等。

本手册适用于CFR 0_122版本。

命令支持的选项及含义

详细的选项介绍可以使用’–help optionname’进行查看,比如查看–pullcodecase选项的详细介绍:

–help pullcodecase

–aexagg
如果它们不会改变语义,删除嵌套的异常处理程序。
取值:boolean

–aggressivesizethreshold
触发积极减少的操作码计数。
(int >= 0)
默认值:15000

–allowcorrecting
允许修改错误的转换,可能改变代码行为。
比如:删除不可能异常处理,如果这有任何效果,将发出警告。
取值:boolean
默认值:true

–analyseas
指出被分析的文件的类型。
取值范围:[JAR, WAR, CLASS]

–arrayiter
基于重组array的迭代。
取值:boolean
默认值:true,如果class文件版本49.0+ (Java 5)

–caseinsensitivefs
通过重命名冲突类,来处理不区分大小写的文件系统。
取值:boolean
默认值:false

–clobber
使用outputpath时,覆盖文件。
取值:boolean

–collectioniter
基于重组collection的迭代。
取值:boolean
默认值:true,如果class文件版本49.0+ (Java 5)

–commentmonitors
用注释替换监视锁 – 如果十分困惑时,很有用。
取值:boolean
默认值:false

–comments
输出描述反编译器状态、后备标志等​​的注释。
取值:boolean
默认值:true

–decodeenumswitch
解码使用Enum的switch,更其更可读。
参考:http://www.benf.org/other/cfr/switch-on-enum.html
取值:boolean
默认值:true,如果class文件版本49.0+ (Java 5)

–decodefinally
使finally语句更可读。
取值:boolean
默认值:true

–decodelambdas
重建lambda函数。
取值:boolean
默认值:true,如果class文件版本52.0+ (Java 8)

–decodestringswitch
解码使用String的switch,更其更可读。
取值:boolean
默认值:true,如果class文件版本51.0+ (Java 7)

–dumpclasspath
输出class path,用于调试。
取值:boolean
默认值:false

–eclipse
启用转换以更好地处理eclipse代码。
取值:boolean
默认值:true

–elidescala
在Scala的输出中,忽略无用的东西。
取值:boolean
默认值:false

–extraclasspath
额外的class path – 如果需要,将使用在此class path中类。
(string)

–forcecondpropagate
通过一些不变的常量来确定性跳转的结果。
取值:boolean

–forceexceptionprune
尝试更积极地扩展和合并Exception。
取值:boolean

–forcereturningifs
移动return到跳转点
取值:boolean

–forcetopsort
强制基本块排序。通常javac直接编译的代码不需要这么做,但是在使用混淆的情况下(或者dex2jar!)是必需的。
在–recovery中,将启用。
取值:boolean

–forcetopsortaggress
强制额外的积极的拓扑排序选项。
取值:boolean

–forloopaggcapture
允许for循环将突变更为更新部分,即使它们似乎没有涉及谓词。
取值:boolean

–hidebridgemethods
隐藏桥接方法。
取值:boolean
默认值:true

–hidelangimports
隐藏java.lang.中的导入。
取值:boolean
默认值:true

–hidelongstrings
隐藏非常长的字符串。如果混淆器将伪造的代码放在字符串中,这是有用的。
取值:boolean
默认值:false

–hideutf
隐藏UTF8字符。引用它们,而不是显示原始字符
取值:boolean
默认值:true

–innerclasses
反编译内部类。
取值:boolean
默认值:true

–j14classobj
反编译Java1.4类对象构造。
取值:boolean
默认值:false,如果class文件版本49.0+ (Java 5)

–jarfilter
子字符正则表达式。仅分析FQN与此模式匹配的类。 (分析JAR时)。
(string)

–labelledblocks
允许使用标记块的代码显示(处理odd转发goto)
取值:boolean
默认值:true

–lenient
放宽通常会抛出异常的约束。
取值:boolean
默认值:false

–liftconstructorinit
将所有构造函数共同的初始化代码提升为成员初始化。
取值:boolean
默认值:true

–outputdir
对[directory]中的文件进行解码(outputpath + clobber)(历史兼容性)
(string)

–outputpath
将反编译结果输出到指定文件中。
(string)

–override
生成@override注释(如果看到方法实现了接口方法或覆盖了基类方法)
取值:boolean
默认值:true,如果class文件版本50.0+ (Java 6)

–pullcodecase
将代码积极地引入case语句。
取值:boolean
默认值:false

–recover
如果反编译失败,则允许设置越来越多的激进选项。
取值:boolean
默认值:true

–recovertypeclash
在分析导致类型冲突的地方,分离生命周期。
取值:boolean

–recovertypehints
从首次传递,为迭代器提取类型提示。
取值:boolean

–removebadgenerics
在显然有错误的地方,隐藏泛型,并且回溯到非泛型。
取值:boolean
默认值:true

–removeboilerplate
删除样板函数 – 构造函数样板、lambda反序列化等
取值:boolean
默认值:true

–removedeadmethods
删除无意义的方法 – 默认构造函数等。
取值:boolean
默认值:true

–removeinnerclasssynthetics
删除(可能)在内部类中隐式外部类引用。
取值:boolean
默认值:true

–rename
‘renamedupmembers’ + ‘renameillegalidents’ + ‘renameenummembers’
取值:boolean
默认值:false

–renamedupmembers
重命名模糊/重复字段。
注意:这将会破坏基于反射的访问,因此不会自动启用。

–renameenumidents
重命名不符合其“预期”字符串名的ENUM标识符。
注意:这将会破坏基于反射的访问,因此不会自动启用。

–renameillegalidents
重命名无效的java标识符的标识符。
注意:这将会破坏基于反射的访问,因此不会自动启用。

–renamesmallmembers
重命名小成员。
(int >= 0)
默认值:0

–showinferrable
如果不是由参数暗示,则使用显式类型来装饰方法。
取值:boolean
默认值:false,如果class文件版本51.0+ (Java 7)

–showops
显示一些(神秘)调试
(int >= 0)
默认值:0

–showversion
在头部显示使用的CFR版本(回归测试时方便关闭)
取值:boolean
默认值:true

–silent
反编译时不显示状态。
取值:boolean
默认值:false

–stringbuffer
new Stringbuffer().add.add.add转化为string + string + string
参考:http://www.benf.org/other/cfr/stringbuilder-vs-concatenation.html
取值:boolean
默认值:false,如果class文件版本49.0+ (Java 5)

–stringbuilder
new Stringbuilder().add.add.add转化为string + string + string
参考:将new Stringbuffer().add.add.add转化为string + string + string
取值:boolean
默认值:true,如果class文件版本49.0+ (Java 5)

–sugarasserts
处理资源调用,使其更可读。
取值:boolean
默认值:true

–sugarboxing
在可能的情况下,删除无意义的拆装箱。
取值:boolean
默认值:true

–sugarenums
处理Enum,使其更可读。
参考:http://www.benf.org/other/cfr/how-are-enums-implemented.html
取值:boolean
默认值:true,如果class文件版本49.0+ (Java 5)

–tidymonitors
删除监视器的支持代码 – 例如,catch块中的退出监视器
取值:boolean
默认值:true

简单实例(EXAMPLE)

#!/bin/bash

# 反编译整个JAR文件
java -jar cfr.jar /path/to/target/file.jar --outputdir /path/to/dir

参考文献

java -jar cfr.jar –help