a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 145|回复: 1

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

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
 现在JAVA说话在全世界规模正如火如荼般的风行,它广范地应用在INTERNET的数据库、多媒体、CGI、及动态网页的建造方面。1999年在美国对JAVA轨范员的需求量初度跨越C++!   作者因比来剖析一些JAVA轨范,对JAVA的反编译进行了一番体味,下面将我所体味的情形作以下介绍,但愿对JAVA快乐喜爱者有所辅佐。
; O: E2 U" s, Z8 l. W% P  e. ~8 ]# Z  JAVA是采用一种称做“字节编码”的轨范结构,分为小轨范(嵌入到HTML文件中)和应用轨范(直接在呼吁状况下执行)两种类型。无论哪种结构,一旦用JAVAC 呼吁编译后,均酿成后缀为CLASS的同名可执行文件。这种文件是不成阅读的代码。
5 f0 U( P. J7 Z4 E5 @2 }  经查阅了SUN公司的JDK(JDK1.1.3)文档资料后,我找到了一个据称是可反编译JAVA的JAVAP文件(EXE),这个文件位于JDKBIN 下面,经按声名使用后,感应失踪望,原本这个“反编译”仅可反编译出JAVA轨范的数据区(界说)、若干体例和类的引用等。
* H* P3 P% d4 |- ?- ~5 k  这里我用了一个简单例子来声名问题。, S" Z# u% H5 _$ [0 V: K1 U8 s
  JAVA的源轨范hello_java.java如下:# A- }* c: s2 ]1 i. W0 k% K
  import java.applet.*;
0 @, l: Z' |3 @* q( j3 T/ Q  import java.awt.*;
- Y! \' g8 k# P1 A1 V  public class hello_java extends Applet
- y+ m/ t- w1 d- \: `  {
" W, r7 S6 g' e8 T: R' c& F  public void paint(Graphics g)
- H  b: F/ k% Q. M3 \9 {  {
1 b: o- E& i, i: V  g.drawString("Hello Java!n",20,20);" F' f- d1 c: G8 o+ g
  }6 @' Z% Y( F/ O0 s
  }
0 h9 b) q, J; g) {' T% Q" v% O  经用反编译呼吁:javap -c -package -public -private hello_java hello.java
" s7 w0 o  [0 u! b6 H+ h  获得的反编译结不美观(hello.java)如下:(有关javap呼吁的选择参数请见其使用声名,这里-c暗示选择了反编译); r7 g' o$ c5 |. u
  Compiled from hello_java.java7 U/ r& N& F5 I7 X7 e: o6 T$ Q
  public synchronized class hello_java extends java.applet.Applet$ e+ n0 Q  y7 H  [& S
  /* ACC_SUPER bit set */( G$ |% O5 Y) \. p) H
  {
. I: z& v0 p7 P3 W  public void paint(java.awt.Graphics);* ]; V+ |2 h' F( Z: E
  public hello_java();) e: ~; ]3 X+ S3 m7 n; ]+ G$ L/ x
  Method void paint(java.awt.Graphics); L+ ?1 z/ p+ Y/ s5 T' m7 `7 P
  0 aload_1
0 {) O' g" O3 X* J, i4 D  1 ldc #1
6 @0 n% J! a8 ]& V1 A  3 bipush 20
/ i8 I: z  B' X$ e  5 bipush 209 T9 W; o" J: m8 A5 c0 @
  7 invokevirtual #63 b' r: g- L2 F9 }4 h" Q* v
  10 return0 f' Y, X6 e! q' Q- L
  Method hello_java()& n1 W5 _+ x  |" h
  0 aload_03 ]! v% V2 b0 i; o% B) U
  1 invokespecial #5 ()V>
  ]& n- a: x$ E& c  4 return1 Y3 b# M& X% f; D- p* I( r  S* h
. X4 j" `# Z1 s$ [! ]( [0 O3 h- _7 ~: A& Y
  }
回复

使用道具 举报

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

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

</p>  年夜上述结不美观不难看出该反编译未能将源轨范全译出来,像语句g.drawString("Hello Java!n",20,20); 就没有。跟着轨范量增添,未能编译的JAVA语句还会更多。所以这个反编译轨范仅能起个参考浸染。* m& F% f- i) {
  好在有了INTERNET,笔者经由过程YAHOO很快找到了一个JAVA反编译“自由软件”(SHAREWARE),http://www.inter.nl.net/users/H.P.van.Vliet/mocha.htm 。 这个软件叫MOCHA,据说是一位30明年的加拿年夜的研究生所完成,仅是个“?”版,原因是这位叫做H.P.VAN.VLIET的小伙子患癌逝世了,十分可惜呀!
3 T# b3 c# V  O7 q. i& x  经使用MOCHA反编译软件,感应这个软件十分好用,笔者试反编译多个JAVA轨范,均获得很好的结不美观。
$ r) t2 j: `" u; q5 ^. s" L  这里给出若何使用这个软件,首先,用WINZIP等将"mocha-b1.zip" 解开获得"mocha.zip"文件,"mocha.zip"不须再解开,这个包内搜罗了反编译的类文件,只需将其拷贝到JDK地址的目录下,如:c:jdkbin 此外,须设置路径:SET CLASSPATH=c:myclasses;c:jdkbinmocha.zip
' D  G2 I' D0 W# K1 `  MOCHA用法:) i9 g) K& {, c# E) M; ?' c2 j
  java mocha.Decompiler [-v] [-o] Class1.class Class2.class ...0 Q( n+ O* r  R" }6 n
  "java" 挪用Java虚拟机; j3 ]$ |: Z3 a( v0 C
  "mocha.Decompiler" 指示要进行JAVA反编译
, {( {! k. j$ |  "-v" 选择具体输出, a/ O$ A$ c% P
  "-o" 选写入已有的.mocha 文件
: @8 d; P2 D' V  "ClassX.class" 指出要反编译类名
& A2 {0 `5 P+ q, n) S* z0 v  注重,不需给出输出的JAVA文件名,因为MOCHA自动发生一个与CLASS同名但扩展名为MOCHA的JAVA源文件。
1 L3 I& Q2 c9 @# N7 m4 O8 I  对于上例,可用呼吁:0 O& K3 n. i0 |) ~5 g  ]4 O% a
  java mocha.Decompiler [-v] [-o] hello_java.class( [9 M" U, r, I  W
  获得的源文件:
) x8 c6 p3 L2 _* O/ R# D  /* Decompiled by Mocha from hello_java.class */: L' c" w+ C$ S( Z
  /* Originally compiled from hello_java.java */! x" }* h  m. r) C0 A
  import java.applet.Applet;
; @1 l# x* L/ N2 B# _0 U  import java.awt.Graphics;
' i/ t; x" v2 D) V$ T# Q9 S  public synchronized class hello_java extends Applet$ }1 u* S% }4 q. n  Y
  {0 M+ k( J  ]% i( A3 W
  public void paint(Graphics g)* _0 k' C+ H6 n
  {
( H8 g4 ?  S, q% o  o+ }  g.drawString("Hello Java!n", 20, 20);. A- B0 x" S! Q. F  t
  }$ c  S) P  s8 ?4 `0 }
  public hello_java()
4 o, c3 a8 ^9 j8 U" R  {# b3 B" N' `5 s5 D; T
  }
: J" ~7 [1 ~# k: Z: t4 I  }
7 R$ a' N. r$ s1 M: i  我们不难发现,此文件与编译前的JAVA源文件完全一样!笔者曾经用MOCHA反编译出最年夜为80K的源文件,均取得成功。
; e- w/ r( @5 K! T6 V: F  在此,笔者向英年早逝的VLIET暗示敬意,感谢感动他给我们留下这个工具软件。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 01:29 , Processed in 0.566646 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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