Android Apk 文件反編譯和從新打包的過程分析

學習的方式有不少種,Read the fucking source code 絕對不失爲最佳的方式。除了閱讀 Android SDK 的源碼,還能經過反編譯 APK 的方式,閱讀他人開發的應用源碼。本文就來聊聊在 Mac 環境下如何藉助第三方工具反編譯 APK 壓縮文件(經過愛加密、360加固等手段處理的 APK 文件除外),閱讀源碼、修改源碼並從新打包成一個新的 APK 安裝文件。javascript

準備工具


本文描述的反編譯手段須要藉助三個工具,分別是:apktool、dex2jar 和 jd-gui,下面我一一介紹下他們的下載及配置過程。html

apktooljava

  1. 打開 apktool 腳本連接網頁,右鍵存儲爲一個命名爲 apktool 的文件,記得不要添加任何格式後綴;android

  2. 打開 apktool.jar 下載連接,下載最新版本,下載完成以後重命名爲 apktool.jar;git

  3. 打開命令行工具,使用 cp 命令將前面兩步下載的 apktool 腳本文件和 apktool.jar 文件複製到 PC 的 /usr/local/bin 目錄下 (複製前的文件至此能夠刪除),如:github

    sudo cp apktool apktool.jar /usr/local/bin複製代碼
  4. 使用 chmod 命令爲上一步複製過去的兩個文件添加可執行權限,如:bash

    chmod +x apktool apktool.jar複製代碼
  5. 操做至此,即可以在任一路徑下使用 apktool 命令了。如今,你就可使用 apktool -version 命令檢查以上過程是否配置正確。微信

有關 apktool 工具的詳細信息,能夠參考官網介紹:A tool for reverse engineering Android apk filesapp

dex2jar工具

  1. 你能夠從 softpedia 或者 sourceforge 網站找到 dex2jar 的 Mac 版下載連接,並解壓縮;

  2. 一樣使用 chmod 命令修改 sh 文件的用戶權限,如:

    chmod a+x *.sh複製代碼

jd-gui

softpedia 或者 jd.benow.ca/ 網站下載並解壓縮便可,裏面的 JD-GUI 文件即是閱讀 jar 包的應用程序。

反編譯 apk 資源文件


apk 文件就是一個壓縮文件,經過解壓縮工具即可以打開並解壓縮。可是裏面的資源文件,除了 drawable 圖片資源,其餘都是通過編譯處理的二進制文件,什麼也看不出來。

而使用 apktool 工具能夠直接從 apk 文件中反編譯出諸如 AndroidManifest.xml 、layout、strings 等資源文件,能夠直接修改,供再次打包。如:

apktool d example.apk複製代碼

反編譯 java 源碼文件


解壓縮 apk 文件,能夠看到 classes.dex 源碼文件,可能不止一個。經過 dex2jar 工具能夠將其轉化爲 jar 文件,並使用 jd-gui 工具打開並閱讀應用源碼。

第一步,dex2jar 操做,獲得 classes-dex2jar.jar 文件。注意 d2j-dex2jar.sh 和 classes.dex 文件的路徑,按需修改:

sh d2j-dex2jar.sh classes.dex複製代碼

第二步,使用 jd-gui 打開 classes-dex2jar.jar 文件,即可以看到目標應用所用到的第三方 library 和 開發源碼,如:

若是對方開發人員在工程中開啓了混淆功能,將會增長你的閱讀難度,不過仔細分析,也能找到一些蛛絲馬跡,給予你一些「靈感」。

固然,也能夠直接針對 apk 文件使用 dex2jar 命令獲取 jar 文件,減小上述 apk 文件解壓縮的這一步驟,如:

sh d2j-dex2jar.sh example.apk複製代碼

從新打包 apk 安裝文件


學會如何反編譯 apk 文件後,咱們還能夠修改 apk 文件中的內容,好比應用名稱、桌面圖標,甚至是 Java 源碼等,而後使用 apktool 工具從新打包,產生一個新的 apk 安裝文件。

這裏以修改應用名稱和桌面圖標爲例,看看如何從新打包 apk 文件並安裝至手機上。(此處僅供學習參考,勿做惡!)

第一步,使用前文介紹的反編譯 apk 資源文件的方式獲得反編譯後的文件夾,打開 AndroidManifest.xml 文件,找到 application 標籤的 label 和 icon 屬性。這樣,咱們就知道在哪裏修改對應的資源文件了;

第二步,找到對應的 drawable 圖標文件和 strings 字符串資源,好比 ic_launcher.png 和 app_name,替換圖標並修改字符串內容;

第三步,使用 apktool b files 命令編譯打包,這裏的 files 對應第一步反編譯 apk 文件時獲得的應用文件夾。執行完畢,便會獲得一個新的 apk 文件;

注意:此時獲得的 apk 文件是沒有沒有通過簽名的,使用 adb install 命令安裝時會獲得一個失敗提示:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]。

第四步,生成本身的簽名文件。你能夠選擇使用 Android Studio -> Build -> Next -> Create New... 可視化操做界面生成一個新的簽名文件,也能夠直接使用 keytool 工具直接在終端工具上生成,如:

keytool -genkey -keystore example.keystore -keyalg RSA -validity 10000 -alias example複製代碼

第五步,使用 jarsigner 工具爲 apk 文件簽名,簽名事後獲得的 apk 文件即可以使用 adb install 命令安裝至鏈接到 PC 的安卓設備上了。簽名命令以下:

jarsigner -verbose -keystore example.keystore -signedjar example-signed.apk example.apk example複製代碼

注意:若是簽名事後的 apk 文件依舊安裝失敗,能夠試試在簽名命令上加上 -digestalg SHA1 -sigalg MD5withRSA -tsa 參數。固然這裏我在測試時沒有添加該參數,但也能正常安裝。

修改資源文件並從新打包仍是比較簡單的,可是修改 java 源碼再從新打包就比較複雜了,特別是在改動較大的狀況下。「鴻洋」大神有一篇文章,描述瞭如何反編譯 apk 併爲其添加啓動頁廣告的過程,固然也沒有涉及到原開發人員的 Java 源代碼改動,詳情可參考: Android 反編譯初探 應用是如何被注入廣告的

歡迎關注


本文由 亦楓 創做並首發於 亦楓的我的博客 ,同步受權微信公衆號:技術鳥(NiaoTech)。

歡迎各類形式地交流與轉載,註明做者及出處便可。

本文標題爲: Android Apk 文件反編譯和從新打包的過程分析

本文連接爲:yifeng.studio/2016/12/05/…

相關文章
相關標籤/搜索