記: Android 競品 flutter app hook抓包經(jīng)歷.

現(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點

  1. 針對證書校驗的問題, 我們使用 fridahook libflutter.so 中的函數(shù).
  2. 不走系統(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, 進入到 libarm64-v8a目錄中找到 libflutter.so, 將其拖入到 IDA 中. 如下圖
image.png
在頂部菜單 View -> Open subViews 中選中 String
image.png
使用快捷鍵 ctrl + f 搜索字符串 ssl_client 結(jié)果如下圖.結(jié)果應(yīng)該只有一個.
image.png
雙擊進入.如下圖.
image.png
點擊上圖中藍(lán)色內(nèi)容, 按下 X 鍵, 進行跟蹤.
image.png
點擊第二個進去. 會看到這樣的視圖.(為什么是第二個, 不是第一個, 因為我試過了, 沒正確)
image.png
按一下空格鍵, 就會切換視圖, 變成這樣.
image.png
接著, 要去菜單中 找到 options -> GeneralNumber of opcode bytes 由0 改為 4.
image.png
點擊 OK后, 界面會多出一些內(nèi)容.
image.png
向上滾動, 找到 _unwind 開始的, 從_unwind 開始, 拿大于10個字符. (我拿了大概30多個)
image.png
將這些字符保存好, 在下面一步中會使用.

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 及證書保存.

Charles 下載地址

怎么安裝, 這里就直接略過了, 直接說怎么設(shè)置. 按照我截圖的配置即可.

設(shè)置 proxy Settings
image.png
設(shè)置 SSL Proxying Settings, 添加主機和端口都是 *
image.png
關(guān)閉本機代理.取消選中
image.png
保存 Charles 證書.

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

image.png

推送證書到手機.

執(zhí)行命令
adb push /Users/yaqi/Downloads/charles-ssl-proxying-certificate.pem /sdcard/Download

在手機中安裝此證書.

這里不再描述.

7. 手機安裝/配置 Brook.apk

Brook 下載地址

啟動后界面是這樣的.可以不用登錄.


image.png

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

image.png

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.

image.png

9. 準(zhǔn)備抓包.

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

看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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本人使用的手機是小米8SE,Android系統(tǒng)8.1,抓包工具Charles,系統(tǒng)window11 理論上無論多少...
    Venbro閱讀 942評論 0 0
  • 零基礎(chǔ)學(xué)黑客,搜索公眾號:白帽子左一 另,免費領(lǐng)取黑客入門學(xué)習(xí)資料包及練手靶場![https://%E3%80%9...
    白帽子左一閱讀 4,513評論 1 3
  • 這次主要用到Magisk下的一個插件MoveCertificates。 原理:安卓7.0以后默認(rèn)不信任用戶安裝的證...
    RedB閱讀 13,278評論 0 3
  • 前言: Android滲透過程中,會經(jīng)常遇見https證書校驗,不能抓取數(shù)據(jù)包。就比如我手機無法Root,每次都要...
    book4yi閱讀 21,094評論 6 17
  • 不能抓包的原因 Android7.0 之后默認(rèn)不信任用戶添加到系統(tǒng)的CA證書: To provide a more...
    vilian_acfc閱讀 5,616評論 0 1

友情鏈接更多精彩內(nèi)容