对于我们大多数 java 代码的开发者, 阅读已经编译好的 class 文件是我们经常要做的事情. 最常见的方法无外乎使用 IDE(eclipse,idea) 自带的反编译功能.
那如果在没有源码的情况下需要对 class 文件批量反编译需要如何做呢?
1, 使用 jad-gui. 这对于少量代码是可行的, 通常来讲一个 jar 包中的代码量可不是 "少量" 的. 如下图, 如果使用 jad-gui, 导出整个 jar 包的内容需要手工创建多个 java 文件, 以及目录层级, 这显然不是可以用人工去做的.
jad-gui.PNG
2, 就是使用我们今天的主角 jad. 下面我就来为大家仔细的说明一下 jad 的使用方法.
jad.PNG
以下是 jad 工具的使用命令
jad 命令详解. PNG
那么下面给大家讲解一下常用的常规操作
安装配置
下载好 jad( https://varaneckas.com/jad/ ) 之后. 给 jad.exe 配置环境变量或者将 jad.exe 放到 C:\Windows\System32 目录下. 通过 cmd 命令进入 Windows 命令窗口模式.
我们现在通过反编译来获取 druid-1.1.10 的代码.
1. 先将 jar 包用解压工具解压.
2. 找到需要反编译的代码存放路径.
3. 拼写命令, 执行.
jad -o -r -sjava -dsrc druid-1.1.10/com/alibaba/druid/**/*.class
参数含义:
-o 无需确认直接覆盖输出
-r 恢复包的目录结构
-sjava 指定输出文件的类型 java
-dsrc 指定输出文件的文件目录
** 代表多级目录层级
* 代表任意文件名
需要注意的是命令后的路径,(druid-1.1.10/com/alibaba/druid/*/.class) 是相对地址.
反编译命令. PNG
执行完成之后大家就可以在当前目录下得到一个 src 文件夹, 反编译出来的代码都在里边了.
值得注意的是 jad 并不是万能的, 以下情况是无法正常的反编译出来的. 遇到这些情况就需要使用多种反编译工具综合分析了.
1. 包含有内部类, 则 jad 处理构造函数的参数时会出错.
2. 不支持 zip 和 jar 包.(注: 如果使用 Eclipse 插件, 则很容易得到包中的某个类的反编译代码).
3. 当有标签块, 嵌套循环中有 break/continue, 有 goto 语句的时候, 会提示信息 "Couldn't fully decompile method <name>";
当有 try-catch-finally 语句的时候会提示信息 "Couldn't resolve all exception handlers in method <name>".
Currently Jad ignores the contents of the Line Number Table Attribute and the Source File Attribute.
5.JAD 不能处理继承信息, 总是把 java.lang.Object 作为两个不同类的通用父类, 需要的时候做强制转换.
6.jad 对 inlined functions 处理不好.
二维码. PNG
来源: http://www.jianshu.com/p/26716c902b9b