作者因最近分析一些JAVA程序对JAVA的反编译进行了一番了解下面将我所了解的情况作以下介绍希望对JAVA爱好者有所帮助
JAVA是采用一种称做字节编码的程序结构分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型无论哪种结构一旦用JAVAC 命令编译后均变成后缀为CLASS的同名可执行文件这种文件是不可阅读的代码
经查阅了SUN公司的JDK(JDK)文档资料后我找到了一个据称是可反编译JAVA的JAVAP文件(EXE)这个文件位于JDKBIN 下面经按说明使用后感到失望原来这个反编译仅可反编译出JAVA程序的数据区(定义)若干方法和类的引用等
这里我用了一个简单例子来说明问题
JAVA的源程序hello_javajava如下
import javaapplet*;
import javaawt*;
public class hello_java extends Applet
{
public void paint(Graphics g)
{
gdrawString(Hello Java!n);
}
}
经用反编译命令javap c package public private hello_java hellojava
得到的反编译结果(hellojava)如下(有关javap命令的选择参数请见其使用说明这里c表示选择了反编译)
Compiled from hello_javajava
public synchronized class hello_java extends javaappletApplet
/* ACC_SUPER bit set */
{
public void paint(javaawtGraphics);
public hello_java();
Method void paint(javaawtGraphics)
aload_
ldc #
bipush
bipush
invokevirtual #
return
Method hello_java()
aload_
invokespecial # ()V >
return
}
从上述结果不难看出该反编译未能将源程序全译出来像语句gdrawString(Hello Java!n); 就没有随着程序量增加未能编译的JAVA语句还会更多所以这个反编译程序仅能起个参考作用
幸亏有了INTERNET笔者通过YAHOO很快找到了一个JAVA反编译自由软件(SHAREWARE) 这个软件叫MOCHA据说是一位来岁的加拿大的研究生所完成仅是个?版原因是这位叫做HPVANVLIET的小伙子患癌逝世了十分可惜呀!
经使用MOCHA反编译软件感到这个软件十分好用笔者试反编译多个JAVA程序均得到很好的结果
这里给出如何使用这个软件首先用WINZIP等将mochabzip 解开得到mochazip文件mochazip不须再解开这个包内包括了反编译的类文件只需将其拷贝到JDK所在的目录下如c:jdkbin 此外须设置路径SET CLASSPATH=c:myclasses;c:jdkbinmochazip
MOCHA用法
java mochaDecompiler [v] [o] Classclass Classclass
java 调用Java虚拟机
mochaDecompiler 指示要进行JAVA反编译
v 选择详细输出
o 选写入已有的mocha 文件
ClassXclass 指出要反编译类名
注意不需给出输出的JAVA文件名因为MOCHA自动产生一个与CLASS同名但扩展名为MOCHA的JAVA源文件
对于上例可用命令
java mochaDecompiler [v] [o] hello_javaclass
得到的源文件
/* Decompiled by Mocha from hello_javaclass */
/* Originally compiled from hello_javajava */
import javaappletApplet;
import javaawtGraphics;
public synchronized class hello_java extends Applet
{
public void paint(Graphics g)
{
gdrawString(Hello Java!n );
}
public hello_java()
{
}
}
我们不难发现此文件与编译前的JAVA源文件完全一样!笔者曾经用MOCHA反编译出最大为K的源文件均取得成功
在此笔者向英年早逝的VLIET表示敬意感谢他给我们留下这个工具软件
如读者下载MOCHA有困难可给笔者来电子邮件笔者可将MOCHA寄去
参考文献
)
)
)
)