⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 谈谈java程序的反编译.htm

📁 写给JSP初级程序员的书
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)http://eps.www85.cn4e.com/java/article/devshow.asp?id=133 -->
<HTML><HEAD><title>csdn_谈谈JAVA程序的反编译</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE type=text/css>TD {
	FONT-FAMILY: "Verdana", "Arial", "宋体"; FONT-SIZE: 9pt
}
A {
	COLOR: #660000; TEXT-DECORATION: underline
}
A:hover {
	COLOR: #660000; TEXT-DECORATION: none
}
.line {
	LINE-HEIGHT: 14pt
}
</STYLE>

<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff text=#000000>
<table>
  <TBODY>
  <TR>
    <TD height=21>
      <DIV align=center><B><FONT size=3>谈谈JAVA程序的反编译 <BR><FONT 
      size=2> </FONT></FONT></FONT>
      <HR align=center color=#cccccc noShade SIZE=1>
      </DIV></TD></TR>
  <TR>
    <TD class=line><FONT 
      color=#333300>谈谈JAVA程序的反编译<BR><BR><BR>Sina.com.cn&nbsp;于瑶&nbsp;<BR><BR>  如今JAVA语言在全世界范围正如火如荼般的流行,它广范地应用在INTERNET的数据库、多媒体、CGI、及动态网页的制作方面。1999年在美国对JAVA程序员的需求量首次超过C++!&nbsp;<BR><BR>  作者因最近分析一些JAVA程序,对JAVA的反编译进行了一番了解,下面将我所了解的情况作以下介绍,希望对JAVA爱好者有所帮助。&nbsp;<BR><BR>  JAVA是采用一种称做“字节编码”的程序结构,分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型。无论哪种结构,一旦用JAVAC&nbsp;命令编译后,均变成后缀为CLASS的同名可执行文件。这种文件是不可阅读的代码。&nbsp;<BR><BR>  经查阅了SUN公司的JDK(JDK1.1.3)文档资料后,我找到了一个据称是可反编译JAVA的JAVAP文件(EXE),这个文件位于\JDK\BIN\&nbsp;下面,经按说明使用后,感到失望,原来这个“反编译”仅可反编译出JAVA程序的数据区(定义)、若干方法和类的引用等。&nbsp;<BR><BR>  这里我用了一个简单例子来说明问题。&nbsp;<BR><BR>  JAVA的源程序hello_java.java如下:&nbsp;<BR><BR>  import&nbsp;java.applet.*;&nbsp;<BR>  import&nbsp;java.awt.*;&nbsp;<BR>  public&nbsp;class&nbsp;hello_java&nbsp;extends&nbsp;Applet&nbsp;<BR>  {&nbsp;<BR>  public&nbsp;void&nbsp;paint(Graphics&nbsp;g)&nbsp;<BR>  {&nbsp;<BR>  g.drawString("Hello&nbsp;Java!\n",20,20);&nbsp;<BR>  }&nbsp;<BR>  }&nbsp;<BR><BR>  经用反编译命令:javap&nbsp;-c&nbsp;-package&nbsp;-public&nbsp;-private&nbsp;hello_java&nbsp;hello.java&nbsp;<BR><BR>  得到的反编译结果(hello.java)如下:(有关javap命令的选择参数请见其使用说明,这里-c表示选择了反编译)&nbsp;<BR><BR>  Compiled&nbsp;from&nbsp;hello_java.java&nbsp;<BR><BR>  public&nbsp;synchronized&nbsp;class&nbsp;hello_java&nbsp;extends&nbsp;java.applet.Applet&nbsp;<BR>  /*&nbsp;ACC_SUPER&nbsp;bit&nbsp;set&nbsp;*/&nbsp;<BR>  {&nbsp;<BR>  public&nbsp;void&nbsp;paint(java.awt.Graphics);&nbsp;<BR>  public&nbsp;hello_java();&nbsp;<BR>  Method&nbsp;void&nbsp;paint(java.awt.Graphics)&nbsp;<BR>  0&nbsp;aload_1&nbsp;<BR>  1&nbsp;ldc&nbsp;#1&nbsp;<BR>  3&nbsp;bipush&nbsp;20&nbsp;<BR>  5&nbsp;bipush&nbsp;20&nbsp;<BR>  7&nbsp;invokevirtual&nbsp;#6&nbsp;<BR>  10&nbsp;return&nbsp;<BR>  Method&nbsp;hello_java()&nbsp;<BR>  0&nbsp;aload_0&nbsp;<BR>  1&nbsp;invokespecial&nbsp;#5&nbsp;()V&gt;&nbsp;<BR>  4&nbsp;return&nbsp;<BR>  }&nbsp;<BR><BR>  从上述结果不难看出该反编译未能将源程序全译出来,像语句g.drawString("Hello&nbsp;Java!\n",20,20);&nbsp;就没有。随着程序量增加,未能编译的JAVA语句还会更多。所以这个反编译程序仅能起个参考作用。&nbsp;<BR><BR>  幸亏有了INTERNET,笔者通过YAHOO很快找到了一个JAVA反编译“自由软件”(SHAREWARE),http://www.inter.nl.net/users/H.P.van.Vliet/mocha.htm&nbsp;。&nbsp;这个软件叫MOCHA,据说是一位30来岁的加拿大的研究生所完成,仅是个“?”版,原因是这位叫做H.P.VAN.VLIET的小伙子患癌逝世了,十分可惜呀!&nbsp;<BR><BR>  经使用MOCHA反编译软件,感到这个软件十分好用,笔者试反编译多个JAVA程序,均得到很好的结果。&nbsp;<BR><BR>  这里给出如何使用这个软件,首先,用WINZIP等将"mocha-b1.zip"&nbsp;解开得到"mocha.zip"文件,"mocha.zip"不须再解开,这个包内包括了反编译的类文件,只需将其拷贝到JDK所在的目录下,如:c:\jdk\bin\&nbsp;此外,须设置路径:SET&nbsp;CLASSPATH=c:\myclasses;c:\jdk\bin\mocha.zip&nbsp;<BR><BR>  MOCHA用法:&nbsp;<BR><BR>  java&nbsp;mocha.Decompiler&nbsp;[-v]&nbsp;[-o]&nbsp;Class1.class&nbsp;Class2.class&nbsp;...&nbsp;<BR><BR>  "java"&nbsp;调用Java虚拟机&nbsp;<BR><BR>  "mocha.Decompiler"&nbsp;指示要进行JAVA反编译&nbsp;<BR><BR>  "-v"&nbsp;选择详细输出&nbsp;<BR><BR>  "-o"&nbsp;选写入已有的.mocha&nbsp;文件&nbsp;<BR><BR>  "ClassX.class"&nbsp;指出要反编译类名&nbsp;<BR><BR>  注意,不需给出输出的JAVA文件名,因为MOCHA自动产生一个与CLASS同名但扩展名为MOCHA的JAVA源文件。&nbsp;<BR><BR>  对于上例,可用命令:&nbsp;<BR><BR>  java&nbsp;mocha.Decompiler&nbsp;[-v]&nbsp;[-o]&nbsp;hello_java.class&nbsp;<BR><BR>  得到的源文件:&nbsp;<BR><BR>  /*&nbsp;Decompiled&nbsp;by&nbsp;Mocha&nbsp;from&nbsp;hello_java.class&nbsp;*/&nbsp;<BR><BR>  /*&nbsp;Originally&nbsp;compiled&nbsp;from&nbsp;hello_java.java&nbsp;*/&nbsp;<BR>  import&nbsp;java.applet.Applet;&nbsp;<BR>  import&nbsp;java.awt.Graphics;&nbsp;<BR>  public&nbsp;synchronized&nbsp;class&nbsp;hello_java&nbsp;extends&nbsp;Applet&nbsp;<BR>  {&nbsp;<BR>  public&nbsp;void&nbsp;paint(Graphics&nbsp;g)&nbsp;<BR>  {&nbsp;<BR>  g.drawString("Hello&nbsp;Java!\n",&nbsp;20,&nbsp;20);&nbsp;<BR>  }&nbsp;<BR>  public&nbsp;hello_java()&nbsp;<BR>  {&nbsp;<BR>  }&nbsp;<BR>  }&nbsp;<BR><BR>  我们不难发现,此文件与编译前的JAVA源文件完全一样!笔者曾经用MOCHA反编译出最大为80K的源文件,均取得成功。&nbsp;<BR><BR>  在此,笔者向英年早逝的VLIET表示敬意,感谢他给我们留下这个工具软件。&nbsp;<BR></FONT></TD></TR>
  <TR>
    <TD height=5>
      <HR align=center color=#cccccc noShade SIZE=1>
    </TD></TR></TBODY></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -