如今JAVA语言在全世界范围正如火如荼般的流行,它广范地应用在INTERNET的数据库、多媒体、CGI、及动态网页的制作方面。1999年在美国对JAVA程序员的需求量首次超过C++!
作者因最近分析一些JAVA程序,对JAVA的反编译进行了一番了解,下面将我所了解的情况作以下介绍,希望对JAVA爱好者有所帮助。
JAVA是采用一种称做“字节编码”的程序结构,分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型。无论哪种结构,一旦用JAVAC 命令编译后,均变成后缀为CLASS的同名可执行文件。这种文件是不可阅读的代码。
经查阅了SUN公司的JDK(JDK1.1.3)文档资料后,我找到了一个据称是可反编译JAVA的JAVAP文件(EXE),这个文件位于\JDK\BIN\ 下面,经按说明使用后,感到失望,原来这个“反编译”仅可反编译出JAVA程序的数据区(定义)、若干方法和类的引用等。
这里我用了一个简单例子来说明问题。
JAVA的源程序hello_java.java如下:
import java.applet.*;
import java.awt.*;
public class hello_java extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello Java!\n",20,20);
}
}
经用反编译命令:javap -c -package -public -private hello_java hello.java
得到的反编译结果(hello.java)如下:(有关javap命令的选择参数请见其使用说明,这里-c表示选择了反编译)
Compiled from hello_java.java
public synchronized class hello_java extends java.applet.Applet
/* ACC_SUPER bit set */
{
public void paint(java.awt.Graphics);
public hello_java();
Method void paint(java.awt.Graphics)
0 aload_1
1 ldc #1 <String "Hello Java!
">
3 bipush 20
5 bipush 20
7 invokevirtual #6 <Method java.awt.Graphics.drawString(Ljava/lang/String;II)V>
10 return
Method hello_java()
0 aload_0
1 invokespecial #5 <Method java.applet.Applet.<init>()V>
4 return
}
从上述结果不难看出该反编译未能将源程序全译出来,像语句g.drawString("Hello Java!\n",20,20); 就没有。随着程序量增加,未能编译的JAVA语句还会更多。所以这个反编译程序仅能起个参考作用。
幸亏有了INTERNET,笔者通过YAHOO很快找到了一个JAVA反编译“自由软件”(SHAREWARE),http://www.inter.nl.net/users/H.P.van.Vliet/mocha.htm 。 这个软件叫MOCHA,据说是一位30来岁的加拿大的研究生所完成,仅是个“?”版,原因是这位叫做H.P.VAN.VLIET的小伙子患癌逝世了,十分可惜呀!
经使用MOCHA反编译软件,感到这个软件十分好用,笔者试反编译多个JAVA程序,均得到很好的结果。
这里给出如何使用这个软件,首先,用WINZIP等将"mocha-b1.zip" 解开得到"mocha.zip"文件,"mocha.zip"不须再解开,这个包内包括了反编译的类文件,只需将其拷贝到JDK所在的目录下,如:c:\jdk\bin\ 此外,须设置路径:SET CLASSPATH=c:\myclasses;c:\jdk\bin\mocha.zip
MOCHA用法:
java mocha.Decompiler [-v] [-o] Class1.class Class2.class ...
"java" 调用Java虚拟机
"mocha.Decompiler" 指示要进行JAVA反编译
"-v" 选择详细输出
"-o" 选写入已有的.mocha 文件
"ClassX.class" 指出要反编译类名
注意,不需给出输出的JAVA文件名,因为MOCHA自动产生一个与CLASS同名但扩展名为MOCHA的JAVA源文件。
对于上例,可用命令:
java mocha.Decompiler [-v] [-o] hello_java.class
得到的源文件:
/* Decompiled by Mocha from hello_java.class */
/* Originally compiled from hello_java.java */
import java.applet.Applet;
import java.awt.Graphics;
public synchronized class hello_java extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello Java!\n", 20, 20);
}
public hello_java()
{
}
}
我们不难发现,此文件与编译前的JAVA源文件完全一样!笔者曾经用MOCHA反编译出最大为80K的源文件,均取得成功。
在此,笔者向英年早逝的VLIET表示敬意,感谢他给我们留下这个工具软件。
如读者下载MOCHA有困难,可给笔者来电子邮件,笔者可将MOCHA寄去。//by http://CiDu.Net
参考文献:
1) http://www.inter.nl.net/users/H.P.van.Vliet/mocha.htm
2) http://www.javasoft.com
3) http://java.sun.com
4) http://www.yahoo.com
5) http://www.cidu.net
分享到:
相关推荐
JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA...
java反编译 java 反编译 java反编译 java 反编译 java反编译 java 反编译 java反编译 java 反编译 java反编译 java 反编译
1.java反编译工具 2.绿色版占用内存少 3.好用,值得下载
java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译...
JAVA反编译插件文件
JAVA反编译 JAVA反编译JAVA反编译
可以将java编译后的class文件或者jar包反编译出来,看到编译前的代码
java反编译软件java反编译软件java反编译软件
.class文件反编译成java文件 支持类名索引 方法名索引 字段名索引 此软件仅用于学习使用
JAVA反编译文件解决中文乱码问题
JAVA反编译软件(可将class文件反编译为java文件)
java反编译工具,java反编译工具,java反编译工具 一款很好的java反编译工具 一款很好的java反编译工具一款很好的java反编译工具
jd-gui ,java Class反编译工具 ,java jar反编译工具。经济实惠只要1分。这个是在凑字数。这个是在凑字数。这个是在凑字数。
安卓、Java反编译工具的工具 可以把一编译过的文件反编译成java'文件
java反编译java反编译java反编译java反编译java反编译java反编译java反编译java反编译java反编译java反编译
java 反编译,jd-gui.exe打开class文件即可
jad-java反编译工具eclipse插件,jad-java反编译工具eclipse插件
java反编译jd-gui-1.6.6.jar
java反编译java反编译java反编译java反编译java反编译java反编译
该软件用于java的class文件反编译,实测好用,欢迎大家下载,有问题可以留言。。。。。