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

首先明確,反編譯別人apk是一件不厚道的事情。代碼是程序員辛苦工做的成果,想經過這種手段坐享其成,是不對的。這也說明,代碼指鹿爲馬常重要的。本文抱着學習的態度,研究在一些特殊的狀況下若是有須要,該怎麼反編譯apk。html

工具簡介

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

dex2jar,將可運行文件classes.dex反編譯爲jar源碼文件git

jd-gui,查看jar源碼文件程序員

反編譯

apktool安裝

Windows系統: 
1. 首先確保系統安裝有Java 
2. 下載apktool.bat腳本 
3. 下載最新版本的apktool.jar,而且重命名爲apktool.jar 
4. 將apktool.bat和apktool.jar放在同一目錄下,就能夠在命令行窗口使用了。 
5. 其餘系統請參考連接github

用法

能夠直接在命令行執行apktool.bat查看幫助。這裏介紹兩個最經常使用的:算法

反編譯

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

其中<output_dir>指定輸出目錄,默認爲apk.out。windows

編譯

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 指定數字證書存儲路徑

對於Android Studio生成的jks文件

jarsigner -digestalg SHA1 -sigalg SHA1withRSA(或SHA1withDSA) -verbose -keystore xxx.jks -signedjar xxx.apk(簽名後的apk名字) xxx.apk(須要簽名的apk) xxx(keystore別名)

例如:

jarsigner -digestalg SHA1 -sigalg SHA1withRSA -verbose -keystore ttl.jks -signedjar dest1.apk dest.apk CP

也能夠增長storepass參數,來設置密碼口令.這樣就不用手動敲了

-storepass xxxxx
 

這樣,就完成了對一個apk的簽名過程,而後就能夠安裝使用了。注意若是你的手機上原來就有這個apk,須要卸載掉。由於新apk的簽名已經改變了。

參考

apktool

dex2jar

jd-gui

Android開發學習總結(六)—— APK反編譯

android apk反編譯、修改源碼、從新打包全過程

相關文章
相關標籤/搜索