a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 146|回复: 1

[其他] JAVA技巧:谈谈JAVA程序的反编译

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
 现在JAVA说话在全世界规模正如火如荼般的风行,它广范地应用在INTERNET的数据库、多媒体、CGI、及动态网页的建造方面。1999年在美国对JAVA轨范员的需求量初度跨越C++!   作者因比来剖析一些JAVA轨范,对JAVA的反编译进行了一番体味,下面将我所体味的情形作以下介绍,但愿对JAVA快乐喜爱者有所辅佐。
7 @3 O& q, ?  T! b! E9 u9 H# x) p  JAVA是采用一种称做“字节编码”的轨范结构,分为小轨范(嵌入到HTML文件中)和应用轨范(直接在呼吁状况下执行)两种类型。无论哪种结构,一旦用JAVAC 呼吁编译后,均酿成后缀为CLASS的同名可执行文件。这种文件是不成阅读的代码。
9 x0 g2 l1 J7 j  经查阅了SUN公司的JDK(JDK1.1.3)文档资料后,我找到了一个据称是可反编译JAVA的JAVAP文件(EXE),这个文件位于JDKBIN 下面,经按声名使用后,感应失踪望,原本这个“反编译”仅可反编译出JAVA轨范的数据区(界说)、若干体例和类的引用等。
! \" y# D6 ]# r2 [5 ?8 v  这里我用了一个简单例子来声名问题。
& H* r/ I* D: p( |' f7 a1 x9 {( H  JAVA的源轨范hello_java.java如下:
- D6 k6 J1 C7 [6 D- P) X  import java.applet.*;, [  S8 G6 N  d: B, p% t: S9 ]" H
  import java.awt.*;
4 U* x& R# G/ n, k" g) r  public class hello_java extends Applet
" h: {: x, c- a1 r! Z  {
, m# a4 _; W$ T5 L1 T3 B  public void paint(Graphics g)* H% T; Q0 \! j) m3 h0 j
  {
/ X2 E2 o  H: d0 C  g.drawString("Hello Java!n",20,20);% s3 t7 G% d9 D1 B
  }
# O6 c! Q, z: W: R0 \: i3 e- |  }+ B8 z8 i, n7 z& _
  经用反编译呼吁:javap -c -package -public -private hello_java hello.java" V+ m' ]8 a: k2 G- v$ k* `
  获得的反编译结不美观(hello.java)如下:(有关javap呼吁的选择参数请见其使用声名,这里-c暗示选择了反编译)9 u1 C( e  j, Z$ a* y
  Compiled from hello_java.java  Y* z$ _9 R- |
  public synchronized class hello_java extends java.applet.Applet: X/ Y! a1 ?( T
  /* ACC_SUPER bit set */
$ S( J  `( Q$ d- G. x  {" S% a  p# h+ C7 Y3 Z/ D
  public void paint(java.awt.Graphics);
( d3 {! O' M: L1 n$ K  public hello_java();; z* e: c1 ]9 {, s2 U
  Method void paint(java.awt.Graphics)# ?) k' y4 e5 ~" d  h3 D
  0 aload_1
* e) C- V. V/ s. i. q7 U4 _/ j  1 ldc #1
- D6 ^& s! S7 Y  3 bipush 20+ z- r: F1 I* b
  5 bipush 20
+ [& J/ ?6 C' J4 I$ [/ K' E  7 invokevirtual #6+ y4 p1 B6 z& a( [$ m6 q( T
  10 return
# H2 X3 m6 Q0 s4 `1 [( A8 [  Method hello_java()
  h& ?/ ]; R7 i" s! ~  0 aload_0
5 O( Y' ~5 ^, u0 {; X  1 invokespecial #5 ()V>
# p* x2 y4 m$ H3 \& t( s  4 return
! y9 F" v" F; S. S8 u# G7 v
% Z6 i/ \8 U7 t6 G4 \2 z  }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:24 | 显示全部楼层

JAVA技巧:谈谈JAVA程序的反编译

</p>  年夜上述结不美观不难看出该反编译未能将源轨范全译出来,像语句g.drawString("Hello Java!n",20,20); 就没有。跟着轨范量增添,未能编译的JAVA语句还会更多。所以这个反编译轨范仅能起个参考浸染。) @- z* t" H& Y* p
  好在有了INTERNET,笔者经由过程YAHOO很快找到了一个JAVA反编译“自由软件”(SHAREWARE),http://www.inter.nl.net/users/H.P.van.Vliet/mocha.htm 。 这个软件叫MOCHA,据说是一位30明年的加拿年夜的研究生所完成,仅是个“?”版,原因是这位叫做H.P.VAN.VLIET的小伙子患癌逝世了,十分可惜呀!# F3 Z& F: m6 c4 [0 Y3 ^. F! U
  经使用MOCHA反编译软件,感应这个软件十分好用,笔者试反编译多个JAVA轨范,均获得很好的结不美观。% b' D6 A! Z4 \! u# `$ E) \- Z# k
  这里给出若何使用这个软件,首先,用WINZIP等将"mocha-b1.zip" 解开获得"mocha.zip"文件,"mocha.zip"不须再解开,这个包内搜罗了反编译的类文件,只需将其拷贝到JDK地址的目录下,如:c:jdkbin 此外,须设置路径:SET CLASSPATH=c:myclasses;c:jdkbinmocha.zip
0 [) i2 W4 p( V6 C! p" @6 h  MOCHA用法:
( N7 l, {  d, E" T9 @  java mocha.Decompiler [-v] [-o] Class1.class Class2.class ...
5 F+ ?: n# X( ]# h$ Q8 ~  "java" 挪用Java虚拟机
9 b6 {9 h* }. G" w  "mocha.Decompiler" 指示要进行JAVA反编译
' N2 o9 n& Y% \6 M! e) S2 t  "-v" 选择具体输出
$ ^+ _3 A, _' g0 m  "-o" 选写入已有的.mocha 文件
1 a3 C# m! h6 ]. g/ U- Q  "ClassX.class" 指出要反编译类名
$ R2 @# {* {& A2 S) R, K& b  注重,不需给出输出的JAVA文件名,因为MOCHA自动发生一个与CLASS同名但扩展名为MOCHA的JAVA源文件。) ]$ b6 F1 @1 U5 x  d8 o
  对于上例,可用呼吁:! ]+ T. q7 I  f% a& Q
  java mocha.Decompiler [-v] [-o] hello_java.class
2 ?* T0 h: q, b  获得的源文件:2 m! A2 v2 Q( Q" Z( l9 v) M, l
  /* Decompiled by Mocha from hello_java.class */4 O0 z5 E+ j  j/ h2 S" D& R
  /* Originally compiled from hello_java.java */
# A! T/ P' L3 @# F2 I  import java.applet.Applet;6 M7 U4 F5 U' z  ^  f! x
  import java.awt.Graphics;
. D% o3 B  X) i7 [$ W8 E: ]+ s1 h  public synchronized class hello_java extends Applet
. A, h$ B7 |- K* ?2 v' Y  {
5 P( g0 U6 e# {& z* C  public void paint(Graphics g)
& v( \' W  w; A5 {$ z# w  {
1 Z0 y6 w3 q  k* S. s  g.drawString("Hello Java!n", 20, 20);
  s" F( L# f" m, g3 p+ \6 W. S  }5 ]0 B+ X9 j- R( Q9 `; I
  public hello_java()7 S2 a4 |) T: U( [
  {( b, l) y: f3 u0 Z
  }' ?$ H$ B/ r" D1 x$ ]" E& a  a
  }
# J0 q: h1 Z9 ]6 h$ m  我们不难发现,此文件与编译前的JAVA源文件完全一样!笔者曾经用MOCHA反编译出最年夜为80K的源文件,均取得成功。0 W( l) A0 F$ z% C
  在此,笔者向英年早逝的VLIET暗示敬意,感谢感动他给我们留下这个工具软件。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-16 21:15 , Processed in 0.952366 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表