JAVA
语言是
1995
年
5
月由
SUN
公司发布的,由于其安全性高、代码优化、跨平台等特性,迅速取代了很多传统高级语言,占据了企业级网络应用开发等诸多领域的霸主地位。
不过,
JAVA
最突出的跨平台优势使得它不能被编译成本地代码,而要以中间代码的形式运行在虚拟机环境中,这使得
JAVA
的反编译要比别的高级语言容易实现,并且反编译的代码经过优化后几乎可以与源代码相媲美。
为了更好地保护知识产权,避免本公司的智力成果轻易被人窃取,开发者有必要对反编译工具深入了解,以便有针对性地采取保护措施。
目前,比较流行的
JAVA
反编译工具超过
30
种,其中有三款堪称精品:
一、
应用广泛的
JAD
在众多的
JAVA
反编译工具中,有几种非常著名的工具使用了相同的核心引擎——
JAD
,其中主要包括:
Front End Plus
、
mDeJava
、
Decafe Pro
、
Cavaj Java Decompiler
、
DJ Java Decompiler
、
NMI’s Java Class Viewer
和国产的
JAVA
源代码反编译专家等等。
JAD
本身是一个命令行工具,没有图形界面,上述的这些工具大多是在
JAD
内核的基础之上加了一个图形界面而已。这么多种产品的共同选择,足可证明
JAD
在
JAVA
反编译领域中的尊贵地位。
笔者用来测试的
JAD
版本是
1.5.8
f。
JAD
是使用
Microsoft Visual C++
开发的,运行速度非常快,可以处理很复杂的
JAVA
编译文件。众多的参数使
JAD
可以灵活应付多种加密手段,令反编译的代码更加优化和易读。由于
JAD
参数太多,没必要一一解释,其中有几个最常用的如下:
-d -
用于指定输出文件的目录
-s -
输出文件扩展名
(
默认为
: .jad)
,通常都会把输出文件扩展名直接指定为
.java
,以方便修改的重新编译。
-8 -
将
Unicode
字符转换为
ANSI
字符串,如果输出字符串是中文的话一定要加上这个参数才能正确显示。
最常用的反编译指令如下所示:
Jad –d c:\javasource –s .java -8 javatest.class
这条指令将当前目录下的
javatest.class
反编译为
javatest.java
并保存在
c:\javasource
目录里,其中的提示输出为中文,而不是
Unicode
代码。
二、
源码开放的
JODE
JODE
是全球最大的开源项目网站
Sourceforge.net
的成员,不要以为源码开放就小瞧它,在所有的
JAVA
反编译器中,
JODE
的反编译效果是最好的,尤其是对付一些常见的加密手段,例如混淆技术等,更是出类拔粹。
JODE
本身也是纯
JAVA
开发的,最近越来越多的
JAVA
反编译软件也选择
JODE
来做它们的核心引擎,例如
JCavaj Java Decompiler
、
BTJ (Back To Java)
、
jEdit's JavaInsight plugin
等。
JODE
是一个可运行的
JAR
文件,在
windows
环境下双击即可运行。
需要特别说明的是,
JODE
不是通过常规的
Open->File
的方式来加载
JAVA
编译后的类文件(
*.class
)或是类包(
*.jar
)的,而是通过在
Options
菜单中的
Set Classpath
来实现的,单独的类文件可以将它的上一级目录作为
Classpath
输入,然后再选择
Reload Classpath
即可。
新加入的类包或是类的名字会在左侧窗口出现,双击类包名可以展开目录树结构,双击需要反编译的类名则在右上角的窗口中直接显示反编译后的源代码。
三、
独树一帜的
DAVA
DAVA
不是一个独立的
JAVA
反编译器,而是
JAVA
代码优化工具
Soot
的一部分。
Soot
和
JODE
一样是纯
JAVA
开发的,也是一个独立的
JAR
包,但却不能通过双击直接运行,而是象
JAD
一样在命令行状态运行
Soot
对环境变量的配置要求非常严格,通常情况下要对
CLASSPATH
做如下设置:
Set CLASSPATH=%CLASSPATH%;c:\sootdir\sootclasses-2.1.0.jar;.;
其中的
c:\sootdir\
是下载的
soot
类包放置的路径,
CLASSPATH
末尾的
.;
代表了当前目录,如果不加上这个的话
Soot
经常会报一个找不到类的错误。
DAVA
是作为
Soot
的一个参数使用的,通常的用法如下:
Java soot.Main –f dava –d c:\javasource javatest
注意最后的类名不用带
.class
后缀,因为它默认是处理
class
文件,这个操作与前述的
JAD
的参数效果相同。
DAVA
采取了流程优化的方式进行反编译,与传统反编译思路不尽相同,但却对改变流程类的加密方法有独特的反编译效果。
上述的三种工具各有千秋,但效果都非常不错。经测试,它们基本上都可以把
JDK
自带的一些例程完全反编译,然后不加任何修改可再编译成功,并能正常运行!
(文中工具均经过本人亲手测试,当时用的是jdk1.4.2_03,现在离写文章的时候过了一年多了,jdk都出到1.5了,怕是有些程序也不太好反编了)