Java反編譯工具使用對比,最好用的Java反編譯工具 --- JD-GUI、XJad

chunlynn發表於2017-10-17

Java反編譯工具使用對比,最好用的Java反編譯工具 --- JD-GUI、XJad


一、前言


1、什麼是反編譯?

大家都知道,將原始碼轉換成二進位制執行程式碼的過程叫編譯,比如將C原始碼編譯成.exe可執行檔案;那麼把二進位制執行程式碼轉換成原始碼的過程就叫“反編譯,比如把exe轉換為C原始碼就叫“反編譯”。
       由於主流的C的編譯器都進行了程式碼的優化,因此把C編譯生成的exe檔案反編譯成C程式碼非常困難。但是像Java、.net這樣基於虛擬機器技術的程式語言則反編譯非常容易,Java平臺下有Jad、Jode、JD等反編譯器,.net平臺下則有Reflector等反編譯器,他們的反編譯質量非常高,甚至和原始碼幾乎沒什麼差別。

2、反編譯得到的是原始碼嗎?
     反編譯得到的程式碼是非常接近於原始碼,但是或多或少與原始碼有一些差異的,比如一些表示式被優化掉了,比如,下面的原始碼:
 int i=1+1;
學過《編譯原理》的同學知道有“常量優化”這個編譯優化演算法,因此上邊的原始碼一般會被優化為:int i=2;
由於在編譯過程中已經進行了優化,把“1+1”這個原始的資訊丟掉了,因此反編譯出來的程式碼只能是:
int i=2;
可以看到反編譯得到的程式碼和原始碼是有區別的。
比如:andriod中
download = (Button)findViewById(R.id.xiaz);
被優化成了download = (Button)findViewById(0x7f070018);

3、程式可以反編譯豈不是很不安全?
可以採用程式碼混淆等技術來加大反編譯的難度,和降低反編譯程式碼的可讀性,但是完全避免反編譯是不可能的。


4、反編譯器的原理是什麼?
由於Java、.net這樣的基於虛擬機器技術的語言平臺,都是採用了Byte Code的二進位制結構,因此很容易將ByteCode轉化為“抽象語法樹”(簡稱AST,《編譯原理》這門課中的概念),然後採用反編譯器就可以將AST轉換為程式碼了。


二、反編譯工具和外掛有哪些?


1、 JD-GUI【推薦】

JD-GUI是屬於Java Decompiler專案(JD專案)下個的圖形化執行方式的反編譯器。
JD-Eclipse屬於Java Decompiler專案(JD專案)下個Eclipse外掛化執行方式的反編譯外掛。
JD-IntelliJ屬於Java Decompiler專案(JD專案)下個Intellij外掛化的執行方式的反編譯外掛。

JD-GUI 是一個用 C++ 開發的 Java 反編譯工具,由 Pavel Kouznetsov開發,支援Windows、Linux和蘋果Mac Os三個平臺。而且提供了Eclipse平臺下的外掛JD-Eclipse,Intellij平臺下的外掛JD-Intellij。JD-GUI不需要安裝,直接點選執行,可以反編譯jar,class檔案。

支援jar包級的反編譯,可將整個jar包直接儲存為*.src.zip原始碼包,反編譯迅速,錯誤率極少。

JD分為JD-GUI、JD-Eclipse/JD-Intellij兩種執行方式,JD-GUI是以單獨的程式的方式執行,JD-Eclipse/JD-Intellji則是以一個Eclipse/IDEA外掛的方式執行。

Java Decompiler專案”旨在開發一些工具,以便反編譯和分析Java 5以及更高本的Java的“位元組程式碼”。
JD-Core是一個庫,是一個從一個或多個“.class”檔案中重建Java原始碼的庫。JD-Core可用於恢復丟失的原始碼並探索執行時Java的原始碼。支援Java 5的新功能,例如註釋,泛型或型別“列舉”。JD-GUI和JD-Eclipse包括JD-Core庫。

2、Jad 

jad是一款使用非常廣泛地Java反編譯工具,Jadclipse就是基於jad的反編譯外掛,JAD 檔案包含 MIDlet 套件的標題資訊,例如開發應用程式的公司、應用程式名稱和大小。

3、XJad (比較好用,不過目前版本是2.2,是2006釋出的了,一直沒更新了,而且有bug,不推薦了

XJad是基於Jad核心的Java源程式反編譯軟體,內建Jad1.5.8e2;
可處理多個*.class檔案,可以處理資料夾內的所有檔案,甚至可以處理*.jar檔案;
帶有多頁面文字編輯器,也可整合在資源管理器中,隨時點選右鍵都可進行操作;
支援java語法的高亮顯示;


4、Luyten

比較精準的一個java反編譯工具,沒用過,用的人比較少。


......

還有很多反編譯工具,但是主要推薦JD-GUI,其次是XJad。


----------------------

反編譯工具下載:

1、JD-GUI(Java反編譯工具) 0.3.6 綠色免費版.zip 【免安裝,直接解壓執行】-CSDN下載  http://download.csdn.net/download/chenchunlin526/10024535


2、Java反編譯工具(XJad) v2.2 中文綠色版.zip 【免安裝,直接解壓執行】-CSDN下載  http://download.csdn.net/download/chenchunlin526/10029995




三、反編譯工具JD-GUI的使用

作為一個軟體開發人員,在自學的成長道路上,不可避免的會借鑑別人開發完成的功能實現方法,js/css/html可以通過瀏覽器直接捕獲,沒有原始碼的能拿到calss檔案也是一件幸事,那麼如何檢視class檔案呢?這就要用到反編譯工具了。

① JD-GUI這款Java反編譯工具是純綠色,完全免費的,非常適合開發者,其介面也簡潔大方


② 滑鼠單擊“file”從中選擇“Open File ...“選項,彈出一個檔案選擇框,可以選擇要開啟的檔案,或者直接單擊資料夾圖示,直接彈出檔案選擇框


③ 從開啟的檔案的左側可以看到檔案的儲存位置,類及方法,右側顯示類的具體內容,註釋不會顯示,同時它會把這個類所在的包下的其他類也反編譯成原始碼:


如需將預覽的.class檔案轉換成.java檔案,只需點選File選單裡的save即可。


④ 還有一種方法是直接開啟jar包,滑鼠單擊資料夾圖示,彈出檔案選擇框,選擇一個jar包,單擊‘確定’


⑤ 從開啟的介面中可以看到整個jar包中的.class檔案的反編譯結果




順便說一下XJad 的使用使用方法和JD-GUI都差不多),雖然版本比較老,且官方10多年沒更新了,算是已經放棄了。

不過也可以可用:

使用說明:
========
1、開啟一個或者多個*.class檔案,XJad反編譯後,重新命名為*.java檔案,
儲存至當前資料夾,並在編輯器中開啟檢視;
2、開啟一個資料夾,XJad將該資料夾下所有*.class檔案進行反編譯,並儲存至該資料夾下,
依據包路徑資訊生成資料夾路徑,如com.spring.framework.*,
將建立com\spring\framework的資料夾結構;
3、開啟一個*.jar檔案,XJad將該Jar檔案中的所有*.class檔案解壓縮到臨時目錄並進行反編譯,
並將原始檔帶包路徑資訊儲存至當前資料夾下名稱為“~” + *.jar 的資料夾中;

① 單個檔案反編譯


反編譯好之後,會在原來的.class所在資料夾下生成一個同名的.java原始碼檔案:

且XJad會自動開啟反編譯後生成的原始碼檔案:


② 整個資料夾反編譯,可以選擇一個資料夾,XJad會把該資料夾下的所有.class檔案全部反編譯好。
比如,我的D盤新建一個資料夾,FindPassword,裡面只有個FindPasswordController.class檔案

然後選擇 反編譯資料夾:


確定之後:

提示已經反編譯成功,我們現在到 D:\FindPassword 裡檢視,裡面已經生成了一個按層次結構排行的原始碼檔案包了


點進去看一下,資料夾裡有剛反編譯好的原始碼檔案了:


記事本開啟看一下,原始碼正常,只是沒有了註釋了


③ jar包反編譯


確定之後

反編譯之後,會在jar包所在的檔案下,生成一個以“~”開頭的原始碼資料夾:

開啟進去看一下:


好了,JD-GUI 和 XJad的使用介紹到此介紹了。

----------------------

工具下載:

1、JD-GUI(Java反編譯工具) 0.3.6 綠色免費版.zip-CSDN下載  http://download.csdn.net/download/chenchunlin526/10024535


2、Java反編譯工具(XJad) v2.2 中文綠色版.zip 【免安裝,直接解壓執行】-CSDN下載  http://download.csdn.net/download/chenchunlin526/10029995




相關文章