使用jad對絕大部分的加密混淆class文件都能很好的做到反編譯,目前大象還沒遇到失敗的情況,大家也可以多測試一下。
現在有人會說了,這樣一個一個的看太麻煩了,我需要一次把一個JAR包下的所有class文件反編譯成java源文件。這樣的想法是可行的,還是使用jad工具。
3、批量反編譯
因為之前我們已經將jad加入到了%JAVA_HOME%\bin中,只要配置了環境變量,我們就可以在命令行中方便的使用。在這里,大象還是以dom4j-1.6.1.jar為例來說明具體的操作步驟。
解壓dom4j-1.6.1.jar和jaxen-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/**/*.class:org是解壓后的文件夾的名字,整個表示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目錄下,和反編譯所得的包處在同一層。
<?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元素中,src和dest這兩個屬性表示著路徑。如果反編譯后,src目錄下,有多個不同的文件夾,這時使用ant來轉換編碼,請先想好要對哪些文件進行反編碼;如果按上面的寫法,將會把src目錄下的所有文件夾中的所有文件進行反編碼。假設,現在有com和org兩個文件夾(其實是兩個包),我只需要對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