1. 程式人生 > >使用ApkTool以及dex2jar對apk進行反編譯-更新異常以及解決方案

使用ApkTool以及dex2jar對apk進行反編譯-更新異常以及解決方案

使用ApkTool以及dex2jar對apk進行反編譯

相關工具下載地址:

使用ApkTool對apk進行反編譯以及打包

1.下載並解壓ApkTool

在cmd命令列中進入ApkTool的資料夾(win7系統以上快捷鍵為shift+滑鼠右鍵),輸入apktool,出現如下圖片中的提示資訊,表示成功。
測試成功
注意的是,在apktool.bat中,可以修改使用的apktool.jar的版本。

2.使用ApkTool對apk進行反編譯

在cmd命令列中進入ApkTool的資料夾,反編譯命令:apktool.bat d [apk檔案] [輸出資料夾]
測試如下圖,成功後,會在指定的輸出資料夾下生成反編譯後的檔案。
反編譯成功

3.使用ApkTool對apk進行打包

在cmd命令列中進入ApkTool的資料夾,打包命令:apktool.bat b [資原始檔夾] [打包生成的apk檔案]
測試如下圖,成功後,會在指定的輸出資料夾下生成打包好的apk檔案。
打包成功
注意,這裡打包的apk檔案是未經過簽名的,可以看到在安裝的時候會提示如下錯誤,如果需要安裝,解決方法是需要進行重新簽名。
簽名錯誤

使用Dex2Jar以及JD-GUI反編譯apk

使用dex2jar可以將apk檔案中的dex檔案轉換成jar檔案,然後就可以通過JD-GUI開啟得到的jar檔案來檢視相應的Java程式碼。

1.下載Dex2Jar以及JD-GUI

工具的下載地址見文章上方
Dex2Jar

2.使用dex2jar.bat得到jar檔案

將需要反編譯apk的字尾格式改成zip,然後使用解壓出來,其中的classes.dex就是我們需要進行反編譯的部分。
在cmd命令列中進入Dex2Ja資料夾,反編譯命令:d2j-dex2jar.bat [classes.dex檔案]
成功後,會在Dex2Ja資料夾下生成classes-dex2jar.jar檔案,這個jar檔案就是反編譯後的檔案。
Dex2Jar decode

3.使用JD-GUI開啟jar檔案

使用JD-GUI軟體開啟classes-dex2jar.jar檔案,就可以檢視反編譯的程式碼了。
JD-GUI
注意的是,如果進行反編譯的apk進行了混淆處理,那麼我們反編譯看到的基本就很難閱讀了。

總結

使用ApkTool對apk檔案進行反編譯,將dex檔案轉成了smali檔案,更適合提取apk中的資原始檔,比如佈局檔案以及圖片等資源。

使用Dex2Jar對apk進行反編譯,最終將dex檔案轉化成了jar檔案,通過JD-GUI開啟,對於未混淆的apk來說,更適合通過反編譯來看相應得Java原始碼。

更新異常以及解決方案

在使用ApkTool進行反編譯的時候,有時候我們會遇到如下的異常,下面我來貼出一下我的解決方法,希望可以給遇到問題的同學們幫助。
錯誤型別:
- Input file xxx was not found or was not readable.
- Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000
- Exception in thread “main” java.lang.NullPointerException I: Loading resource table from file: C:\Users\使用者名稱\apktool\framework\1.apk

Input file xxx was not found or was not readable

 Input file xxx was not found or was not readable
這種問題是在2.1.0中,反編譯的指令與1.5.3不同了,如果需要指定反編譯輸出資料夾,需要在前面加 -o 表示輸出資料夾。
成功如下:
解決成功

Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000

這種問題一般是apktool的版本不匹配導致的,解決方案:

  1. 第一種是修改當前專案的sdk的buildtools版本,在當前專案中的project.properties檔案中修改。
  2. 第二種是使用新版的apktool進行反編譯,但是切換apktool版本可能會遇到下一個問題,具體解決方案見下文。
    sdk.buildtools

Exception in thread “main” java.lang.NullPointerException

這個問題一般是切換apktool的jar包版本問題導致的,可以在命令列中看到錯誤提示:I: Loading resource table from file: C:\Users\使用者名稱\apktool\framework\1.apk。
錯誤內容資訊
解決方法,只要把命令列提示中的framework資料夾中的1.apk檔案刪掉,重新進行反編譯即可解決問題。