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

GeoT25 8年前發布 | 12K 次閱讀 Java 安卓開發 Android開發 移動開發

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

準備工具

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

apktool

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

  2. 打開 apktool.jar 下載鏈接,下載最新版本,下載完成之后重命名為 apktool.jar;

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

    sudo cp apktool apktool.jar /usr/local/bin
    
  4. 使用 chmod 命令為上一步復制過去的兩個文件添加可執行權限,如:

    chmod +x apktool apktool.jar
    
  5. 操作至此,便可以在任一路徑下使用 apktool 命令了。現在,你就可以使用 apktool -version 命令檢查以上過程是否配置正確。

dex2jar

  1. 你可以從 softpedia 或者 sourceforge 網站找到 dex2jar 的 Mac 版下載鏈接,并解壓縮;

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

    chmod a+x *.sh
    

jd-gui

從 softpedia 或者 http://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 源碼再重新打包就比較復雜了,特別是在改動較大的情況下。

 

來自:http://yifeng.studio/2016/12/05/android-apk-decompile-and-repackaging/

 

 本文由用戶 GeoT25 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!