天天看點

Android:反編譯apk踩坑/apktool/dex2jar/JDGUI

需求描述

想要反編譯apk檔案,搜到了這篇部落格:Android APK反編譯就這麼簡單 詳解(附圖),非常有參考價值~但其中的工具下載下傳連結都已404,而本雜魚實際操作的過程中也出現了億點點點點點點的問題,于是碼了這篇部落格記錄一下~

工具包戳這裡:myDemos,分支:deApk

Android:反編譯apk踩坑/apktool/dex2jar/JDGUI

使用&踩坑

根據Android APK反編譯就這麼簡單 詳解(附圖)這篇部落格,三個工具分工明确:apktool用于反編譯apk中的布局、圖檔等靜态資源,dex2jar用于反編譯apk中的類檔案,JDGUI用于檢視dex2jar的編譯結果——jar包中.class的源碼。

以下是這三個工具的使用與踩坑詳情:

apktool

首先記錄操作過程,将需要反編譯的apk檔案拷貝到apktool檔案夾下:

Android:反編譯apk踩坑/apktool/dex2jar/JDGUI

在資料總管位址欄輸入“cmd”并回車,即可在目前檔案夾下打開指令行(下文不再贅述):

Android:反編譯apk踩坑/apktool/dex2jar/JDGUI

執行以下指令:

apktool d -f apk名稱.apk
           
Android:反編譯apk踩坑/apktool/dex2jar/JDGUI

生成的apk同名檔案夾即為反編譯結果~指令行輸出結果無報錯即可。

// 以下為個人踩坑記錄 ——————————————————————————————————————————————

Unsupported major.minor version 51.0

運作apktool,首先需要搭建java環境,而且最好安裝一個版本較高的jdk,比如本雜魚一開始安裝了jdk1.6,報錯“Unsupported major.minor version 51.0”,改裝jdk1.9後未再報此錯~(這裡碎碎念一下:後來在本地編譯dex2jar,1.9版本太高報錯,裝回1.6又太低報錯。。最後到oracle官網注冊下載下傳了jdk1.8,重新捯饬了環境才OK)是以建議直接使用jdk1.8~

本來想把jdk也上傳git,由于超過了單個檔案100M的限制,隻能麻煩有需要的小夥伴自己下載下傳啦~

oracle-jdk1.8下載下傳,沒有賬号的話直接走注冊流程就行,填一些資訊即可;

不熟悉java環境變量配置的萌新戳這裡:一步步教你如何配置Java環境變量(超級詳細)(其中第10步重複了,隻操作第9步即可)

Exception in thread “main” brut.androlib.AndrolibException: Could not decode …

因java版本問題導緻的報錯解決了,定睛一看:還是有報錯!度娘給出了解決方法:從apktool下載下傳高版本的apktool.jar替換即可~(參考的原文連結在文末)

dex2jar

這個工具是用來反編譯.class檔案的,可以說是本雜魚實際操作中最麻煩的一步了……由于最終解決報錯的方案是直接從gitee倉庫:dex2jar拉取源碼,并根據README.md在本地編譯後生成工具包(dex-tools-2.2)使用,之前的各種報錯便感覺不必再細說。有時候一條道感覺走不通了,也許就應該嘗試下轉換思維另辟蹊徑了哦!

總的來說,操作過程和apktool類似,先将需要反編譯的apk檔案拷貝到dex-tools-2.2檔案夾下,然後在此檔案夾執行以下指令:

d2j-dex2jar.bat -f apk名稱.apk
           

PS:dex-tools-2.2中的腳本既有.bat格式又有.sh格式,應該也可以在Linux系統下使用(合理猜測)

Android:反編譯apk踩坑/apktool/dex2jar/JDGUI

生成的apk同名-dex2jar.jar檔案即為反編譯結果~指令行輸出結果無報錯即可。

JDGUI

這是三個工具當中唯一最令人省心的了!T_T使用簡便,no problem~

輕按兩下運作JDGUI檔案夾下的jd-gui.exe,将dex2jar生成的jar檔案拖入圖形界面,或在界面進行操作打開jar檔案即可。

Android:反編譯apk踩坑/apktool/dex2jar/JDGUI

參考文檔

[1] Android APK反編譯就這麼簡單 詳解(附圖)

[2] 解決坑----Unsupported major.minor version 51.0

[3] 安卓逆向:apktool 反編譯時報錯 Exception in thread “main” brut.androlib.AndrolibException: Could not decode …