1.dex反編譯成jar工具
1.1 enjarify
點擊下載:enjarify.zip
Enjarify 是一個將Dalvik字節碼轉化為等價的Java字節碼,然后可以用一系列的Java分析工具去分析Android應用。之前我們一直使用Dex2jar來完成這個工作,不過Dex2jar已經算是一個非常老的工具咯。Dex2jar在絕大部分情況下都挺不錯的,但是如果碰到了些模糊的特性或者特殊案例就會出錯或者默默地吐出一些錯誤的結果。相比之下,Enjarify在設計的時候就考慮到了盡可能多的情況,特別是對于那些Dex2jar不起作用的情況下。另外,Enjarify能夠有效地處理Unicode編碼的類名、常量,隱式類型轉換、正常處理流程中的移除處理啊等等。
Usage and installation
Enjarify是一個普通的Python 3的應用程序,你可以直接Git Clone然后運行。下載好了之后直接進到對應的目錄下:
python3 -O -m enjarify.main yourapp.apk
Linux
有時候為了方便調用,可以將該腳本做一層封裝,盡可能的使用Pypy,這貨會比CPython速度快一點。另外,如果你希望能夠像調用命令一樣直接調用Enjarify,你可以將它作為鏈接放到你的環境變量中,譬如:
ln -s "$PWD/enjarify.sh" ~/bin/enjarify
Windows
我們提供了一個可執行的腳本enjarify.bat,同樣地把這個腳本放到環境變量中就可以了。
Usage
可以直接用以下命令調用:
enjarify yourapp.apk
最簡單的用法就是可以將一個apk文件或者一個dex文件作為命令行的輸入,如果你使用的是一個多dex的apk,那么Enjarify會自動將這些dex打包到一個單一的jar文件中。而如果你選定了一個dex文件,那么只有這個dex文件會被解析。
enjarify classes2.dex
默認的輸出是會在當前目錄下創建一個[inputname]-enjarify.jar文件。可以通過-o參數來指定輸出文件的名稱:
enjarify yourapp.apk -o yourapp.jar
默認情況下,Enjarify不會覆蓋已經存在的文件,不過可以使用-f或者--force參數來強制指定覆蓋。
Limitations
Enjarify 目前還不能狗完整解析一些可選的信息,譬如源文件的屬性、行數以及注解。Enjarify已經盡可能地去解析所有的類,不過因為Android或者Java的限制,有些隱藏類并不能很好地解析,不過往往只有在有很多人為混淆的情況下才會出現。
Performance tips
PyPy可是比CPython快很多,可以在這里http://pypy.org/.下載,注意要使用PyPy3,而不是普通的PyPy。Linux下默認會使用pypy3,Windows下面則需要你自己去編輯了。另外,Enjarify默認會使用一些優化算法使得整個反編譯之后的代碼的可讀性增加,比如移除未使用的變量等。如果你不需要這些,可以使用--fast參數來加快速度。
1.2 dex2jar
點擊下載:dex2jar
從apk中抽取classex.dex文件
雖說dex2jar可以直接從apk抽取出jar文件,但是會經常遇到一些問題,所以常用的方法是將.apk文件,重命名為.zip,解壓縮后,找到classes.dex文件
運行dex2jar生成.jar文件
在Mac系統,打開終端,定位到dex2jar所在的目錄,執行以下命令:
./dex2jar.sh absolute_path_classes.dex
在win系統,打開命令行,定位到dex2jar所在的目錄,執行以下命令:
.\dex2jar.bat?absolute_path_classes.dex
生成文件:classes_dex2jar.jar
2.apk反編譯工具
2.1 apktool
點擊下載:apktool.jar
2.2 classyshark
點擊下載:ClassyShark
2.2.1.官方下載地址
2.2.2.運行命令
java -jar ClassyShark.jar
彈出如下界面:
ClassyShark界面
2.2.3.打開淘寶apk,如圖:
淘寶apk結構
分析上圖,左邊目錄欄中主要顯示了三部分內容,manifest文件,classes.dex文件集(為什么說是文件集,因為當apk開發采用Mutidex時會產生多個dex文件,不知淘寶為何沒有采用Mutidex)和so引用集。
2.2.4.查看淘寶manifest文件,如下圖:
淘寶manifest文件
在決定采用那種第三方支持,例如推送時,我們常常會參考別的一些成熟公司,上圖紅框中可以明顯看出是小米推送的相關權限聲明,從這可以了解淘寶也是引入了小米推送的。
2.2.5.查看class文件的源碼
AllsparkLoader類源碼
上圖可以看出ClassyShark工具將類的相關方法和變量聲明進行了結構調整,分為三部分顯示fields,constructors,methods。結構會更清晰,但是也不難發現源碼基本都是省略號(看來只能看類基本的組成而已- -)。另外有個小技巧,雙擊對應的變量對象可以快速跳轉至該對象class文件。
2.2.6.圖形化查看整個apk的構成(這也是我最喜歡的功能)
將右邊的目錄欄tab切換成Methods count,如下圖:
apk的構成餅圖
有時候我們可能只想了解別人的架構,相關組成部分的占比權重,上圖能很清晰的表現出來。如果我們想了解占比最高的taobao api部分的組成時,只需在圖上點擊相應部分。
我們看到了其中有阿里最近開源出來的react庫weex(聲稱比rn好用)。當然如果你想更詳細的查看就在右邊目錄中挨個找,圖形只是一個總體瀏覽。
2.2.7.使用總結
總的來說ClassyShark的使用非常便捷,只需一個命令行,然后打開對應的apk即可,而且顯示的內容非常有條理,非常適合在對別人apk整體架構借鑒時使用。
3.jd-jui
點擊下載:jd-jui
4.多功能工具
4.1 Android-Crack-Tool For Mac
mac10-11:
點擊下載:Android-Crack-Tool For Mac
mac9-10:
點擊下載:Android-Crack-Tool For Mac
4.2 Android逆向助手
點擊下載:Android逆向助手
4.3 jadx
點擊下載:jadx
4.3.1.安裝
依次運行以下命令:
git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist
主要是拉下來jadx的git主工程,然后跑對應的gradle task。之后會生成運行腳本,大概就是多出了這個目錄
4.3.2.運行
cd build/jadx/
bin/jadx -d out lib/jadx-core-*.jar
#or
bin/jadx-gui lib/jadx-core-*.jar
以上命令是git給出的運行示例,主要就是反編譯jadx源碼的一個jar包。
由于之前文章對比classyShark 和apktool時用的是淘寶apk,那么這里繼續用淘寶apk,便于三者的橫向比較。
bin/jadx-gui taobao.apk
當然如果你不喜歡使用命令行外加找文件路徑,你可以直接雙擊下圖腳本文件即可
jadx-gui腳本文件
會彈出以下界面,對應選中你想反編譯的.dex, .apk, .jar or .class即可(可以看到支持的格式還是很豐富的,贊)。
選中taobao.apk
選中淘寶apk,并且反編譯完成后,結果如下:
反編譯taobao.apk結果
可以看到結果中即反編譯了資源文件和源碼,這個效果對比,apktool+dex2jar+jd-gui這三個工具集來說操作簡便了太多。
4.3.3結果橫向對比(classyshark,apktool+dex2jar+jd-gui)
主要就是來對比下反編譯后源碼的可讀性。同樣選用com.taobao.allspark包下的AllsparkLoader來進行對比,用jadx反編譯后的結果為:
AllsparkLoader反編譯結果
我們可以看到可讀性非常高,要是去掉混淆的影響,已經很接近源碼了!!!(細心的讀者可以發現該gui還包含了一部分編譯器的功能,很實用)
4.3.4另外幾個很贊的功能介紹
1).支持全局class查詢
2).支持全局text查詢
3).支持導出gradle工程(你可以用as直接看反編譯的工程了)
那么我們最終看看在as中打開導出工程后的結果:
很贊對不對
4.3.5總結
看了以上之后,我們就來說下jadx對比classyshark和(apktool+dex2jar+jd-gui工具集)的優劣勢吧。
優點:
1.操作方便快捷,一步到位
2.有較為完善的gui界面,帶有較多實用功能
3.反編譯代碼可讀性高
缺點:
1.沒有classyshark類似的方法總數統計以及圖形化分布界面
2.對比apktool直接反編譯出來的資源文件有相應的缺失(這個有心的童鞋可以自己嘗試下,這里就不給截圖了)
總體來說jadx還是你反編譯工具的最佳選擇,當然有些時候可能還是需要你去配合使用,畢竟現在看來三者還是各有優劣的。
資源匯總下載:匯總下載