現(xiàn)在啊, 想APP抓包, 必須得上點手段了, 沒有以前那么簡單了. 一開始還沒意識到競品是使用 flutter 開發(fā)的, 直接使用 Charles 發(fā)現(xiàn)抓不到競品的任何請求, 直到我將競品APK解壓, 在lib中看到了 libflutter.so 文件.
網(wǎng)上找了很多, 很多方案都是使用 frida hook + postern + 代理工具這三個組合對其進行組合的. 下面我就整理了一下這次的抓包詳細(xì)經(jīng)歷.
備注: 如果只是想抓普通 APP 的 HTTPS 請求, 只需要執(zhí)行第 6,7,8步即可.
為什么普通方式?jīng)]辦法抓到 flutter 開發(fā)的Http包呢?
- 它不走系統(tǒng)代理,
- 它不支持設(shè)置代理.
- 它不信任系統(tǒng)證書, 它內(nèi)置進行ssl 證書校驗.證書校驗寫在了 so 文件里.
那么要解決的問題有2點
- 針對證書校驗的問題, 我們使用
frida去hooklibflutter.so中的函數(shù). - 不走系統(tǒng)代理, 我們就使用基于VPN模式的
postern+charles轉(zhuǎn)發(fā)抓包.
ok, 正文開始 每一步中都有要包含的軟件下載地址..
軟件版本
- PC : Mac OS 14.0 (M1)
- Python: python3.12
- frida-server: 16.1.10
- IDA pro 64 位 Mac 版
- Charles
Android 真機
- 需要 root.
- Brook apk 因我找到的
postern版本太低, 真機是Android 14, 無法安裝, 經(jīng)測試,Brook可替代. - Magisk apk
- Magisk 插件 Move_certificates, 移動證書的時候會用到.
1. 找到 hook 點
IDA Pro Mac 版下載地址
安裝后, 如 ida64 打開報錯, 在命令行中輸入 sudo xattr -rd com.apple.quarantine ida64.app 命令即可.
一般目前手機都是 arm64-v8a 架構(gòu)的, 所以直接解壓競品 apk, 進入到 lib 下arm64-v8a目錄中找到 libflutter.so, 將其拖入到 IDA 中. 如下圖

在頂部菜單 View -> Open subViews 中選中 String

使用快捷鍵 ctrl + f 搜索字符串 ssl_client 結(jié)果如下圖.結(jié)果應(yīng)該只有一個.

雙擊進入.如下圖.

點擊上圖中藍(lán)色內(nèi)容, 按下 X 鍵, 進行跟蹤.

點擊第二個進去. 會看到這樣的視圖.(為什么是第二個, 不是第一個, 因為我試過了, 沒正確)

按一下空格鍵, 就會切換視圖, 變成這樣.

接著, 要去菜單中 找到 options -> General 將 Number of opcode bytes 由0 改為 4.

點擊 OK后, 界面會多出一些內(nèi)容.

向上滾動, 找到 _unwind 開始的, 從_unwind 開始, 拿大于10個字符. (我拿了大概30多個)

將這些字符保存好, 在下面一步中會使用.
2. 準(zhǔn)備 hook 腳本.
我這里就直接貼上我用的.
function hook_ssl_verify_result(address) {
Interceptor.attach(address, {
onEnter: function(args) {
console.log("Disabling SSL validation");
},
onLeave: function(retval) {
console.log("Retval: " + retval);
retval.replace(0x1);
}
});
}
function hookFlutter() {
var m = Process.findModuleByName("libflutter.so");
if (m) {
console.log("libflutter.so module found at base address: " + m.base);
var pattern = "FF C3 01 D1 FD 7B 01 A9 FC 6F 02 A9 FA 67 03 A9 F8 5F 04 A9 F6 57 05 A9 F4 4F 06 A9 08 0A 80 52 48 00 00 39 1A 54 40 F9 DA 02 00 B4 48 03 40 F9 88 02 00 B4 39 20 40 A9 F3 03 02 AA EE 01 0B 94 F7 03 1F AA 49 07 40 F9 2B 1B 40 F9 2D 37 40 F9 08 11 40 F9 6A 8D 40 F9 8A 01 00 B4 2C 93 42 39 F8 03 17 AA 8C 01 00 37 6B D9 40 B9 7F 09 00 71 01 01 00 54 4A 05 43 F9 57 61 42 A9 06 00 00 14";
Memory.scan(m.base, m.size, pattern, {
onMatch: function(address, size){
console.log('[+] ssl_verify_result found at: ' + address.toString());
hook_ssl_verify_result(address);
},
onError: function(reason){
console.log('[!] There was an error scanning memory: ' + reason);
},
onComplete: function() {
console.log("All done");
}
});
} else {
console.log("libflutter.so module not found");
}
}
setTimeout(hookFlutter, 5000); // 設(shè)置延時找對hook時機(太快函數(shù)還沒加載出來,太慢app已經(jīng)發(fā)起請求了)
將在第一步中獲得的字符, 替換腳本中 hookFlutter 方法 pattern 變量的值. 然后將腳本另存為 hook_ssl.js. 接下來會用到. 下面就開始準(zhǔn)備環(huán)境了.
3. 安裝 frida
在本機上執(zhí)行.以下命令. ( 需安裝了 python.)
pip install frida==16.1.10
pip install frida-tools==12.1.3
pip install objection==1.8.4
安裝完后, 執(zhí)行 frida --version 查看版本是否正確.
4. 安裝 frida-server
frida-server 下載地址
下載完成后, 解壓, 接著執(zhí)行命令.
adb push /Users/yaqi/Downloads/frida-server-16.1.10-android-arm64 /data/local/tmp
接著輸入 adb shell 進去對其修改權(quán)限
yaqi@zhangyaqideMini Downloads % adb shell
o1q:/ $ su
o1q:/ # cd /data/local/tmp
o1q:/data/local/tmp # chmod +x frida-server-16.1.10-android-arm64
o1q:/data/local/tmp # ls -alh
total 49M
drwxrwx--x 5 shell shell 3.3K 2024-07-03 15:32 .
drwxr-x--x 6 root root 3.3K 2020-01-03 14:15 ..
-rwxr-xr-x 1 shell shell 49M 2024-07-02 11:37 frida-server-16.1.10-android-arm64
然后啟動frida-server, 在 /data/local/tmp 目錄下執(zhí)行 ./frida-server-16.1.10-android-arm64, 只要沒報錯就可以了. 但是目前是不能退出的, 如果想在后臺運行, 就在最后加上一個 & 符號. (不建議后臺運行, 前臺的話, 可以看到是否正在運行.)
5. 驗證 frida 與 frida-server 通信
先設(shè)置下端口轉(zhuǎn)發(fā).
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
新開一個命令行窗口, 輸入 frida-ps -U 開始驗證是否能和手機通信.
如果列出一堆進程清單, 就表示通信成功了.
yaqi@zhangyaqideMini IDAPro % frida-ps -U
PID Name
----- -------------------------------------------------------------------------------------------------
14554 .qtidataservices
30807 Brook
3787 Drony
31455 Magisk
9353 adbd
1919 adpl
1765 adsprpcd
825 android.hardware.atrace@1.0-service
13115 android.hardware.audio.service
13127 android.hardware.bluetooth@1.0-service
1214 android.hardware.drm@1.3-service.clearkey
1215 android.hardware.drm@1.3-service.widevine
1217 android.hardware.gatekeeper@1.0-service
1220 android.hardware.gnss@2.1-service-qti
1223 android.hardware.health@2.1-service-samsung
826 android.hardware.keymaster@4.0-service
827 android.hardware.keymaster@4.0-strongbox-service-qti
1224 android.hardware.memtrack@1.0-service
1225 android.hardware.neuralnetworks@1.3-service-qti
13163 android.hardware.power.samsung-service
1226 android.hardware.secure_element@1.2-service
13141 android.hardware.sensors@2.0-service.multihal
1232 android.hardware.usb@1.3-service.coral
1233 android.hardware.wifi@1.0-service
...
6. 安裝/設(shè)置 Charles 及證書保存.
怎么安裝, 這里就直接略過了, 直接說怎么設(shè)置. 按照我截圖的配置即可.
設(shè)置 proxy Settings

設(shè)置 SSL Proxying Settings, 添加主機和端口都是 *

關(guān)閉本機代理.取消選中

保存 Charles 證書.
在 菜單help 中, 選擇 SSL Proxyling 將保存證書到本地,

推送證書到手機.
執(zhí)行命令
adb push /Users/yaqi/Downloads/charles-ssl-proxying-certificate.pem /sdcard/Download
在手機中安裝此證書.
這里不再描述.
7. 手機安裝/配置 Brook.apk
啟動后界面是這樣的.可以不用登錄.

點擊右上角的 + , 添加服務(wù)器.

8. 移動證書.
Android 從 7.0 開始,系統(tǒng)不再信任用戶 CA 證書(應(yīng)用 targetSdkVersion >= 24 時生效,如果 targetSdkVersion <24 即使系統(tǒng)是 7.0 + 依然會信任)。也就是說即使安裝了用戶 CA 證書,在 Android 7.0 + 的機器上,targetSdkVersion>= 24 的應(yīng)用的 HTTPS 包就抓不到了。所以我們需要將 charles的證書轉(zhuǎn)為系統(tǒng)證書.
將 Magisk 插件 Move_certificates 推送到手機. 執(zhí)行命令
adb push /Users/yaqi/Downloads/Move_Certificates-v1.9.zip /sdcard/Download
打開 Magisk -> 模塊 -> 從本地安裝, 選取 /sdcard/Download 下的插件, 然后重啟.
這一步手機必須要 root.

9. 準(zhǔn)備抓包.
- 啟動
frida-server和設(shè)置端口轉(zhuǎn)發(fā)(剛才手機重啟過了,需要重新啟動) - 啟動競品 app.
- 打開
Brook, 點擊中間的連接. - 啟動hook腳本.
frida -UF -l /Users/yaqi/Downloads/hook_ssl.js

看PC上的 Charles 是不是已經(jīng)有HTTPS請求了? ok. 本文到此結(jié)束,
本文如果對你有幫助, 可以關(guān)注并給個贊????. 謝謝啦.
參考鏈接.
https://blog.csdn.net/yhsnihao/article/details/110477720
https://cloud.tencent.com/developer/article/2301307
https://blog.csdn.net/weixin_44777218/article/details/134029395
https://mp.weixin.qq.com/s/pXpfXK-Ez0n70f3bqFuuFg
https://bbs.kanxue.com/thread-261941.htm
https://blog.csdn.net/lihuayong/article/details/133974654
http://www.itdecent.cn/p/5cc45dd3f996
https://cloud.tencent.com/developer/article/1979022
https://blog.csdn.net/superwx1985/article/details/136937416
http://www.itdecent.cn/p/0db248d3b67f
http://www.itdecent.cn/p/ada10d2976f2
https://blog.csdn.net/yuyue_999/article/details/126575819