Java Tools

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            83 隨筆 :: 0 文章 :: 16 評論 :: 0 Trackbacks

          最近整理以前寫的東東,發現2004年底的時候對比各類Java反編譯器時記下來的一篇心得,也不知道是不是有點兒過時了,僅供大家參考吧。

          =====================================================================

          JAVA語言是19955月由SUN公司發布的,由于其安全性高、代碼優化、跨平臺等特性,迅速取代了很多傳統高級語言,占據了企業級網絡應用開發等諸多領域的霸主地位。

          不過,JAVA最突出的跨平臺優勢使得它不能被編譯成本地代碼,而要以中間代碼的形式運行在虛擬機環境中,這使得JAVA的反編譯要比別的高級語言容易實現,并且反編譯的代碼經過優化后幾乎可以與源代碼相媲美。

          為了更好地保護知識產權,避免本公司的智力成果輕易被人竊取,開發者有必要對反編譯工具深入了解,以便有針對性地采取保護措施。

          目前,比較流行的JAVA反編譯工具超過30種,其中有三款堪稱精品:

          一、         應用廣泛的JAD

          在眾多的JAVA反編譯工具中,有幾種非常著名的工具使用了相同的核心引擎——JAD,其中主要包括:Front End PlusmDeJavaDecafe ProCavaj Java DecompilerDJ Java DecompilerNMI’s Java Class Viewer和國產的JAVA源代碼反編譯專家等等。

          JAD本身是一個命令行工具,沒有圖形界面,上述的這些工具大多是在JAD內核的基礎之上加了一個圖形界面而已。這么多種產品的共同選擇,足可證明JADJAVA反編譯領域中的尊貴地位。

          筆者用來測試的JAD版本是1.5.8f。

          JAD是使用Microsoft Visual C++開發的,運行速度非常快,可以處理很復雜的JAVA編譯文件。眾多的參數使JAD可以靈活應付多種加密手段,令反編譯的代碼更加優化和易讀。由于JAD參數太多,沒必要一一解釋,其中有幾個最常用的如下:

                   -d

          - 用于指定輸出文件的目錄

           

                   -s - 輸出文件擴展名(默認為: .jad),通常都會把輸出文件擴展名直接指定為.java,以方便修改的重新編譯。

                   -8       - Unicode字符轉換為ANSI字符串,如果輸出字符串是中文的話一定要加上這個參數才能正確顯示。

          最常用的反編譯指令如下所示:

          Jad –d c:\javasource –s .java -8 javatest.class

          這條指令將當前目錄下的javatest.class反編譯為javatest.java并保存在c:\javasource目錄里,其中的提示輸出為中文,而不是Unicode代碼。

          二、         源碼開放的JODE

          JODE是全球最大的開源項目網站Sourceforge.net的成員,不要以為源碼開放就小瞧它,在所有的JAVA反編譯器中,JODE的反編譯效果是最好的,尤其是對付一些常見的加密手段,例如混淆技術等,更是出類拔粹。

          JODE本身也是純JAVA開發的,最近越來越多的JAVA反編譯軟件也選擇JODE來做它們的核心引擎,例如JCavaj Java DecompilerBTJ (Back To Java)jEdit's JavaInsight plugin等。

          JODE是一個可運行的JAR文件,在windows環境下雙擊即可運行。

          需要特別說明的是,JODE不是通過常規的Open->File的方式來加載JAVA編譯后的類文件(*.class)或是類包(*.jar)的,而是通過在Options菜單中的Set Classpath來實現的,單獨的類文件可以將它的上一級目錄作為Classpath輸入,然后再選擇Reload Classpath即可。

            

          新加入的類包或是類的名字會在左側窗口出現,雙擊類包名可以展開目錄樹結構,雙擊需要反編譯的類名則在右上角的窗口中直接顯示反編譯后的源代碼。

           

          三、         獨樹一幟的DAVA

          DAVA不是一個獨立的JAVA反編譯器,而是JAVA代碼優化工具Soot的一部分。SootJODE一樣是純JAVA開發的,也是一個獨立的JAR包,但卻不能通過雙擊直接運行,而是象JAD一樣在命令行狀態運行。

          Soot對環境變量的配置要求非常嚴格,通常情況下要對CLASSPATH做如下設置:

          Set CLASSPATH=%CLASSPATH%;c:\sootdir\sootclasses-2.1.0.jar;.;

          其中的c:\sootdir\是下載的soot類包放置的路徑,CLASSPATH末尾的.;代表了當前目錄,如果不加上這個的話Soot經常會報一個找不到類的錯誤。

                DAVA是作為Soot的一個參數使用的,通常的用法如下:

          Java soot.Main –f dava –d c:\javasource javatest

          注意最后的類名不用帶.class后綴,因為它默認是處理class文件,這個操作與前述的JAD的參數效果相同。

          DAVA采取了流程優化的方式進行反編譯,與傳統反編譯思路不盡相同,但卻對改變流程類的加密方法有獨特的反編譯效果。

           

          上述的三種工具各有千秋,但效果都非常不錯。經測試,它們基本上都可以把JDK自帶的一些例程完全反編譯,然后不加任何修改可再編譯成功,并能正常運行!

          (文中工具均經過本人親手測試,當時用的是jdk1.4.2_03,現在離寫文章的時候過了一年多了,jdk都出到1.5了,怕是有些程序也不太好反編了)

          /*原創作品,轉載請注明出處*/

          posted on 2007-07-02 12:50 和田雨 閱讀(2478) 評論(0)  編輯  收藏 所屬分類: J2SE
          主站蜘蛛池模板: 通道| 南雄市| 通海县| 洮南市| 永善县| 福清市| 佛坪县| 永定县| 平邑县| 同江市| 武穴市| 桂林市| 祥云县| 长海县| 枞阳县| 寿阳县| 五大连池市| 莱芜市| 湖南省| 临邑县| 金山区| 广河县| 平江县| 当阳市| 兰西县| 体育| 和田县| 武胜县| 高淳县| 平塘县| 乌审旗| 湟中县| 乌拉特前旗| 阿勒泰市| 瑞金市| 洪江市| 岳阳县| 香格里拉县| 巴林左旗| 博罗县| 永州市|