目錄
-
-
- 目錄
-
- Apktool反編譯APK
- what is apk
- Introduction to Apktool
- 反編譯apk
- 反編譯後重新打包
- 問題
Apktool反編譯APK
what is apk?
apk檔案本身是zip包,解壓縮後可看到如下結構的檔案。但以下檔案是加密/編譯的,無法檢視:
- manifest.xml 程式全局配置檔案,含apk包名、管道号、版本号等資訊
- classes.dex java代碼編譯後的Dalvik位元組碼
-
resources.arsc 編譯後的二進制資源檔案(文字、顯示相關的xml檔案)
( 注:好搜APK解壓縮後,除了values外的其它資源檔案都可直接檢視。這也是常用的竊取别人app圖檔資源的方法o(∩_∩)o )
這時反編譯工具就派上用場了,不需原代碼,就可以更改配置、圖示、版本号、管道号、包名等資訊,換湯不換藥重新打包。再深入點可以一探究竟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~
反編譯apk
以好搜APK為例分析反編譯、修改資訊後重新打包的過程。
apktool d指令即apktool decode,不指定輸出dir,預設反編譯後輸出的同名檔案夾儲存在C:\Users\user_name下。
若dir下有檔案會報錯,需用-f強行清空目标檔案夾。
反編譯log資訊如下:
其中有個關于.9圖的warning,設計人員為了美觀一般将.9圖四周的黑線去掉了,是以apktool校驗是否是.9圖時發現異常,可忽略。
觀察反編譯的檔案夾與之前解壓縮檔案夾對比如下:
可以看出classes.dex和resources.arsc都被反編譯了。細節如下圖:
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過程如下:
由于未簽名,新包用adb install 安裝失敗,提示Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
後續需要重簽名工具重新簽名。
問題
測試好搜apk,用Apktool 2.0反編譯後的manifest.xml丢失大量資訊,channel、versionCode和versionName不見了。
是以想利用apktool反編譯進行更改管道号、版本号、包名還是不太靠譜。
Apktool貌似更适用于檢視apk資訊、代碼,但修改後rebuild将面臨很多問題。
下篇部落格講解apk的重簽名。