1. 程式人生 > >Mac下反編譯和重新編譯打包APK

Mac下反編譯和重新編譯打包APK

反編譯APK需要的工具如下:
- dex2jar 這個工具用於將dex檔案轉換成jar檔案
下載地址:http://sourceforge.net/projects/dex2jar/files/
- apktool 這個工具用於最大幅度地還原APK檔案中的9-patch圖片、佈局、字串等等一系列的資源。
下載地址:http://ibotpeaches.github.io/Apktool/install/
- jd-gui 這個工具用於將jar檔案轉換成java程式碼
下載地址:http://jd.benow.ca/
在上面的網址中可以下載最新版本的工具。有些工具舊了,反編譯過程可能會失敗,所以建議保持最新的工具版本。
其中apktool和jd-gui有點和諧,所以我將它們打包放到了CSDN伺服器。

點選下載

反編譯程式碼

  1. 解壓dex2jar壓縮包。
  2. 終端中cd命令到dex2jar目錄。
  3. 將apk檔案改字尾apk為zip,將其中的classes.dex檔案拷貝到dex2jar目錄
  4. 在終端執行./d2j-dex2jar.sh classes.dex (出現Permission Denied異常,是哪個檔案報的就改哪個檔案的許可權。比如我這裡出現的是d2j_invoke.sh,修改許可權即可:chmod 777 d2j_invoke.sh)
  5. 這樣反編譯程式碼成功,目錄中會生成一個classes-dex2jar.jar檔案,將這個檔案用jd-gui開啟,即可看到原始碼(可能給是混淆過的)。
    dex2jar

反編譯資源

  1. 下載好apktool和apktool.jar(最新2.1.0)之後,將其拷貝到/usr/local/bin目錄(如果有root許可權)。
  2. chmod 保證apktool命令不會出現Permission Denied
  3. apktool d /xx/xx.apk
    apktool
    完成!這樣閱讀Manifest.xml以及drawable或anim中的xml檔案不會是混淆的亂碼了。

上圖反編譯過程中,會在/Users/dengpan/Library/apktool/framework/ 目錄中生成一個1.apk的快取檔案,有時反編譯失敗,刪除它再試試。

注意:當前terminal終端在哪個目錄,那麼apktool反編譯的資源目錄就在哪個目錄下。

其中d是decode的意思,表示我們要對xx.apk這個檔案進行解碼。那除了這個基本用法之外,我們還可以再加上一些附加引數來控制decode的更多行為
- -f 如果目標資料夾已存在,則強制刪除現有資料夾(預設如果目標資料夾已存在,則解碼失敗)。
- -o 指定解碼目標資料夾的名稱(預設使用APK檔案的名字來命名目標資料夾)。
- -s 不反編譯dex檔案,也就是說classes.dex檔案會被保留(預設會將dex檔案解碼成smali檔案)。
- -r 不反編譯資原始檔,也就是說resources.arsc檔案會被保留(預設會將resources.arsc解碼成具體的資原始檔)。

重新打包

  1. 在剛反編譯的目錄,執行命令apktool b app-release -o app-release1.apk 即將反編譯出來的檔案重新在當前目錄打包成了新的apk,這apk是未簽名的,不能安裝到機器上(提示解析包錯誤)。
    apktool-b
  2. 使用命令jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 簽名檔名 -storepass 簽名密碼 待簽名的APK檔名 簽名的別名 給apk簽名。
    jarsigner
  3. 對齊APK。Android官方建議打包簽名後apk進行一個對齊操作。將export PATH=${PATH}:/xxx/build-tools/23.0.2 新增到自己使用者目錄的.bash_profile中。然後執行zipalign 4 app-release1.apk app-release-align.apk