android反編譯工具總結

DM--Tutor發表於2012-09-08
序:
總結反編譯主要的目的在於學習。利用反編譯進行相關的漢化或修改,都是不道德的!

大家都知道,將apk檔案解壓後有兩部分檔案需要處理,一種是xml檔案,另一種一個dex檔案(.dex),我們可以從.dex檔案中得到.class,利用後者再得到大家垂涎已久的java檔案。
下面分別針對這三種格式的檔案進行反編譯處理;
1.對xml檔案進行包的解析,一般有兩種方式:apktool(推薦)和AXMLPrinter2.jar;
2.從dex到class公認dex2jar.bat,實現反編譯;公認的強者;
3.而class到java的方式要更多樣化一些,因為只是檢視反編譯後的程式碼:jd-gui(推薦),Jodeclipse(Jode的Eclipse外掛),JadClipse(Jad的Eclipse外掛)。

還是作個大致介紹吧:
1.首先把apk檔案改名為.zip,然後解壓縮其中的class.dex檔案,它就是java檔案編譯再通過dx工具打包成的。
2.把class.dex拷貝到dex2jar.bat所在目錄。執行dex2jar.bat class.dex,生成classes.dex.dex2jar.jar。
3.執行JD-GUI工具(綠色軟體,好用的軟體!),開啟上面的jar檔案,即可看到java原始碼。
如果上面的步驟都可以自我完成了,那麼,下面內容就可忽略不看了!

這幾個軟體,細分開來介紹(用步驟A(分A1,A2), B, C(分C1,C2,C3), ABC分別代表三個不同的步驟):
A1. apktool:
通常用於生成程式的原始碼和圖片、XML配置、語言資源等檔案。我們對圖片和語言資源等檔案修改後,可以再把它們編譯打包成APK,簽名後就是手機可以安裝的本地化/修正版APK了。支援Linux 、Windows下工作
安裝步驟:
1.安裝JAVA環境(官方推薦jdk 1.6);
2.下載apktool.jar:http://code.google.com/p/android-apktool/downloads/list
點選下載apktool1.3.2.tar.bz2  和apktool-install-windows-2.2_r01-3.tar.bz2 (不一定是這個,但最好選最新版本的吧!)
3.解壓apktool1.3.2.tar.bz2得到apktool.jar;
解壓apktool-install-windows.zip到任意資料夾,將apktool.jar拷入此資料夾中(也有人說是直接全部拷入C:/Windows,一樣的);
(目前此資料夾中有三個檔案:apktool.jar/apktool.bat/aapt.exe)
4.cmd命令列進入到解壓apktool-install-windows-2.2_r01-3.tar.bz2所得的資料夾,輸入apktool測試是否安裝成功;
安裝成功後,下面開始反編譯過程:
1.apktool d (要反編譯的檔案) (輸出資料夾)
如:
apktool d XXX.apk (目標資料夾)      反編譯 geek.apk到資料夾test
2.apktool b (目標資料夾)              
從目標資料夾中重建APK,生成的APK在"目標資料夾"\dist資料夾裡,叫out.apk。
這個out.apk是沒有簽名的,所以不能直接裝到手機裡。簽名工具和方法見http://www.hiapk.com/bbs/thread-21261-1-1.html,這裡就不說了。簽名後得到的APK,就是可以裝到手機裡的了。
A2. AXMLPrinter2.jar
將它放到android-sdk-windows-1.5_r3\tools資料夾中
執行cmd,進入tools目錄,執行java -jar AXMLPrinter2.jar main.xml > main.txt;
於是我們就得到了反編譯後的XML檔案;
經歷了這麼多,我們得到的只是部分佈局檔案和資原始檔,但java檔案還是"猶抱琵琶半遮面"。

下面,讓我們掀起她的紅蓋頭來: 

B. dex2jar
下載:http://code.google.com/p/dex2jar/downloads/list 
方法:
1.首先找到Android軟體安裝包中的classes.dex (解壓得到);
它就是java檔案編譯再通過dx工具打包成的,所以現在我們就用上述提到的2個工具來逆方向匯出java原始檔
2.把classes.dex拷貝到dex2jar.bat所在目錄;
在命令列模式下定位到dex2jar.bat所在目錄,執行 dex2jar.bat classes.dex
,生成classes.dex.dex2jar.jar,成功了一半!

C1. JD-GUI
下載:http://java.decompiler.free.fr/?q=jdgui
方便好用,直接解壓得到JD-GUI,用它開啟上面的jar檔案,File-->Save JAR Source,即可看到夢寐以求的java原始碼;
我們也可以解壓B步驟得到的jar檔案得到class檔案,到這裡,我們就要用到Jodeclipse和JadClipse了;
C2. Jodeclipse---Jode的Eclipse外掛
C3. JadClipse---Jad的Eclipse外掛
關於這兩個Eclipse外掛的安裝可見下面連結:
http://tgyd2006.javaeye.com/blog/553061
(C4. 還有朋友提到DJ Java Decompiler,沒用過,可以一試!)
但也有人提出此問題:
自從eclipse升級到3.3以後jad外掛就一直沒有成功的安裝上去,網上看了好多文章也是以前版本的安裝方法,3.3目前通過eclipse的software update的外掛安裝方式已經不行了。 
解決方法如下: 
1.從http://www.kpdus.com/jad.html#download地址下載最新的jad,我目前下載的是jadnt158.zip; 
2.從http://nchc.dl.sourceforge.net/s ... jadclipse_3.3.0.jar地址下載jadclipse_3.3.0.jar,拷貝到eclipse的plugins目錄下;
3.啟動或重起eclipse,修改window -> Preferences -> Java -> JadClipse 下的 
Path to decompiler 如:D:\eric\jadnt158\jad.exe(jadnt158.zip解壓後的目錄); 
4.Windows -> Perference -> General -> Editors -> File Associations中修改“*.class”預設關聯的編輯器為“JadClipse Class File Viewer” 
大功告成,之後在java類裡按住ctrl點選類就可以看到它jad反編譯後的源帶碼了;
如果發現安裝了沒有效果,可以刪除eclipse主目錄下的\configuration\org.eclipse.update後,再執行eclipse -clean試試

最後,將得到的java檔案和得到的xml檔案組合可得一個android工程,即可得到相對比較完整的apk原始碼;但也有些額外加的包沒被編譯出來。
但做到這一步已經足夠用於學習,我們的目的也就達到了!
大家也可關注下這兩篇文章,用的不同方法(dexdump, baksmali.jar, smali.jar),但效果也還不錯:
http://blog.csdn.net/Android_Tutor/archive/2010/07/09/5724435.aspx
http://www.cnblogs.com/huyipeng/archive/2010/07/25/1784679.html
有人會說程式可以用混淆器擾亂程式碼,但剛從網上看到的一種關於混淆器的說法:
“用混擾器的程式碼一般就是去掉所有註釋和把變數名、方法名和類名變成一些沒意義的名字。反編譯後一般都變成a, b , c,...這樣的名字,只能一點點的看懂,再利用Eclipse的改名方法,一次性的吧相關的名字改成有意義的名稱。”
所以,大家的關鍵程式碼最好還是打成.so庫吧!要不會被一些人搞得內褲都沒得穿!

相關文章