组网教程 电脑入门 经验共享 系统知识 办公软件 网页教程 QQ知识 MSN知识 黑客教程
木马知识 安全漏洞 补丁知识 入侵知识 防火墙 影音制作 Premiere 硬件知识 Photoshop
Fireworks Flash教程 CorelDRAW Dreamweaver ASP教程 PHP教程 HTML教程 JAVA教程 
CataName - 电脑教程搜索  关键字:   

当前位置:首页 > 电脑教程 > JAVA教程

谈谈JAVA程序的反编译
作者:未知 文章来源:未知 点击数:1613 更新时间2005-6-16

  如今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表示敬意,感谢他给我们留下这个工具软件。


·上一篇教程:Java学习的捷径
·下一篇教程:学习,是一条漫长的道路
【发表评论】【告诉好友】【加入收藏】【打印此文】【关闭窗口】

相 关 教 程 

用Java实现FTP服务器..
JavaBeans程序开发从..
Java学习的捷径
学习,是一条漫长的..
教你如何成为一名Ja..
如何迅速成为Java高手
Java编出一个自己的..
如何成为一名Java初..
体验Java 1.5中面向..
Java中实现基于Aspe..

热 门 教 程

用Java实现多线程服..
JAVA实现支持视频点..
java 3D 动画场景编..
用Java实现FTP服务器
教你在Jave中实现3d..
用Java设计下载软件
Java中C/S通讯程序设..
Java网络编程之传输..
Java网络编程之传输..
Java网络编程之传输..

最 新 教 程 

用Java实现FTP服务器..
JavaBeans程序开发从..
Java学习的捷径
谈谈JAVA程序的反编译
学习,是一条漫长的..
教你如何成为一名Ja..
如何迅速成为Java高手
Java编出一个自己的..
如何成为一名Java初..
体验Java 1.5中面向..

特 效 代 码

  综合特效  状态栏类
  游戏相关  页面背景
  页面特效  页面导航
  文本操作  文本特效
  图形特效  鼠标特效
  时间日期  密码相关
  浏览相关  警告对话
  技巧特效  计数转换
  测试搜索  代码生成
  播放音乐  按钮特效
  系统相关  链接特效
  黑客性质  相关特效
  窗口特效  其它特效

图 片 素 材

  精美图标  水晶图片
  一般图片  肉质图片
  菌类图片  数码风光
  数码动物  装饰素材
  实物素材  儿童素材
  动物图片  儿童图片
  风光图片  风情图片
  精美佳图  军事图片
  卡通图片  实物图片
  体育图片  植物图片
  装饰图片  桌面壁纸
  3D图片  广告图片
  绘画图片  设计素材
  素材图片  微标图片
  欣赏素材  邮票图片
  资料图片  动物动画
  一般动画  瓜果蔬菜
  观赏图片  花卉图片
  杂类图片  baby图标
  ICON图标  Logo站标
  论坛图标  像素图片