谈谈JAVA程序的反编译

home小枫叶

home小枫叶

2016-02-19 17:03

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的谈谈JAVA程序的反编译教程,一起来看看吧!超容易上手~

  如今JAVA语言在全世界范围正如火如荼般的流行,它广范地应用在INTERNET的数据库、多媒体、CGI、及动态网页的制作方面。1999年在美国对JAVA程序员的需求量首次超过C++!

  作者因最近分析一些JAVA程序,对JAVA的反编译进行了一番了解,下面将我所了解的情况作以下介绍,希望对JAVA爱好者有所帮助。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  JAVA是采用一种称做字节编码的程序结构,分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型。无论哪种结构,一旦用JAVAC 命令编译后,均变成后缀为CLASS的同名可执行文件。这种文件是不可阅读的代码。

  经查阅了SUN公司的JDK(JDK1.1.3)文档资料后,我找到了一个据称是可反编译JAVA的JAVAP文件(EXE),这个文件位于JDKBIN 下面,经按说明使用后,感到失望,原来这个反编译仅可反编译出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表示选择了反编译)

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  

  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:jdkbin 此外,须设置路径:SET CLASSPATH=c:myclasses;c:jdkbinmocha.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的源文件,均取得成功。

展开更多 50%)
分享

猜你喜欢

谈谈JAVA程序的反编译

编程语言 网络编程
谈谈JAVA程序的反编译

Java反编译的研究

编程语言 网络编程
Java反编译的研究

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

android apk反编译到java源码的实现方法

编程语言 网络编程
android apk反编译到java源码的实现方法

谈谈在ORACLE下开发JAVA程序的问题

编程语言 网络编程
谈谈在ORACLE下开发JAVA程序的问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

最强大的Flash反编译工具(二)

flash教程
最强大的Flash反编译工具(二)

最强大的Flash反编译工具(三)

flash教程
最强大的Flash反编译工具(三)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

自己写的九九乘法表的制作与读出

自己写的九九乘法表的制作与读出

HTML与CSS在Flash中的应用

HTML与CSS在Flash中的应用
下拉加载更多内容 ↓