1. 程式人生 > >安卓apk反編譯、修改、重新打包、簽名全過程

安卓apk反編譯、修改、重新打包、簽名全過程

首先明確,反編譯別人apk是一件不厚道的事情。程式碼是程式設計師辛苦工作的成果,想通過這種手段不勞而獲,是不對的。這也說明,程式碼混淆是非常重要的。本文抱著學習的態度,研究在一些特殊的情況下如果有需要,該怎麼反編譯apk。

工具簡介

,編譯和反編譯apk,從apk中提取圖片和佈局資源

,將可執行檔案classes.dex反編譯為jar原始碼檔案

,檢視jar原始碼檔案

反編譯

apktool安裝

Windows系統:
1. 首先確保系統安裝有Java
2. 下載apktool.bat指令碼
3. 下載最新版本的apktool.jar,並且重新命名為apktool.jar
4. 將apktool.bat和apktool.jar放在同一目錄下,就可以在命令列視窗使用了。
5. 其他系統請參考

連結

用法

可以直接在命令列執行apktool.bat檢視幫助。這裡介紹兩個最常用的:

反編譯

apktool.bat d -o <output_dir> test.apk

其中<output_dir>指定輸出目錄,預設為apk.out。

編譯

apktool.bat b -o <output.apk> <input_dir>

其中<input_dir>就是上面反編譯輸出的目錄,<ouput.apk>是編譯的輸出結果,預設為dist/<name>.apk。

示例

一個典型的apktool反編譯的結果如下:

這裡寫圖片描述

此時,可以檢視AndroidManifest.xml,res及smali檔案了。甚至可以修改這個目錄下的資原始檔或者smali檔案,然後重新編譯。

值得注意的是,apktool反編譯出來只能得到apk的smali檔案,即組合語言版本,並不能得到原始碼。

檢視原始碼

一. 這裡需要用到另外兩個工具,下載dex2jar並解壓。下載jd-gui,這是一個帶UI的應用程式。

二. 將需要反編譯的apk的字尾名改為.zip或者.rar,然後解壓到一個資料夾,得到其中的classes.dex檔案。

這裡寫圖片描述

三. 將classes.dex複製到解壓後的dex2jar-2.0資料夾下。從命令列進入到該目錄,執行

d2j-dex2jar.bat classes.dex

會生成由classes.dex反編譯得到的jar檔案,classes-dex2jar.jar。

這裡寫圖片描述

四. 然後使用jd-gui開啟classes-dex2jar.jar,就可以檢視原始碼了。

這裡寫圖片描述

如果apk在釋出的時候加過混淆處理,那麼我們也只能得到混淆後的版本。想通過閱讀原始碼來破解別人的apk,還是有一些難度的。

修改程式碼

如果只是修改apk相應的資源,例如圖片,比較好辦,在res資料夾下找到相應的檔案替換就可以。

修改程式碼比較麻煩,因為反編譯出來的結果中只有smali檔案,即Java虛擬機器支援的組合語言。

如果確實需要修改程式碼,就得對照smali檔案和從classes.dex反編譯出來的原始碼了,按照smali的規範來改動即可。相當於寫彙編,這個難度比較大。

重新打包

使用apktool編譯前面反編譯生成的目錄即可。

簽名

簽名是對要釋出的apk檔案作標記,確保你的apk檔案有唯一的身份歸屬認證,只有相同簽名和相同包名的檔案才可以覆蓋安裝並保留使用者資訊。

對於反編譯的apk,我們可以通過jarsigner來對它進行簽名。

生成keystore檔案

首先,簽名需要keystore檔案,可以使用keytool工具生成,一般Java環境都帶有keytool命令,可以在命令列測試。

keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore

各個引數解釋如下:

-genkey 產生證書檔案
-alias 產生別名
-keystore 指定金鑰庫的.keystore檔案中
-keyalg 指定金鑰的演算法,這裡指定為RSA(非對稱金鑰演算法)
-validity 為證書有效天數,這裡我們寫的是40000天

輸入上述命令後,會有如下的提示:

輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
  [Unknown]:  test
您的組織單位名稱是什麼?
  [Unknown]:  test
您的組織名稱是什麼?
  [Unknown]:
您所在的城市或區域名稱是什麼?
  [Unknown]:
您所在的州或省份名稱是什麼?
  [Unknown]:
該單位的兩字母國家程式碼是什麼
  [Unknown]:
CN=test, OU=test, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正確嗎?
  [否]:  y


輸入<demo.keystore>的主密碼
        (如果和 keystore 密碼相同,按回車):

簽名apk

jarsigner也存在於Java JDK的安裝包當中,所以安裝好了Java環境的話,可以直接在命令列使用。

jarsigner -verbose -keystore demo.keystore demo.apk demo.keystore

-verbose 指定生成詳細輸出
-keystore 指定數字證書儲存路徑

這樣,就完成了對一個apk的簽名過程,然後就可以安裝使用了。注意如果你的手機上原來就有這個apk,需要解除安裝掉。因為新apk的簽名已經改變了。

參考