熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

談談JAVA的反編譯

2013-11-23 17:54:43  來源: Javascript 

  作者因最近分析一些JAVA程序對JAVA的反編譯進行了一番了解下面將我所了解的情況作以下介紹希望對JAVA愛好者有所幫助
  
  JAVA是采用一種稱做字節編碼的程序結構分為小程序(嵌入到HTML文件中)和應用程序(直接在命令狀態下執行)兩種類型無論哪種結構一旦用JAVAC 命令編譯後均變成後綴為CLASS的同名可執行文件這種文件是不可閱讀的代碼
  經查閱了SUN公司的JDK(JDK)文檔資料後我找到了一個據稱是可反編譯JAVA的JAVAP文件(EXE)這個文件位於JDKBIN 下面經按說明使用後感到失望原來這個反編譯僅可反編譯出JAVA程序的數據區(定義)若干方法和類的引用等
  
  這裡我用了一個簡單例子來說明問題
  JAVA的源程序hello_javajava如下
  
  import javaapplet*;
  import javaawt*;
  
  public class hello_java extends Applet
  {
  public void paint(Graphics g)
  {
  gdrawString(Hello Java!n);
  }
  }
  
  經用反編譯命令javap c package public private hello_java hellojava
  得到的反編譯結果(hellojava)如下(有關javap命令的選擇參數請見其使用說明這裡c表示選擇了反編譯)
  
  Compiled from hello_javajava
  public synchronized class hello_java extends javaappletApplet
  /* ACC_SUPER bit set */
  {
  public void paint(javaawtGraphics);
  public hello_java();
  
  Method void paint(javaawtGraphics)
   aload_
   ldc #
   bipush
   bipush
   invokevirtual #
   return
  
  Method hello_java()
   aload_
   invokespecial # ()V >
   return
  }
  
  從上述結果不難看出該反編譯未能將源程序全譯出來像語句gdrawString(Hello Java!n); 就沒有隨著程序量增加未能編譯的JAVA語句還會更多所以這個反編譯程序僅能起個參考作用
  幸虧有了INTERNET筆者通過YAHOO很快找到了一個JAVA反編譯自由軟件(SHAREWARE) 這個軟件叫MOCHA據說是一位來歲的加拿大的研究生所完成僅是個?原因是這位叫做HPVANVLIET的小伙子患癌逝世了十分可惜呀!
  經使用MOCHA反編譯軟件感到這個軟件十分好用筆者試反編譯多個JAVA程序均得到很好的結果
  這裡給出如何使用這個軟件首先用WINZIP等將mochabzip 解開得到mochazip文件mochazip不須再解開這個包內包括了反編譯的類文件只需將其拷貝到JDK所在的目錄下c:jdkbin 此外須設置路徑SET CLASSPATH=c:myclasses;c:jdkbinmochazip
  MOCHA用法
  java mochaDecompiler [v] [o] Classclass Classclass
  java 調用Java虛擬機
  mochaDecompiler 指示要進行JAVA反編譯
  v 選擇詳細輸出
  o 選寫入已有的mocha 文件
  ClassXclass 指出要反編譯類名
  注意不需給出輸出的JAVA文件名因為MOCHA自動產生一個與CLASS同名但擴展名為MOCHA的JAVA源文件
  對於上例可用命令
  java mochaDecompiler [v] [o] hello_javaclass
  得到的源文件
  /* Decompiled by Mocha from hello_javaclass */
  /* Originally compiled from hello_javajava */
  
  import javaappletApplet;
  import javaawtGraphics;
  
  public synchronized class hello_java extends Applet
  {
  public void paint(Graphics g)
  {
  gdrawString(Hello Java!n );
  }
  
  public hello_java()
  {
  }
  }
  我們不難發現此文件與編譯前的JAVA源文件完全一樣!筆者曾經用MOCHA反編譯出最大為K的源文件均取得成功
  在此筆者向英年早逝的VLIET表示敬意感謝他給我們留下這個工具軟件
  如讀者下載MOCHA有困難可給筆者來電子郵件筆者可將MOCHA寄去
  
  參考文獻
  
  
  
  

From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25331.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.