反編譯Android APK詳細操作指南[ApkTool,dex2jar,JD-GUI](Mac)

CrazyCodeBoy發表於2018-05-11

早在4年前我曾發表過一篇關於《Android開發之反編譯與防止反編譯》的文章,在該文章中我對如何在Windows平臺反編譯APK做了講解,如今用Mac系統的同學越來越多,也有很多朋友問我能否出一篇關於如何在Mac平臺上反編譯APK的文章,今天呢我就抽時間來寫一下在Mac平臺上如何反編譯APK,希望對感興趣的同學能有學幫助。

在開始講解反編譯之前呢,我們先來掃個盲:

什麼是APK?

APK的全程是Android application package,是Android的應用程式包,平時我們安裝Android應用的時候需要將APK檔案下載到本地然後安裝,Android系統會將其識別為Android應用包。另外,需要指出的是APK 其實是一個基於 ZIP 檔案格式的檔案,所以支援你用解壓軟體將其解壓,當你將APK檔案解壓之後你會看到如下檔案:

APK檔案結構

  • .dex程式碼檔案:它是classes檔案通過DEX編譯後的檔案格式,用於在Dalvik虛擬機器上執行的主要程式碼部分;
  • resources 資原始檔:以resources以及res目錄為代表的Android程式中所需要的一些資源,如圖片資源,顏色資源,字串,佈局等;
  • assets檔案:assets目錄下存放的是原生資原始檔,比如在裡面存放字型,鈴聲等;
  • manifest清單檔案:以AndroidManifest.xml為代表的Android清單檔案,清單檔案向 Android 系統提供應用的必要資訊,系統必須具有這些資訊方可執行應用的任何程式碼。

瞭解過,APK的之後,接下來就給大家介紹反編譯一個APK所需要那些工具:

反編譯一個APK需要那些工具?

無論是在Windows平臺還是在Mac平臺,反編譯APK都離不了ApkTool、dex2jar、JD-GUI 這三種工具,那麼這三種工具都是做什麼用的呢?

  • ApkTool:是一款應用在Apk上的逆向工程的工具,它有編譯、反編譯、簽名等功能,在這篇文章中會講解如何利用ApkTool檢視apk的xml檔案、AndroidManifest.xml和圖片等。
  • dex2jar:顧名思義,這款工具的作用主要是將dex檔案轉換成jar檔案,轉換成jar後我們才好藉助JD-GUI來檢視反編譯dex後的程式碼;
  • JD-GUI:一款Java反編譯器GUI,通過它我們能檢視到反編譯後的dex的程式碼,通常需要配合dex2jar使用;

準備工作(安裝ApkTool、dex2jar、JD-GUI的具體流程)

介紹過ApkTool、dex2jar、JD-GUI 的作用後,接下來我們做一些反編譯前的準備工作,首先呢我們需要安裝ApkTool。

ApkTool

下載ApkTool

大家可以從ibotpeaches.github.io/Apktool/ins…上下載ApkTool,也可以下載我為大家準備好的ApkTool、dex2jar、JD-GUI

安裝ApkTool

  1. 將下載好的apktool檔案與apktool_2.3.1.jar檔案準備好,並將apktool_2.3.1.jar更名為apktool.jar
  2. apktool.jarapktool移動到/usr/local/bin目錄下(可以通過在終端中輸出命令open /usr/local/bin來開啟這個目錄);
  3. 為上述兩個檔案增加可執行許可權,即在終端中輸入並執行:
    chmod +x apktool.jar
    chmod +x apktool
    複製程式碼
  4. 在終端輸入apktool看是否可以執行,如果不可以需要在系統偏好設定中開啟安全與隱私中點選仍要執行apktool.jar;

至此ApkTool的安裝便完成了,在終端執行apktool命令會看到如下輸出:

apktool

dex2jar

下載dex2jar

大家可以從sourceforge.net/projects/de…上下載dex2jar,也可以下載我為大家準備好的ApkTool、dex2jar、JD-GUI。 下載後直接解壓即可。

JD-GUI

下載JD-GUI

大家可以從jd.benow.ca/上下載JD-GUI,也可以下載我為大家準備好的ApkTool、dex2jar、JD-GUI

使用ApkTool反編譯APK得到xml檔案、AndroidManifest.xml和圖片

cd /你存放apk的目錄或在下面命令中使用xxx.apk檔案的絕對路徑
apktool d xxx.apk //該命令執行後會在同級目錄下生成一個與你編譯的apk同名的目錄
複製程式碼

通過上述命令就可以反編譯apk了。

apktool d

然後在反編譯後生成的目錄中你會看到相關的資原始檔:

apktool反編譯

由於APkTool只能將資原始檔提取處理,對於.dex型別的檔案是無法檢視的,這裡就需要用到dex2jar了。

dex2jar將dex反編譯成jar

第一步,解壓apk獲得dex檔案

使用解壓軟體將apk進行解壓:

unzip-apk.png

也可將apk檔案的字尾改為.rar然後雙擊進行快速解壓。

使用解壓軟體開啟apk 和使用apktool反編譯出的apk不同

  • 直接解壓apk和使用apktool反編譯apk都能獲得AndroidManifest.xml,但直接解壓獲得的AndroidManifest.xml是亂碼的,無法直接檢視;
  • 直接解壓apk獲得res資原始檔是不包含resources.arsc部分的,而使用apktool反編譯出來的res是包含的;

apktool-unzip.png

從上圖中可以看到有2個classes.dex檔案(這是因為應用了MultiDex所致)這就是專案的原始碼 將這個兩個檔案拷貝到下載解壓的dex2jar目錄下:

classes.dex.png

然後執行如下程式碼進行反編譯:

cd /你的dex2jar解壓目錄 也就是上面圖中存放class.dex檔案的目錄
sh d2j-dex2jar.sh classes.dex
sh d2j-dex2jar.sh classes2.dex
複製程式碼

通過上述命令會得到兩個.jar檔案:

classes-dex2jar.jar

使用JD-GUI檢視反編譯後的程式原始碼

將dex轉換成jar之後接下來我們就可以使用JD-GUI來檢視反編譯後的程式原始碼了:

操作步驟很簡單,只需雙擊執行jd-gui-1.4.0.jar,然後將classes-dex2jar.jar拖拽到JD-GUI介面上即可:

jd-gui

FAQ

Permission denied d2j_invoke.sh

為d2j_invoke.sh增加許可權:

sudo chmod +x d2j_invoke.sh //sudo chmod +取消許可權
複製程式碼

Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file

Apktool的bug使用其他版本的Apktool,我在使用apktool_2.3.3.jar中遇到了這個問題,使用如apktool_2.3.1.jar是好的,如果你也遇到了這個問題不妨換個Apktool版本試一下。

Exception in thread "main"

參考

相關文章