對於反編譯一直持有無所謂有或無的態度。經過昨天一下午的嘗試,也有了點心得和體會:
先給大家看看編譯的過程和我們反編譯的過程概圖吧:
例如以下是反編譯工具的根文件夾結構:
三個目錄也實際上是下面三個步驟的體現:
(不知道大家發現沒,我把三個文件夾名字都改了一下,apktool即為處理apk的工具;dex2jar即就是將dex文件處理為jar包的工具。jar2gui即就是我們將jar包內的class轉換為源代碼的gui界面以供大家參考的工具)
setp 1: 在apktool里:
打開dos框(cmd進入然后進入該文件夾下。這個應該都是婦孺皆知的事情了)運行 apktool d -s xxx.apk
這里會在該文件夾下生成一個以apk名為名字的文件夾,有classes.dex+res文件夾+AndroidManifest.xml 這三個東西,想必大家已經懂得了當中的內涵,沒錯。這就是我們的項目根文件夾。而dex即就是由jar打包而成的Android可運行文件。
/*
*命令里的apktool 事實上也就是在運行文件夾下的apktool.bat批處理文件,而后邊的xxx.apk也就是我們所須要反編譯的apk包的名稱。
當然啦,常常使用dos命令的人都直到,文件名稱或者路徑都能夠使用其絕對路徑予以取代,因此假設我們把我們須要反編譯的包放到當前根文件夾下,即能夠直接試用其名稱來運行命令
*/
setp 2: 在dex2jar里
將1中生成的classes.dex(即就是Android下的可運行文件,由一簇一簇的.class文件jar包生成)拷入dex2jar下
運行 dex2jar classes.dex --->生成jar包。即就是classses_dex2jar.jar
setp 3:在jar2gui下執行jd-gui選中2中的jar,就可以查看源代碼(這里是真源代碼)。
既然上邊提到“真源代碼”這個概念。相相應的必定就會有偽源代碼(純屬本人造詞,如有雷同,你猜呢?哈哈,開玩笑的)
這里再上一圖
上圖左側即就是我們用setp 3達到的效果,而右側即就是我們通過jad工具反編譯class文件出來的java源文件。通過對照非常明顯讓人得出一個極為蛋疼的結論。反編譯出來的東東簡直目不忍視啊·······。當然啦。左側的代碼是能夠直接拷貝出來的。可是假設你想要生成源代碼來編譯的話。還請三思~~~畢竟我們反編譯出來一個是要使用res資源,還有一個是參考代碼,假設想要破解原apk的話,相信還有辦法反編譯出更好的源代碼(用工具進行代碼復制,這樣盡管本質上並沒有對class進行反編譯。但卻得到了相對准確的源代碼)
詳細使用jad工具來反編譯的話。我就不繼續寫了,詳細教程寫在工具包的README.text文本里了,歡迎大家下載: