天天看點

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

  • 使用ApkTool以及dex2jar對apk進行反編譯
    • 相關工具下載下傳位址
    • 使用ApkTool對apk進行反編譯以及打包
      • 下載下傳并解壓ApkTool
      • 使用ApkTool對apk進行反編譯
      • 使用ApkTool對apk進行打包
    • 使用Dex2Jar以及JD-GUI反編譯apk
      • 下載下傳Dex2Jar以及JD-GUI
      • 使用dex2jarbat得到jar檔案
      • 使用JD-GUI打開jar檔案
    • 總結
    • 更新異常以及解決方案
      • Input file xxx was not found or was not readable
      • Caused by javaioIOException Expected 0x001c0001 got 0x00000000
      • Exception in thread main javalangNullPointerException

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

相關工具下載下傳位址:

ApkTool: https://ibotpeaches.github.io/Apktool/

Dex2Jar: https://sourceforge.net/projects/dex2jar/

JD-GUI: http://jd.benow.ca/jd-eclipse/update/#jd-gui-download

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

1.下載下傳并解壓ApkTool

在cmd指令行中進入ApkTool的檔案夾(win7系統以上快捷鍵為shift+滑鼠右鍵),輸入apktool,出現如下圖檔中的提示資訊,表示成功。

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

注意的是,在apktool.bat中,可以修改使用的apktool.jar的版本。

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

在cmd指令行中進入ApkTool的檔案夾,反編譯指令:apktool.bat d [apk檔案] [輸出檔案夾]

測試如下圖,成功後,會在指定的輸出檔案夾下生成反編譯後的檔案。

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

3.使用ApkTool對apk進行打包

在cmd指令行中進入ApkTool的檔案夾,打包指令:apktool.bat b [資源檔案夾] [打包生成的apk檔案]

測試如下圖,成功後,會在指定的輸出檔案夾下生成打包好的apk檔案。

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

注意,這裡打包的apk檔案是未經過簽名的,可以看到在安裝的時候會提示如下錯誤,如果需要安裝,解決方法是需要進行重新簽名。

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

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

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

1.下載下傳Dex2Jar以及JD-GUI

工具的下載下傳位址見文章上方

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

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

将需要反編譯apk的字尾格式改成zip,然後使用解壓出來,其中的classes.dex就是我們需要進行反編譯的部分。

在cmd指令行中進入Dex2Ja檔案夾,反編譯指令:d2j-dex2jar.bat [classes.dex檔案]

成功後,會在Dex2Ja檔案夾下生成classes-dex2jar.jar檔案,這個jar檔案就是反編譯後的檔案。

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

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

使用JD-GUI軟體打開classes-dex2jar.jar檔案,就可以檢視反編譯的代碼了。

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

注意的是,如果進行反編譯的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

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

這種問題是在2.1.0中,反編譯的指令與1.5.3不同了,如果需要指定反編譯輸出檔案夾,需要在前面加 -o 表示輸出檔案夾。

成功如下:

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

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

這種問題一般是apktool的版本不比對導緻的,解決方案:

  1. 第一種是修改目前項目的sdk的buildtools版本,在目前項目中的project.properties檔案中修改。
  2. 第二種是使用新版的apktool進行反編譯,但是切換apktool版本可能會遇到下一個問題,具體解決方案見下文。
    使用ApkTool以及dex2jar對apk進行反編譯-更新異常以及解決方案使用ApkTool以及dex2jar對apk進行反編譯

Exception in thread “main” java.lang.NullPointerException

這個問題一般是切換apktool的jar包版本問題導緻的,可以在指令行中看到錯誤提示:I: Loading resource table from file: C:\Users\使用者名\apktool\framework\1.apk。

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

解決方法,隻要把指令行提示中的framework檔案夾中的1.apk檔案删掉,重新進行反編譯即可解決問題。