在Eclipse中反編譯Class文件徹底詳解

Java是開源的,是免費的,咱們強烈鄙視全部不公開源代碼的東東。好比,對class文件進行加密混淆的類文件,通常狀況下,咱們是看不到其源代碼的。本文將對此進行詳細闡述,說明如何爲所欲爲的反編譯看源碼,體驗一下其中的樂趣。(本文最後面有相關資源下載)
    目前在Java開發工具中,Eclipse可謂是佔據着絕對的優點,在日常使用中,你們都會有意無心的查看一下所調用JAR包的源代碼,這時若是沒有引入源文件的話,將會看不到結果。大象以dom4j-1.6.1.jar爲例來進行說明,打開demo項目(請在dom4j分類中查找),找到com.demo.database.DataBaseConnect類,按住Ctrl鍵,再用鼠標點擊Element如圖:

    
    dom4j是開源的,能夠在sourceforge.net下載到它的完整版,裏面固然包含源代碼。大象想說的是,在作開發的時候,須要用到大量的JAR包,你不可能每一個都去down一個源碼下來,並且咱們用不到這麼多的源碼,只是在須要的時候,看下其中的代碼,解決一時的問題。
    大象經過查看網上其餘人的研究成果再結合本身的分析,總結了一些經驗,如今整合起來和你們分享一下。
    一、安裝jadclipse插件
       選擇插件時,本人曾經使用過網上評論很是好的Jode開發的Eclipse插件,不過效果不是很好,對有些加密的類不能反編譯,後來發現不少人用jadclipse,結果試驗了一下,很不錯的說。
       使用jadclipse插件必定要注意Eclipse版本。jadclipse_3.2.4,它對應的是Eclipse3.2版,jadclipse_3.3.0能夠用於Eclipse3.3M6以上版。你們千萬不要把jadclipse_3.3.0放到Eclipse3.2中,也不要把jadclipse_3.2.4放到Eclipse3.3中,這樣作是沒什麼任何效果滴!大象所有都測試過!
       下面來講下安裝過程,其實很簡單,網上也有相關的資料。將jadclipse插件(版本本身選擇)直接copyEclipse目錄中的plugins文件夾下,而後打開Eclipse,選擇"窗口"-"首選項"-"常規"-"編輯器"-"文件關聯",點擊文件關聯中的*.class,下面就會看到"JadClipse Class File Viewer",選中它,點擊缺省值,點擊OK,將它設置爲默認的類查看器。如圖:

    
       另外在用jadclipse的時候,必定要加入jad.exe這個程序,若是隻有插件而沒有jad,那麼仍是不能反編譯成功,會顯示以下所示的錯誤,所以咱們還要安裝jad

    二、安裝jad
       能夠在 http://www.kpdus.com/jad.html#download 這個地址下載到最新的jad,並且有不一樣平臺的版本,本文後面也有相關下載。將下載的壓縮包解壓後複製jad.exe至你的%JAVA_HOME%\bin目錄下,這樣作的好處是使用方便。而後在Eclipse中設置一下,選擇窗口」-「首選項」-「Java」-「JadClipse」,在path to decompiler中輸入jad.exe的絕對路徑。這樣作是爲了保證反編譯的效果。大象作過測試,只要將jad.exe放入%JAVA_HOME%\bin目錄下,就沒問題了,這個地方不設置也不要緊,不過本人仍是建議你們設置一下,其它地方不用管。其實大象也不知道該怎麼弄,就讓它保持默認值好了。^_^
    
       到這裏,咱們的工做就作完了,如今再來按住Ctrl,用鼠標點擊Element,怎麼樣?看到源代碼了嗎?貼上部分反編譯代碼,如圖:
    
       使用jad對絕大部分的加密混淆class文件都能很好的作到反編譯,目前大象還沒遇到失敗的狀況,你們也能夠多測試一下。jadclipse插件體積很小(只有40幾K),和jad完美結合。大象強烈推薦!
       如今有人會說了,這樣一個一個的看太麻煩了,我須要一次把一個JAR包下的全部class文件反編譯成java源文件。這樣的想法是可行的,仍是使用jad工具。

    三、批量反編譯
       由於以前咱們已經將jad加入到了%JAVA_HOME%\bin中,只要配置了環境變量,咱們就能夠在命令行中方便的使用。在這裏,大象仍是以dom4j-1.6.1.jar爲例來講明具體的操做步驟。
       解壓dom4j-1.6.1.jarjaxen-1.1-beta-7.jar。爲了方便,我將JAR包解壓放到F盤根目錄,在cmd中,進入到F盤根路徑下,輸入命令:jad -o -r -s java -d src org/**/*.class
       我解釋一下這些參數的含義:
       -o:覆蓋舊文件,並且不用提示確認。
       -r:從新加載生成包結構。
       -s:定義輸出文件的擴展名。jad爲默認擴展名,咱們反編譯後固然是要.java源文件了。
       -d:輸出文件的目錄。src表示反編譯後的全部文件都放在src目錄下。
       org/**/*.classorg是解壓後的文件夾的名字,整個表示org目錄下的全部class文件。你也能夠寫成這樣**/*.class,這表示當前目錄及其子目錄下全部的class文件(包含全部的子目錄)。
       反編譯dom4j-1.6.1.jar必須得有jaxen-1.1-beta-7.jar,由於dom4j裏面有對xpath的調用,而這些東西都是引用jaxen裏的API,若是不加則會有這樣的錯誤:

    
    到此,關於反編譯的內容所有說完了,不過我還想補充一點,有可能JAR包中的class文件不是老外的,而是咱們本身寫的,裏面可能會有中文的狀況,這時,雖然反編譯經過了,但裏面倒是gb2312形式的unicode編碼,所以咱們還得作一個工做,將這些編碼轉換成中文。
    大象使用ant腳原本完成這個工做,內容比較簡單,加了註釋,應該很好明白,腳本文件名爲build.xml,它放在src目錄下,和反編譯所得的包處在同一層。
html

 

<? xml version="1.0" encoding="GBK" ?> 
< project  name ="decompile"  basedir ="."  default ="native2ascii" > 
     <!--  定義輸出目錄  --> 
     < property  name ="build"  value ="build" /> 
     <!--  清除輸出目錄  --> 
     < target  name ="clean" > 
         < delete  dir ="${build}" /> 
     </ target > 
     <!--  建立輸出目錄  --> 
     < target  name ="init"  depends ="clean" > 
         < mkdir  dir ="${build}" /> 
     </ target > 
     <!--  編碼轉換 reverse="true"爲反向轉換  -->         
     < target  name ="native2ascii"  depends ="init" > 
         < native2ascii  reverse ="true"  src ="${basedir}"  encoding ="gb2312"  dest ="${basedir}/${build}"   /> 
     </ target > 
</ project >


    有一個地方須要補充一下,在native2ascii元素中,srcdest這兩個屬性表示着路徑。若是反編譯後,src目錄下,有多個不一樣的文件夾,這時使用ant來轉換編碼,請先想好要對哪些文件進行反編碼;若是按上面的寫法,將會把src目錄下的全部文件夾中的全部文件進行反編碼。假設,如今有comorg兩個文件夾(實際上是兩個包),我只須要對com中的文件進行反編碼,那麼能夠這樣改寫:src="${basedir}/com" dest="${basedir}/${build}/com"
    其它的都不變。在cmd中進入到src路徑下,輸入ant,回車。能夠看到以下結果:
    
    經過上面這些操做,class文件已經對咱們徹底公開,想怎麼看就怎麼看,呵呵~~~~寫這些,是以爲對開發工做可能會有必定的幫助,若是看後可以對你工做或是學習起到哪怕一點點的做用,大象就感到很知足了;若是你早就瞭解這些,或是認爲寫得很差,還請不要扔磚頭,扔蕃茄,更不要對大象口誅筆伐,人身攻擊,就當看了一篇白話文好了。你們若是有什麼好的建議或是意見,歡迎提出來一塊兒討論,一塊兒學習。
  
    點擊下載:dom4j-1.6.1.jar  jaxen-1.1-beta-7.jar
    點擊下載:jadclipse_3.2.4.jar  jadclipse_3.3.0.jar
    點擊下載:jad.exe  build.xml
java

相關文章
相關標籤/搜索