天天看點

Apktool反編譯APKApktool反編譯APK

目錄

      • 目錄
  • Apktool反編譯APK
    • what is apk
    • Introduction to Apktool
      • 反編譯apk
      • 反編譯後重新打包
      • 問題

Apktool反編譯APK

what is apk?

apk檔案本身是zip包,解壓縮後可看到如下結構的檔案。但以下檔案是加密/編譯的,無法檢視:

  1. manifest.xml 程式全局配置檔案,含apk包名、管道号、版本号等資訊
  2. classes.dex java代碼編譯後的Dalvik位元組碼
  3. resources.arsc 編譯後的二進制資源檔案(文字、顯示相關的xml檔案)

    ( 注:好搜APK解壓縮後,除了values外的其它資源檔案都可直接檢視。這也是常用的竊取别人app圖檔資源的方法o(∩_∩)o )

    Apktool反編譯APKApktool反編譯APK

    這時反編譯工具就派上用場了,不需原代碼,就可以更改配置、圖示、版本号、管道号、包名等資訊,換湯不換藥重新打包。再深入點可以一探究竟apk内部代碼結構,嘗試修改源代碼後重新打包。

    Apktool是開源的第三方反編譯project,曾由google code托管,現已遷移到github。其它反編譯工具大多基于Apktool二次開發。Apktool代碼下載下傳

Introduction to Apktool

點此前往Apktool官網下載下傳、安裝說明頁(注意: Apktool 2.x必須用Java 1.7,機子上之前裝1.8,最好解除安裝掉再重裝1.7)

配好java環境變量、并将“apktool.jar&apktool.bat所在檔案夾路徑”加到系統環境變量path,cmd下執行apktool 傳回說明即安裝ok~

Apktool反編譯APKApktool反編譯APK

反編譯apk

以好搜APK為例分析反編譯、修改資訊後重新打包的過程。

apktool d指令即apktool decode,不指定輸出dir,預設反編譯後輸出的同名檔案夾儲存在C:\Users\user_name下。

若dir下有檔案會報錯,需用-f強行清空目标檔案夾。

反編譯log資訊如下:

Apktool反編譯APKApktool反編譯APK

其中有個關于.9圖的warning,設計人員為了美觀一般将.9圖四周的黑線去掉了,是以apktool校驗是否是.9圖時發現異常,可忽略。

觀察反編譯的檔案夾與之前解壓縮檔案夾對比如下:

Apktool反編譯APKApktool反編譯APK

可以看出classes.dex和resources.arsc都被反編譯了。細節如下圖:

Apktool反編譯APKApktool反編譯APK

1) classes.dex二進制代碼檔案被反編譯成了smali檔案

apktool d 預設輸出的代碼檔案字尾是.smali,需用-d指令輸出java檔案,這樣便于導入eclipse進行調試修改。

反編譯後.java代碼并不是真正的java文法代碼,而是dex檔案反彙編後文法較寬松的smali代碼。導入eclipse進行調試,感興趣者可搜尋smali相關介紹。

2) resources.arsc反編譯後的values檔案放res下

文本字元串、顔色設定以及其它顯示相關的xml配置檔案都可見了。

3)原有的含工程簽名、證書等資訊的META-INF檔案夾以及原始加密的manifest.xml被copy到original檔案夾下

這是因為apktool 2.x反編譯後再rebuild出來的是unsigned apk,重新打包時不含META-INF檔案夾。(防止apk被惡意篡改,若需更改apk資訊再重新打包,就要重新簽名)

反編譯後重新打包

更改反編譯得到的檔案後,往往目的是為了重新打包。

apktool重新打包反編譯檔案夾指令:

apktool b <dir> -o new.apk
           

build過程如下:

Apktool反編譯APKApktool反編譯APK

由于未簽名,新包用adb install 安裝失敗,提示Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

後續需要重簽名工具重新簽名。

問題

測試好搜apk,用Apktool 2.0反編譯後的manifest.xml丢失大量資訊,channel、versionCode和versionName不見了。

是以想利用apktool反編譯進行更改管道号、版本号、包名還是不太靠譜。

Apktool貌似更适用于檢視apk資訊、代碼,但修改後rebuild将面臨很多問題。

下篇部落格講解apk的重簽名。