Fernflower是一个简单高效的反编译命令行工具,Fernflower已成为了JetBrainsintellij-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来反编译。

  1. 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反编译了。
5. FernFlower/IDEA - 图1
依赖的jar: javaweb-decomplierIntellij 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反编译,如下图:5. FernFlower/IDEA - 图2
IDEA支持class文件名(⇧⌘F)、类方法名称(⇧⌘O)搜索。