一、反編譯未加固的apk
1、反編譯用到的工具
apktool:資源文件獲取,可以提取出圖片文件和布局文件進行使用查看
dex2jar:將apk反編譯成java源碼(classes.dex轉化成jar文件)
jd-gui:查看APK中classes.dex轉化成出的jar文件,即源碼文件
2、使用apktool反編譯資源文件和Manifest文件
為了方便操作,首先將下載好的3個工具統一放到1個文件夾中
將gui和dex2jar分別解壓到當前文件夾
使用apktool反編譯apk得到圖片、xml、maifest等文件
運行CMD.exe,進入Demo.apk路徑下
運行apktool對apk進行反編譯
使用如下命令將Demo.apk反編譯到【Demo】文件夾下:
java -jar apktool_2.4.0.jar d -f Demo.apk -o Demo
打開Demo文件,就可以看到反編譯后生成的文件
這時候可以看到【res】和Manifest文件了;
3、使用dex2jar反編譯java源碼
將Demo.apk直接修改后綴,改為Demo.zip,并解壓
解壓后的文件夾中,classes.dex 就是java源碼打包后的文件
將命令行定位到dex2jar.bat所在目錄
使用命令行:
d2j-dex2jar classes.dex
會生成classes-dex2jar文件,該文件就是反編譯后的java源碼文件
4、使用gui查看反編譯后的java源碼
雙擊jd-gui.exe,運行gui,
選擇剛剛生成的classes-dex2jar,打開后就可以看到源碼(圖中的Demo為了容易閱讀沒有加混淆,正常上線的應用會加混淆來加大閱讀難度)
至此,一個沒有加殼的apk已經被反編譯完成了,但是實際工作中,上線的apk包大多數都會進行加固,有些應用市場甚至后要求加固,例如360,應用寶等,下面會介紹一中常見的脫殼技術
二、脫殼
加固后的apk在通過以上的反編譯流程后,無法得到正常的java源碼,如下圖
從上圖可以看出,經過加固后的apk,通過常規方法反編譯無法獲取到源碼。
1、脫殼用到的工具
FDex2 :通過Hook ClassLoader的loadClass方法,反射調用getDex方法取得Dex(com.android.dex.Dex類對象),再將里面的dex寫出
VirtualXposed:無需root手機即可使用的xp框架
2、脫殼
Step1、將 【VirtualXposed】、【FDex2】和需要脫殼的apk都安裝到手機上
Step2、啟動【VirtualXposed】,并在【VirtualXposed】中安裝【FDex2】:
Step3、在【VirtualXposed】中激活【FDex2】:
Step4、在【VirtualXposed】中安裝要脫殼的應用,方法和Step2一樣。
Step5:啟動【VirtualXposed】中的F【Dex2】,并配置要脫殼的應用。
Step6:在【VirtualXposed】中運行要脫殼的應用。
Step7:在上【VirtualXposed】安裝文件管理器,方便將生成的dex文件導出
在【VirtualXposed】選中【高級設置】
選中【文件管理】,會提示安裝【Amaze】文件管理器
Step8:查看脫殼后的dex文件,打開【Amaze】,選中【Private Storage】,定位到FDex2設置的dex輸出路徑下,可以看到脫殼后的dex文件
Step9:將dex文件導出:長按dex文件,點擊頂部的復制按鈕,然后回到選中【External Storage】并選擇一個路徑,點擊頂部的粘貼按鈕,將文件粘貼到外部存儲,這時,在手機自帶的文件管理器中就可以找到剛剛的dex文件了
Step10:通過dex2jar對脫殼的dex文件進行反編譯,得到的3個dex文件中,有的是無用的文件,可以依次打開看看,最后可以看到,脫殼后的dex文件被成功反編譯后
至此,脫殼完成
源代碼和相關工具類已上傳碼云
https://gitee.com/xiaobug/XpDemo
https://gitee.com/xiaobug/reverse_tool
參考鏈接,感謝作者的無私奉獻
1、APK反編譯
2、Android APK脫殼--騰訊樂固、360加固一鍵脫殼
3、【Xposed模塊開發入門】
4、Xposed 熱更新(干貨,建議收藏)
5、android apk編譯打包過程
6、Android工程師,如何簡單高效的學會smali語法
7、使用baksmali及smali修改apk并打包
8、MT管理器
9、Oo0代碼混淆實現方法
10、修改AndroidStudio混淆配置文件