因爲工作需要,需要看看某個系統apk是怎麼實現特定的功能的。 看看有沒有可以利用的地方
-
獲取到應用的包名
- 打開應用的某個頁面
- 進入adb shell
- shell裏面 dumpsys activity|grep ACTIVITY 獲取到包名
-
根據包名查看應用的信息
- 獲取apk的路徑 adb shell pm path {包名}
-
把apk拉到本地
- adb pull {remote path} {local path}
-
一鍵查看應用
- 下載jadx ,通過這個應用打開.apk
正常的應用到這裏就結束了。
但是 What The Fuck !!! apk裏面classes.dex沒有,是空的,並沒有任何的class 文件
-
再次獲取應用的信息信息
- adb shell dumpsys package {包名},可以看到codePath
-
dump所有的code到本地
- adb pull {remote code path} {local path}
-
emm… 可以看到有個arm的文件夾,裏面有個xxx.odex
在有的系統,提取做了優化,把裏面.dex轉換成了.odex提前進行存儲 -
把xx.odex轉換爲 dex
- 準備工作 下載baksmali, smali, oat3dex.jar
- 把系統的framework拉到本地來 adb pull /system/framework .
- 從framework中找到 boot.oat, 我試驗的機器是在framework/arm的目錄下
- 執行java -jar oat2dex.jar boot boot.oat ,這裏會在boot.oat的同級目錄下生產dex odex兩個子目錄
- 執行 java -jar oat2dex.jar xxx.odex /framework/arm/dex/ (後面的目錄是上一步生產的文件夾)
- 執行java -jar baksmali.jar -a 22 -b -s xxx.dex -o test; (22代表着系統api等級)
- 執行 java -jar smali.jar -a 22 -j 1 -o classes.dex test;
- 如果不出意外的話,這裏就有一個classes.dex
-
再次通過jadx打開classes.dex文件
-
完美收工