记: Android 竞品 flutter app hook抓包经历.

现在啊, 想APP抓包, 必须得上点手段了, 没有以前那么简单了. 一开始还没意识到竞品是使用 flutter 开发的, 直接使用 Charles 发现抓不到竞品的任何请求, 直到我将竞品APK解压, 在lib中看到了 libflutter.so 文件.
网上找了很多, 很多方案都是使用 frida hook + postern + 代理工具这三个组合对其进行组合的. 下面我就整理了一下这次的抓包详细经历.

备注: 如果只是想抓普通 APP 的 HTTPS 请求, 只需要执行第 6,7,8步即可.

为什么普通方式没办法抓到 flutter 开发的Http包呢?

  • 它不走系统代理,
  • 它不支持设置代理.
  • 它不信任系统证书, 它内置进行ssl 证书校验.证书校验写在了 so 文件里.

那么要解决的问题有2点

  1. 针对证书校验的问题, 我们使用 fridahook libflutter.so 中的函数.
  2. 不走系统代理, 我们就使用基于VPN模式的 postern + charles 转发抓包.

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, 无法安装, 经测试, Brook可替代.
  • Magisk apk
  • Magisk 插件 Move_certificates, 移动证书的时候会用到.

1. 找到 hook 点

IDA Pro Mac 版下载地址
安装后, 如 ida64 打开报错, 在命令行中输入 sudo xattr -rd com.apple.quarantine ida64.app 命令即可.

一般目前手机都是 arm64-v8a 架构的, 所以直接解压竞品 apk, 进入到 libarm64-v8a目录中找到 libflutter.so, 将其拖入到 IDA 中. 如下图
image.png
在顶部菜单 View -> Open subViews 中选中 String
image.png
使用快捷键 ctrl + f 搜索字符串 ssl_client 结果如下图.结果应该只有一个.
image.png
双击进入.如下图.
image.png
点击上图中蓝色内容, 按下 X 键, 进行跟踪.
image.png
点击第二个进去. 会看到这样的视图.(为什么是第二个, 不是第一个, 因为我试过了, 没正确)
image.png
按一下空格键, 就会切换视图, 变成这样.
image.png
接着, 要去菜单中 找到 options -> GeneralNumber of opcode bytes 由0 改为 4.
image.png
点击 OK后, 界面会多出一些内容.
image.png
向上滚动, 找到 _unwind 开始的, 从_unwind 开始, 拿大于10个字符. (我拿了大概30多个)
image.png
将这些字符保存好, 在下面一步中会使用.

2. 准备 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);  // 设置延时找对hook时机(太快函数还没加载出来,太慢app已经发起请求了)

将在第一步中获得的字符, 替换脚本中 hookFlutter 方法 pattern 变量的值. 然后将脚本另存为 hook_ssl.js. 接下来会用到. 下面就开始准备环境了.

3. 安装 frida

在本机上执行.以下命令. ( 需安装了 python.)

pip install frida==16.1.10
pip install frida-tools==12.1.3
pip install objection==1.8.4  

安装完后, 执行 frida --version 查看版本是否正确.

4. 安装 frida-server

frida-server 下载地址

下载完成后, 解压, 接着执行命令.

adb push /Users/yaqi/Downloads/frida-server-16.1.10-android-arm64  /data/local/tmp

接着输入 adb shell 进去对其修改权限

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 目录下执行 ./frida-server-16.1.10-android-arm64, 只要没报错就可以了. 但是目前是不能退出的, 如果想在后台运行, 就在最后加上一个 & 符号. (不建议后台运行, 前台的话, 可以看到是否正在运行.)

5. 验证 frida 与 frida-server 通信

先设置下端口转发.

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. 安装/设置 Charles 及证书保存.

Charles 下载地址

怎么安装, 这里就直接略过了, 直接说怎么设置. 按照我截图的配置即可.

设置 proxy Settings
image.png
设置 SSL Proxying Settings, 添加主机和端口都是 *
image.png
关闭本机代理.取消选中
image.png
保存 Charles 证书.

在 菜单help 中, 选择 SSL Proxyling 将保存证书到本地,

image.png

推送证书到手机.

执行命令
adb push /Users/yaqi/Downloads/charles-ssl-proxying-certificate.pem /sdcard/Download

在手机中安装此证书.

这里不再描述.

7. 手机安装/配置 Brook.apk

Brook 下载地址

启动后界面是这样的.可以不用登录.


image.png

点击右上角的 + , 添加服务器.

image.png

8. 移动证书.

Android 从 7.0 开始,系统不再信任用户 CA 证书(应用 targetSdkVersion >= 24 时生效,如果 targetSdkVersion <24 即使系统是 7.0 + 依然会信任)。也就是说即使安装了用户 CA 证书,在 Android 7.0 + 的机器上,targetSdkVersion>= 24 的应用的 HTTPS 包就抓不到了。所以我们需要将 charles的证书转为系统证书.

Magisk 插件 Move_certificates 推送到手机. 执行命令

adb push /Users/yaqi/Downloads/Move_Certificates-v1.9.zip /sdcard/Download

打开 Magisk -> 模块 -> 从本地安装, 选取 /sdcard/Download 下的插件, 然后重启.

这一步手机必须要 root.

image.png

9. 准备抓包.

  1. 启动 frida-server和设置端口转发(刚才手机重启过了,需要重新启动)
  2. 启动竞品 app.
  3. 打开 Brook, 点击中间的连接.
  4. 启动hook脚本.
frida -UF -l /Users/yaqi/Downloads/hook_ssl.js
image.png

看PC上的 Charles 是不是已经有HTTPS请求了? ok. 本文到此结束,

本文如果对你有帮助, 可以关注并给个赞👍🏻. 谢谢啦.


参考链接.
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
https://www.jianshu.com/p/5cc45dd3f996
https://cloud.tencent.com/developer/article/1979022
https://blog.csdn.net/superwx1985/article/details/136937416
https://www.jianshu.com/p/0db248d3b67f
https://www.jianshu.com/p/ada10d2976f2
https://blog.csdn.net/yuyue_999/article/details/126575819

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容