Android 反編譯指南

Binguner發表於2019-02-06

我們下載到的 App 安裝包是 Apk 檔案(Android Application Package) 。通過 Apk 檔案,我們也可以得到這個應用的程式碼和資原始檔,對應用進行修改。

那麼我們如何獲取這些檔案呢?這就需要 Android 反編譯技術

01 所需要的軟體

  • Apktool 反編譯 xml 檔案和 dex 檔案,並可以將編譯後的專案重新打包成 apk。 官方下載地址: Apktool 官方的速度有時候不穩定,也可以從我的網盤中下載: 連結 密碼:xkao

  • dex2jar 將 classes.dex 轉換為「.jar」檔案) 官方下載地址: dex2jar 我的網盤: 連結 密碼:xkao

  • jd-gui 檢視「.jar」檔案 官方下載地址: jd-gui 我的網盤: 連結 密碼:xkao

02 Apktool

我們可以通過 Apktool 可以將 apk 檔案進行反編譯,但是直接把 apk 的副檔名改成「.zip」也可以對其進行解壓並得到一些資原始檔。

直接解壓和使用 Apktool 的區別

  • META-INF 裡儲存 App 的簽名資訊
  • classes.dex
    .dex 是 Dalvik 虛擬機器上的可執行檔案,需要使用 dex2jar 將其轉換為 jar 檔案
  • AndroidManifest.xml Android 清單檔案,向 Android 系統提供應用的必要資訊。
  • assets 存放一些資原始檔字型,聲音等。
  • lib 存放第三方庫
  • original 存放未經過反編譯的等 AndroidManifest.xml 檔案
  • res 存放資原始檔,例如圖片,顏色,字元等。
  • smali smali 裡存放的是 java 編譯成的 smali 程式碼,smali 相當於 Android 虛擬機器上執行的語言。

直接解壓可以得到一些資原始檔,但是 AndroidManifest.xml 和其他的 xml 檔案都是亂碼,通過 Apktool 進行反編譯,可以最大限度的還原這些檔案的內容。

02 - 1 安裝 Apktool

Windows :

  • 到 這裡 或者我的 網盤連結 裡下載好 script 指令碼檔案,修改名稱**「apktool.bat」**(如果從我的網盤下載,無須修改名稱)
  • 到 這裡 或者我的 網盤連結 下載 apktool,然後修改名稱為**「apktool.jar」**

  • 將**「apktool.jar」「apktool.bat」**移動到 windows 目錄(一般在 C://windwos 下)

  • 在命令列中輸入

$ apktool
複製程式碼

如果出現

Android 反編譯指南

則說明安裝成功,若沒有出現,則需要把「apktool.jar」、「apktool.bat」的路徑新增到系統的環境變數中。

Mac OS:

  • 到 這裡 或者我的 網盤連結 裡下載好 script 指令碼檔案,修改名稱**「apktool」**(如果從我的網盤下載,無須修改名稱) 。

  • 到 這裡 或者我的 網盤連結 下載 apktool,然後修改名稱為**「apktool.jar」**。

  • 把**「apktool」「apktool.jar」**移動到 /usr/local/bin目錄下

  • 在命令列中 cd 到 /usr/local/bin中然後分別輸入下面兩條命令

$ chmod a+x d2j_invoke.sh
$ chmod a+x d2j-dex2jar.sh
複製程式碼
  • 在命令列中輸入
$ apktool
複製程式碼

出現

Android 反編譯指南

則安裝成功

02 - 2 反編譯 Apk

  • cd 到 apk 的目錄下
  • 輸入
$ apktool d test.apk
複製程式碼

Android 反編譯指南

執行完成後,得到一個包含資原始檔和程式碼的檔案:

Android 反編譯指南

注意: 此時 dex 檔案直接反編譯成了 smali 檔案,而我們需要的是 .dex 檔案。

此時再執行:

$ apktool d -s -f test.apk
複製程式碼

-d 反編譯 apk 檔案

-s 不反編譯 dex 檔案,而是將其保留

-f 如果目標資料夾存在,則刪除後重新反編譯

此時得到這樣的資料夾:

Android 反編譯指南

02 - 3 打包、簽名新的 Apk

為了演示如何將修改過後的 Apk 檔案重新打包簽名,我寫了一個簡單的 Demo:把 Demo 的背景換了之後,進行打包、簽名。

這是初始應用程式的執行效果:

Android 反編譯指南

  • 使用 Apktool 反編譯

Android 反編譯指南

  • 開啟生成的目錄進行修改 修改 bg.jpg 為另一張準備好的圖片(注意前後命名一致)。

Android 反編譯指南

  • 重新打包
$ apktool b b_test -o newtest.apk
複製程式碼

-b 是指 build b_test 是剛才反編譯出的檔案所在的目錄 -o 用於指定新的檔名稱,這裡指定為「newtest.apk」

Android 反編譯指南

  • 得到新的 apk 檔案

Android 反編譯指南

注意: 此時的 apk 檔案是不能安裝的,還需要對其進行簽名。

  • 對新的 Apk 進行簽名:
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore testjks -storepass password newtest.apk aliasName
複製程式碼

簽名檔案是我自己生成的,沒有辦法使用 Apk 原來的簽名進行簽名。

Android 反編譯指南

現在將 Apk 安裝一下試試看:

Android 反編譯指南

可以看到,背景資源已經成功替換成我們設定的第二張圖片了。

03 dex2jar

下載、解壓好 dex2jar

  • 將上一步得到的 classes.dex 檔案(有時候還有 classes2.dex,說明方法數過多,把它當成 classes.dex 處理就好了)複製到 dex2jar 解壓好的目錄中。

  • 在命令列中執行:

$ sh d2j-dex2jar.sh classes.dex
複製程式碼

如果提示:

d2j-dex2jar.sh: line 36: ./d2j_invoke.sh: Permission denied
複製程式碼

執行

$ sudo chmod +x d2j_invoke.sh
複製程式碼

後再次執行

$ sh d2j-dex2jar.sh classes.dex
複製程式碼

Android 反編譯指南

執行成功,在當前目錄下生成了 classes-dex2jar.jar 檔案。

04 jd-gui

安裝好 jd-gui 之後,用其將 classes-dex2jar.jar 開啟,就可以看到反編譯出來的 java 程式碼了!

Android 反編譯指南

這裡的程式碼沒有經過混淆,所以命名容易識別,如果是從應用市場下載下來的 apk 檔案,反編譯出來的程式碼大部分是混淆過後的程式碼。

出於對開發者的尊重和為了保持應用的穩定,希望大家不要隨意修改別人的應用程式,請僅從技術層面上妥善利用這一技術!

歡迎關注本文作者:

Android 反編譯指南

掃碼關注並回復「乾貨」,獲取我整理的千G Android、iOS、JavaWeb、大資料、人工智慧等學習資源。

相關文章