android 反編譯方法、工具介紹

網上有很多的反編譯文章,個人認爲寫的比較好的文章有  https://www.cnblogs.com/hayha/p/6848474.html 。我也是參考其文章來的,本人寫此文章目的、以及反編譯運用場景 主要有以下幾方面:

  • 記錄反編譯的方法,方便自己用的時候比較方便,起到記錄的作用;
  • 運用場景:排查混淆問題,反編譯apk,看類是否被混淆;
  • 運用場景:查看jar的代碼,以及是否被打入apk中;
  • 運用場景:其他需要反編譯的時候;
  • 運用場景:某個技術點想參考別的app,或者研究競爭對手的app等等;(注意:不要用於非法事情)

反編譯步驟

工具準備

apktool —— 官方下載 ,其作用是拿到apk 中的dex文件;(可選工具,非必須)

dex2jar——  官方下載,見名知意,就是把dex轉化爲jar文件,這是最關鍵的一步;

gui ——  官方下載,這是一個圖形化工具,查看jar裏面的代碼。(非必需,有其他可替代工具)

 

總結:大致就三步,第一:從apk文件中拿到dex文件;第二:把dex文件轉化爲jar包文件;第三:查看jar文件中代碼;

一:從apk到dex文件

從apk到dex,可以利用jartool ,當然有替代方法:就是解壓軟件直接解壓,這種方式最快,最省事,和jartool 沒有區別。

上面兩圖介紹瞭解壓軟件解壓apk後的解壓產物,可以拿到dex文件。

通過jartool 方式

基本命令: java -jar apktool.jar  d  待解壓的apk 

// 注意`apktool.jar`是剛纔下載後的jar的名稱,`d`參數表示decode
// 在這個命令後面還可以添加像`-o -s`之類的參數,例如
// java -jar apktool.jar d yourApkFile.apk -o destiantionDir -s 
// 幾個主要的參數設置方法及其含義:
-f 如果目標文件夾已存在,強制刪除現有文件夾
-o 指定反編譯的目標文件夾的名稱(默認會將文件輸出到以Apk文件名命名的文件夾中)
-s 保留classes.dex文件(默認會將dex文件解碼成smali文件)
-r 保留resources.arsc文件(默認會將resources.arsc解碼成具體的資源文件)

示例:

apktool.jar 和 apk放在同一個目錄下

 

最後,我們可以看到解壓後文件爲:

 dos命令行截圖中一共運行了兩個jar命令,第二個命令是 解壓app-debug.apk 文件到app-debug-1文件夾,並保持dex文件 。另外,現在app爲了突破最大方法數量限制,用了多dex 方式,所以這裏apk內部可能會有多個dex文件。

這裏,後續還可以研究下,apk文件由什麼組成,各部分代表什麼。這裏,參考一下其他的博主介紹

我們已經得到一個可以用文本編輯器打開的閱讀的AndroidManifest.xml文件、assets文件夾、res文件夾、smali文件夾等等。original文件夾是原始的AndroidManifest.xml文件,res文件夾是反編譯出來的所有資源,smali文件夾是反編譯出來的代碼。注意,smali文件夾下面,結構和我們的源代碼的package一模一樣,只不過換成了smali語言。它有點類似於彙編的語法,是Android虛擬機所使用的寄存器語言。

這時,我們已經可以文本編輯器打開AndroidManifest.xml文件和res下面的layout文件了。這樣,我們就可以查看到這個Apk文件的package包名、Activity組件、程序所需要的權限、xml佈局、圖標等等信息。其實我們把Apk上傳到應用市場時,應用市場也會通過類似的方式解析我們的apk。

note1:其實還有一種方法,可以省去每次解包時,都要輸入java -jar apktool.jar xxx這行命令,官網也有說明,就是將這個命令包裝成shell腳本,方法見:https://ibotpeaches.github.io/Apktool/install/ 。而這個shell的腳本在有些博客裏介紹是 jartool.bat 文件,其實其作用就是上面的說的。

二、 從dex到jar 

這一步是最重要的,需要dex2jar工具,

接下來,我們把第一步獲取的dex文件放到 剛剛解壓的文件中,然後運行命令:

d2j-dex2jar classes.dex classes2.dex 

 

會得到jar 文件,見上面的截圖中紅色框框。

第三步:用gui 圖形化工具查看代碼

 下載好工具後,雙擊exe文件,然後把jar文件拖入其中即可。

 

最後,我把這三個工具統一壓縮上傳一下,方便其他人吧(資源還在審覈中...過了加上鍊接地址)。

其他想說的

還有其他的反編譯工具,比如之前說的博客裏也有介紹,試過一些,不太好用;還有一些python寫的腳本之類的,沒有試過,有興趣的可以看看。另外,這種方式的反編譯對混淆過的apk還是無能爲力,因爲沒有解析過mapping文件,所以混淆過的反編譯對於這種方式反編譯不夠完美。後續誰有比較好的方式針對混淆過的apk文件,歡迎指出,謝謝。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章