谈谈JAVA程序的反编译

来源:互联网 发布:电脑锣编程是什么意思 编辑:程序博客网 时间:2024/06/05 19:37
<script type="text/javascript">google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//</script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>Sina.com.cn 于瑶   如今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   3 bipush 20   5 bipush 20   7 invokevirtual #6   10 return   Method hello_java()   0 aload_0   1 invokespecial #5 ()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表示敬意,感谢他给我们留下这个工具软件。
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大学生职业生涯规划引言 职业生涯规划书引言 个人所得税纳税筹划引言 大学生职业生涯规划书引言 认识论引论 引论 精神分析引论 计算机科学引论 金融数学引论第二版答案 属性数据分析引论 对外汉语教育学引论 肾炎引起脚肿怎么办 阑尾炎怎么引起 肾结石引起 扁平疣引起 宫外孕怎么引起 盆腔炎怎么引起 低血糖怎么引起 引起的英文 引起 英文 引起英文 引起 引起英语 引起的 引起的近义词 引起了 发烧是怎么引起的 妇科是怎么引起的 炎症是什么引起的 疱疹引起的神经痛 泡诊是什么引起的 引起坐骨神经痛的原因 水痘是怎么引起的 泡疹是怎么引起的 水痘是什么引起的 引起痛风的原因 扁皮尤怎么引起的 颈椎病引起头晕 引起腰椎滑脱的原因 腰椎病引起的腿麻 病毒感染引起的疱疹