咱們下載到的 App 安裝包是 Apk 文件(Android Application Package) 。經過 Apk 文件,咱們也能夠獲得這個應用的代碼和資源文件,對應用進行修改。java
那麼咱們如何獲取這些文件呢?這就須要 Android 反編譯技術。git
Apktool 反編譯 xml 文件和 dex 文件,並能夠將編譯後的項目從新打包成 apk。 官方下載地址: Apktool 官方的速度有時候不穩定,也能夠從個人網盤中下載: 連接 密碼:xkaogithub
dex2jar 將 classes.dex 轉換爲「.jar」文件) 官方下載地址: dex2jar 個人網盤: 連接 密碼:xkaoshell
咱們能夠經過 Apktool 能夠將 apk 文件進行反編譯,可是直接把 apk 的擴展名改爲「.zip」也能夠對其進行解壓並獲得一些資源文件。bash
直接解壓能夠獲得一些資源文件,可是 AndroidManifest.xml 和其餘的 xml 文件都是亂碼,經過 Apktool 進行反編譯,能夠最大限度的還原這些文件的內容。學習
Windows :字體
將**「apktool.jar」和「apktool.bat」**移動到 windows 目錄(通常在 C://windwos 下)ui
在命令行中輸入
$ apktool
複製代碼
若是出現
則說明安裝成功,若沒有出現,則須要把「apktool.jar」、「apktool.bat」的路徑添加到系統的環境變量中。
Mac OS:
到 這裏 或者個人 網盤連接 裏下載好 script 腳本文件,修更名稱**「apktool」**(若是從個人網盤下載,無須修更名稱) 。
把**「apktool」、「apktool.jar」**移動到 /usr/local/bin
目錄下
在命令行中 cd 到 /usr/local/bin
中而後分別輸入下面兩條命令
$ chmod a+x d2j_invoke.sh
$ chmod a+x d2j-dex2jar.sh
複製代碼
$ apktool
複製代碼
出現
則安裝成功
$ apktool d test.apk
複製代碼
運行完成後,獲得一個包含資源文件和代碼的文件:
注意: 此時 dex 文件直接反編譯成了 smali 文件,而咱們須要的是 .dex 文件。
此時再運行:
$ apktool d -s -f test.apk
複製代碼
-d 反編譯 apk 文件
-s 不反編譯 dex 文件,而是將其保留
-f 若是目標文件夾存在,則刪除後從新反編譯
此時獲得這樣的文件夾:
爲了演示如何將修改事後的 Apk 文件從新打包簽名,我寫了一個簡單的 Demo:把 Demo 的背景換了以後,進行打包、簽名。
這是初始應用程序的運行效果:
$ apktool b b_test -o newtest.apk
複製代碼
-b 是指 build b_test 是剛纔反編譯出的文件所在的目錄 -o 用於指定新的文件名稱,這裏指定爲「newtest.apk」
注意: 此時的 apk 文件是不能安裝的,還須要對其進行簽名。
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore testjks -storepass password newtest.apk aliasName
複製代碼
簽名文件是我本身生成的,沒有辦法使用 Apk 原來的簽名進行簽名。
如今將 Apk 安裝一下試試看:
能夠看到,背景資源已經成功替換成咱們設置的第二張圖片了。
下載、解壓好 dex2jar
將上一步獲得的 classes.dex 文件(有時候還有 classes2.dex,說明方法數過多,把它當成 classes.dex 處理就行了)複製到 dex2jar 解壓好的目錄中。
在命令行中運行:
$ sh d2j-dex2jar.sh classes.dex
複製代碼
若是提示:
d2j-dex2jar.sh: line 36: ./d2j_invoke.sh: Permission denied
複製代碼
執行
$ sudo chmod +x d2j_invoke.sh
複製代碼
後再次執行
$ sh d2j-dex2jar.sh classes.dex
複製代碼
運行成功,在當前目錄下生成了 classes-dex2jar.jar 文件。
安裝好 jd-gui 以後,用其將 classes-dex2jar.jar 打開,就能夠看到反編譯出來的 java 代碼了!
這裏的代碼沒有通過混淆,因此命名容易識別,若是是從應用市場下載下來的 apk 文件,反編譯出來的代碼大部分是混淆事後的代碼。
出於對開發者的尊重和爲了保持應用的穩定,但願你們不要隨意修改別人的應用程序,請僅從技術層面上妥善利用這一技術!
歡迎關注本文做者:
掃碼關注並回復「乾貨」,獲取我整理的千G Android、iOS、JavaWeb、大數據、人工智能等學習資源。