天天看點

Android 反編譯APK,破解APK

學習和開發Android應用有一段時間了,今天寫一篇部落格總結一下Android的apk檔案反編譯。我們知道,Android應用開發完成之後,我們最終都會将應用打包成一個apk檔案,然後讓使用者通過手機或者平闆電腦下載下傳下來進行安裝。正常情況下,Android應用打包成apk之後,就無法再看到開發這個應用時使用的資源檔案以及代碼了。但是我們通過網上提供了一些工具,還是可以将apk進行反編譯的,apk反編譯之後,我們就可以看到開發這個應用使用的資源檔案(圖檔)、layout、樣式、相關的實作代碼等,apk反編譯也算是Android開發中一個比較實用的技巧吧,當我們對别人開發好的應用感興趣時,我們就可以通過這種技術手段将别人打包好的apk進行反編譯,繼而可以看到我們感興趣的内容, (注:反編譯不是讓各位開發者去對一個應用破解搞重裝什麼的,主要目的是為了促進開發者學習,借鑒好的代碼,提升自我開發水準。)下面就來說說如何将一個apk反編譯出來。

一、準備必要工具

  工欲善其事,必先利其器,首先我們要下載下傳好反編譯apk時需要的相關工具

1.1、使用工具

  1. apktool (資源檔案擷取) 
  2. dex2jar(源碼檔案擷取)
  3. jd-gui  (源碼檢視)

1.2、工具介紹

  apktool  

         作用:資源檔案擷取,可以提取出圖檔檔案和布局檔案進行使用檢視

  dex2jar

         作用:将apk反編譯成java源碼(classes.dex轉化成jar檔案)

  jd-gui

         作用:檢視APK中classes.dex轉化成出的jar檔案,即源碼檔案

1.3工具下載下傳

  apktool下載下傳位址:https://bitbucket.org/iBotPeaches/apktool/downloads

  

Android 反編譯APK,破解APK

  下載下傳好之後得到一個如下圖所示的jar檔案

  

Android 反編譯APK,破解APK

  dex2jar下載下傳位址:http://sourceforge.net/projects/dex2jar/files/

  

Android 反編譯APK,破解APK

  

Android 反編譯APK,破解APK

  下載下傳完成之後,得到一個如下圖所示的壓縮包

  

Android 反編譯APK,破解APK

  jd-gui下載下傳位址:http://jd.benow.ca/

  

Android 反編譯APK,破解APK

  下載下傳完成之後,得到一個如下圖所示的壓縮包:

  

Android 反編譯APK,破解APK

  到此,需要使用到的3個相關工具都下載下傳好了,在這裡說明一下jd-gui的下載下傳,我從官方網站上點選

Android 反編譯APK,破解APK

下載下傳時會經常出現如下圖所示的問題

  

Android 反編譯APK,破解APK

  但是多試幾次又可以下載下傳了,是以如果有遇到這個問題的朋友們不妨多試幾次,或者從别的地方下載下傳jd-gui,jd-gui算是做Java開發的一個必備工具了,用它來将class反編譯成java源代碼是非常友善的,網上搜尋一下一般都可以下載下傳到,隻不過版本不一定是最新的。

二、Apk反編譯流程

  為了友善進行反編譯,我們将上述下載下傳好的3個工具統一放到一個檔案夾中,例如:

  

Android 反編譯APK,破解APK

  然後将【dex2jar-2.0.zip】和【jd-gui-windows-1.3.0.zip】分别解壓到目前檔案夾,如下圖所示:

  

Android 反編譯APK,破解APK

2.1、使用apktool反編譯apk得到圖檔、XML配置、語言資源等檔案

  進入CMD指令行,如下:

  

Android 反編譯APK,破解APK

  切換到上述的3個工具的所在目錄,如:E:\AndroidDevelopTool\Android反編譯工具包

  

Android 反編譯APK,破解APK

  接下來我們要做的就是運作apktool_2.0.1.jar這個jar檔案來将apk檔案進行反編譯,在java中,運作可執行jar包的指令是:

java -jar jar包名.jar      

  使用如下的指令運作apktool_2.0.1.jar反編譯MMTS-release-1.0.2.apk

java -jar apktool_2.0.1.jar d -f E:\AndroidDevelopTool\Android反編譯工具包\測試apk\MMTS-release-1.0.2.apk -o MMTS      

  這個指令是啟動apktool_2.0.1.jar将位于【E:\AndroidDevelopTool\Android反編譯工具包\測試apk\】目錄下的"MMTS-release-1.0.2.apk"這個apk反編譯,然後将反編譯生成的檔案存放到目前目錄(apktool_2.0.1.jar所在的目錄,也就是"E:\AndroidDevelopTool\Android反編譯工具包"目錄)下的一個【MMTS】檔案夾中。這個檔案夾的名字是可以随便取的,喜歡叫啥都行。

  執行反編譯操作:

  

Android 反編譯APK,破解APK

  反編譯成功後,會在目前目錄(E:\AndroidDevelopTool\Android反編譯工具包)下生成一個MMTS檔案夾,打開MMTS裡面就有反編譯後生成的檔案,如下圖所示:

  

Android 反編譯APK,破解APK

  打開MMTS檔案夾,就可以看到反編譯後的生成的檔案,如下圖所示:

  

Android 反編譯APK,破解APK

  生成的檔案和檔案夾當中,我們關心的是【res】檔案夾中和AndroidManifest.xml檔案,打開res檔案夾,裡面就有我們想要看到的東西了,如下圖所示:

  

Android 反編譯APK,破解APK

  

Android 反編譯APK,破解APK

  

Android 反編譯APK,破解APK

  

Android 反編譯APK,破解APK

  想檢視哪個xml檔案就使用文本編輯器打開看看吧,反正全部都可以看到了。以上就是使用apktool這個工具将一個apk反編譯得到圖檔、XML配置、語言資源等檔案的過程。

2.2、使用dex2jar反編譯apk得到Java源代碼

  将要反編譯的APK字尾名改為.rar或者 .zip,并解壓,得到其中的classes.dex檔案(它就是java檔案編譯再通過dx工具打包而成的),如下圖所示:

  

Android 反編譯APK,破解APK

  将擷取到的classes.dex放到之前解壓出來的工具【dex2jar-2.0】檔案夾内,如下圖所示:

  

Android 反編譯APK,破解APK

  在指令行下定位到dex2jar.bat所在目錄,輸入"d2j-dex2jar classes.dex",效果如下:

  

Android 反編譯APK,破解APK

  指令執行完成之後,在目前目錄下就可以看到生成的Jar檔案了,如下圖所示:

  

Android 反編譯APK,破解APK

  反編譯classes.dex得到classes-dex2jar.jar檔案之後,就可以使用【jd-gui】工具将class檔案反編譯成java源代碼了

  

Android 反編譯APK,破解APK

  使用jd-gui打開classes-dex2jar.jar就可以看到源代碼了,如下圖所示:

  

Android 反編譯APK,破解APK

  JD-GUI雖然可以将class反編譯成java源代碼,但是對于一些被混淆過的class,反編譯的效果就不是那麼理想了,被混淆過的class反編譯後的效果圖(類檔案名稱以及裡面的方法名稱都會以a,b,c....之類的樣式命名):

  

Android 反編譯APK,破解APK

  以上步驟是我親自實踐過之後一步步整理出來的,對照着做應該不會有太大問題。

三、Apk反編譯注意問題

3.1、apktool版本太舊導緻反編譯失敗的問題

  之前用過了apktool這個工具的一些舊版本,發現總是反編譯不成功,在執行反編譯時會出現如下錯誤:

  Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file

  

Android 反編譯APK,破解APK

  這個問題是因為apktool版本過低導緻,而解決這個問題的辦法就是使用最新版本的apktool就可以了,最新版本的下載下傳位址:https://bitbucket.org/iBotPeaches/apktool/downloads

3.2、apktool執行反編譯指令出現”Input file was not found or was not readable"的問題

  這個問題是因為apktool更新到2.0以上時,使用方式已經替換,格式為:apktool d [-s] -f <apkPath> -o <folderPath>

  好了,關于反編譯apk的内容就這麼多了。

  最後,給大家分享我下載下傳好的那三個相關工具,下載下傳位址:https://pan.baidu.com/s/1CCmrn3SztzzplVwwL66v8w

學習和開發Android應用有一段時間了,今天寫一篇部落格總結一下Android的apk檔案反編譯。我們知道,Android應用開發完成之後,我們最終都會将應用打包成一個apk檔案,然後讓使用者通過手機或者平闆電腦下載下傳下來進行安裝。正常情況下,Android應用打包成apk之後,就無法再看到開發這個應用時使用的資源檔案以及代碼了。但是我們通過網上提供了一些工具,還是可以将apk進行反編譯的,apk反編譯之後,我們就可以看到開發這個應用使用的資源檔案(圖檔)、layout、樣式、相關的實作代碼等,apk反編譯也算是Android開發中一個比較實用的技巧吧,當我們對别人開發好的應用感興趣時,我們就可以通過這種技術手段将别人打包好的apk進行反編譯,繼而可以看到我們感興趣的内容, (注:反編譯不是讓各位開發者去對一個應用破解搞重裝什麼的,主要目的是為了促進開發者學習,借鑒好的代碼,提升自我開發水準。)下面就來說說如何将一個apk反編譯出來。

一、準備必要工具

  工欲善其事,必先利其器,首先我們要下載下傳好反編譯apk時需要的相關工具

1.1、使用工具

  1. apktool (資源檔案擷取) 
  2. dex2jar(源碼檔案擷取)
  3. jd-gui  (源碼檢視)

1.2、工具介紹

  apktool  

         作用:資源檔案擷取,可以提取出圖檔檔案和布局檔案進行使用檢視

  dex2jar

         作用:将apk反編譯成java源碼(classes.dex轉化成jar檔案)

  jd-gui

         作用:檢視APK中classes.dex轉化成出的jar檔案,即源碼檔案

1.3工具下載下傳

  apktool下載下傳位址:https://bitbucket.org/iBotPeaches/apktool/downloads

  

Android 反編譯APK,破解APK

  下載下傳好之後得到一個如下圖所示的jar檔案

  

Android 反編譯APK,破解APK

  dex2jar下載下傳位址:http://sourceforge.net/projects/dex2jar/files/

  

Android 反編譯APK,破解APK

  

Android 反編譯APK,破解APK

  下載下傳完成之後,得到一個如下圖所示的壓縮包

  

Android 反編譯APK,破解APK

  jd-gui下載下傳位址:http://jd.benow.ca/

  

Android 反編譯APK,破解APK

  下載下傳完成之後,得到一個如下圖所示的壓縮包:

  

Android 反編譯APK,破解APK

  到此,需要使用到的3個相關工具都下載下傳好了,在這裡說明一下jd-gui的下載下傳,我從官方網站上點選

Android 反編譯APK,破解APK

下載下傳時會經常出現如下圖所示的問題

  

Android 反編譯APK,破解APK

  但是多試幾次又可以下載下傳了,是以如果有遇到這個問題的朋友們不妨多試幾次,或者從别的地方下載下傳jd-gui,jd-gui算是做Java開發的一個必備工具了,用它來将class反編譯成java源代碼是非常友善的,網上搜尋一下一般都可以下載下傳到,隻不過版本不一定是最新的。

二、Apk反編譯流程

  為了友善進行反編譯,我們将上述下載下傳好的3個工具統一放到一個檔案夾中,例如:

  

Android 反編譯APK,破解APK

  然後将【dex2jar-2.0.zip】和【jd-gui-windows-1.3.0.zip】分别解壓到目前檔案夾,如下圖所示:

  

Android 反編譯APK,破解APK

2.1、使用apktool反編譯apk得到圖檔、XML配置、語言資源等檔案

  進入CMD指令行,如下:

  

Android 反編譯APK,破解APK

  切換到上述的3個工具的所在目錄,如:E:\AndroidDevelopTool\Android反編譯工具包

  

Android 反編譯APK,破解APK

  接下來我們要做的就是運作apktool_2.0.1.jar這個jar檔案來将apk檔案進行反編譯,在java中,運作可執行jar包的指令是:

java -jar jar包名.jar      

  使用如下的指令運作apktool_2.0.1.jar反編譯MMTS-release-1.0.2.apk

java -jar apktool_2.0.1.jar d -f E:\AndroidDevelopTool\Android反編譯工具包\測試apk\MMTS-release-1.0.2.apk -o MMTS      

  這個指令是啟動apktool_2.0.1.jar将位于【E:\AndroidDevelopTool\Android反編譯工具包\測試apk\】目錄下的"MMTS-release-1.0.2.apk"這個apk反編譯,然後将反編譯生成的檔案存放到目前目錄(apktool_2.0.1.jar所在的目錄,也就是"E:\AndroidDevelopTool\Android反編譯工具包"目錄)下的一個【MMTS】檔案夾中。這個檔案夾的名字是可以随便取的,喜歡叫啥都行。

  執行反編譯操作:

  

Android 反編譯APK,破解APK

  反編譯成功後,會在目前目錄(E:\AndroidDevelopTool\Android反編譯工具包)下生成一個MMTS檔案夾,打開MMTS裡面就有反編譯後生成的檔案,如下圖所示:

  

Android 反編譯APK,破解APK

  打開MMTS檔案夾,就可以看到反編譯後的生成的檔案,如下圖所示:

  

Android 反編譯APK,破解APK

  生成的檔案和檔案夾當中,我們關心的是【res】檔案夾中和AndroidManifest.xml檔案,打開res檔案夾,裡面就有我們想要看到的東西了,如下圖所示:

  

Android 反編譯APK,破解APK

  

Android 反編譯APK,破解APK

  

Android 反編譯APK,破解APK

  

Android 反編譯APK,破解APK

  想檢視哪個xml檔案就使用文本編輯器打開看看吧,反正全部都可以看到了。以上就是使用apktool這個工具将一個apk反編譯得到圖檔、XML配置、語言資源等檔案的過程。

2.2、使用dex2jar反編譯apk得到Java源代碼

  将要反編譯的APK字尾名改為.rar或者 .zip,并解壓,得到其中的classes.dex檔案(它就是java檔案編譯再通過dx工具打包而成的),如下圖所示:

  

Android 反編譯APK,破解APK

  将擷取到的classes.dex放到之前解壓出來的工具【dex2jar-2.0】檔案夾内,如下圖所示:

  

Android 反編譯APK,破解APK

  在指令行下定位到dex2jar.bat所在目錄,輸入"d2j-dex2jar classes.dex",效果如下:

  

Android 反編譯APK,破解APK

  指令執行完成之後,在目前目錄下就可以看到生成的Jar檔案了,如下圖所示:

  

Android 反編譯APK,破解APK

  反編譯classes.dex得到classes-dex2jar.jar檔案之後,就可以使用【jd-gui】工具将class檔案反編譯成java源代碼了

  

Android 反編譯APK,破解APK

  使用jd-gui打開classes-dex2jar.jar就可以看到源代碼了,如下圖所示:

  

Android 反編譯APK,破解APK

  JD-GUI雖然可以将class反編譯成java源代碼,但是對于一些被混淆過的class,反編譯的效果就不是那麼理想了,被混淆過的class反編譯後的效果圖(類檔案名稱以及裡面的方法名稱都會以a,b,c....之類的樣式命名):

  

Android 反編譯APK,破解APK

  以上步驟是我親自實踐過之後一步步整理出來的,對照着做應該不會有太大問題。

三、Apk反編譯注意問題

3.1、apktool版本太舊導緻反編譯失敗的問題

  之前用過了apktool這個工具的一些舊版本,發現總是反編譯不成功,在執行反編譯時會出現如下錯誤:

  Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file

  

Android 反編譯APK,破解APK

  這個問題是因為apktool版本過低導緻,而解決這個問題的辦法就是使用最新版本的apktool就可以了,最新版本的下載下傳位址:https://bitbucket.org/iBotPeaches/apktool/downloads

3.2、apktool執行反編譯指令出現”Input file was not found or was not readable"的問題

  這個問題是因為apktool更新到2.0以上時,使用方式已經替換,格式為:apktool d [-s] -f <apkPath> -o <folderPath>

  好了,關于反編譯apk的内容就這麼多了。

  最後,給大家分享我下載下傳好的那三個相關工具,下載下傳位址:https://pan.baidu.com/s/1CCmrn3SztzzplVwwL66v8w

繼續閱讀