Fernflower
是一个简单高效的反编译命令行工具,Fernflower
已成为了JetBrains
的intellij-community
内置反编译工具,同时Fernflower
还有一个非常好用的GUI工具: Bytecode Viewer
。Fernflower
反编译jar示例:java -jar fernflower.jar jarToDecompile.jar decomp/
其中jarToDecompile.jar
是需要反编译的jar文件,decomp
是反编译后的class文件
所存放的目录。需要注意的是Fernflower
如遇无法反编译的情况可能会生成空的java文件!
使用Find命令和Fernflower实现批量反编译jar
通常我们在某些特殊的场景下拿到的只是jar文件,那么我们应该如何反编译整个jar包的class文件呢?find
命令并不能支持Java反编译,但是find
命令可以非常方便的搜索经过编译后的二进制文件中的内容,所以有的时候使用find
命令通常是最简单实用的。例如使用find
命令搜索某个关键字: find ./ -type f -name "*.class" |xargs grep XXXX
。
有的时候我们只有项目war包没有源码,只能在WEB-INF/lib
中找程序的源码,这个时候我们可以巧妙的使用find
命令加Fernflower
来实现反编译所有的jar包。
这里以jcms
的一个非常老版本为例,jcms
最终给客户部署的war包中源码并不是在WEB-INF/classes
目录下,而是将整个jcms
系统按模块打包成了多个jar包放在了WEB-INF/lib
目录下。我们可以通过搜索com.hanweb
包名称来找出所有jar中包含了jcms
的文件并通过Fernflower
来反编译。
java -jar /Users/yz/Desktop/javaweb-decomplier/javaweb-decomplier.jar -dgs=1 $(find /Users/yz/Desktop/jcms/WEB-INF/lib/ -type f -name "*.jar" |xargs grep "com.hanweb" |awk '{print $3}') /Users/yz/jcms-decomplier
执行上面的命令后会在jcms-decomplier
目录下看到所有的jar已经被Fernflower
反编译了。
依赖的jar: javaweb-decomplier、Intellij java-decompiler。
Github:https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler
Fernflower文档:https://the.bytecode.club/fernflower.txt
IDEA反编译
IDEA
自带的反编译工具FernFlower
,在IDEA中可以直接打开class文件,默认将使用FernFlower
反编译,如下图:
IDEA支持class文件名(⇧⌘F
)、类方法名称(⇧⌘O
)搜索。