现在啊, 想APP抓包, 必须得上点手段了, 没有以前那么简单了. 一开始还没意识到竞品是使用 flutter
开发的, 直接使用 Charles
发现抓不到竞品的任何请求, 直到我将竞品APK解压, 在lib中看到了 libflutter.so
文件.
网上找了很多, 很多方案都是使用 frida hook
+ postern
+ 代理工具这三个组合对其进行组合的. 下面我就整理了一下这次的抓包详细经历.
备注: 如果只是想抓普通 APP 的 HTTPS 请求, 只需要执行第 6,7,8步即可.
为什么普通方式没办法抓到 flutter 开发的Http包呢?
- 它不走系统代理,
- 它不支持设置代理.
- 它不信任系统证书, 它内置进行ssl 证书校验.证书校验写在了 so 文件里.
那么要解决的问题有2点
- 针对证书校验的问题, 我们使用
frida
去hook
libflutter.so
中的函数. - 不走系统代理, 我们就使用基于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, 进入到 lib
下arm64-v8a
目录中找到 libflutter.so
, 将其拖入到 IDA 中. 如下图
在顶部菜单 View
-> Open subViews
中选中 String
使用快捷键 ctrl
+ f
搜索字符串 ssl_client
结果如下图.结果应该只有一个.
双击进入.如下图.
点击上图中蓝色内容, 按下 X
键, 进行跟踪.
点击第二个进去. 会看到这样的视图.(为什么是第二个, 不是第一个, 因为我试过了, 没正确)
按一下空格键, 就会切换视图, 变成这样.
接着, 要去菜单中 找到 options
-> General
将 Number of opcode bytes
由0 改为 4.
点击 OK后, 界面会多出一些内容.
向上滚动, 找到 _unwind
开始的, 从_unwind
开始, 拿大于10个字符. (我拿了大概30多个)
将这些字符保存好, 在下面一步中会使用.
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 及证书保存.
怎么安装, 这里就直接略过了, 直接说怎么设置. 按照我截图的配置即可.
设置 proxy Settings
设置 SSL Proxying Settings, 添加主机和端口都是 *
关闭本机代理.取消选中
保存 Charles 证书.
在 菜单help
中, 选择 SSL Proxyling
将保存证书到本地,
推送证书到手机.
执行命令
adb push /Users/yaqi/Downloads/charles-ssl-proxying-certificate.pem /sdcard/Download
在手机中安装此证书.
这里不再描述.
7. 手机安装/配置 Brook.apk
启动后界面是这样的.可以不用登录.
点击右上角的 +
, 添加服务器.
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
.
9. 准备抓包.
- 启动
frida-server
和设置端口转发(刚才手机重启过了,需要重新启动) - 启动竞品 app.
- 打开
Brook
, 点击中间的连接. - 启动hook脚本.
frida -UF -l /Users/yaqi/Downloads/hook_ssl.js
看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