HTTP抓包小记

最近处理一些对第三方应用中HTTPS请求抓包工作。杂七杂八挺烦琐,又容易遗忘。记录之,备不时之需。

抓包工具

抓包工具有很多,选一个顺手的就行。我用的是 whistle。启动方式如下:

1
2
3
4
5
6
7
8
9
10
11
whistle run
[i] whistle@2.6.3 started
[i] 1. use your device to visit the following URL list, gets the IP of the URL you can access:
http://127.0.0.1:8899/
http://172.30.209.45:8899/
http://172.20.209.88:8899/
Note: If all the above URLs are unable to access, check the firewall settings
For help see https://github.com/avwo/whistle
[i] 2. configure your device to use whistle as its HTTP and HTTPS proxy on IP:8899
[i] 3. use Chrome to visit http://local.whistlejs.com/ to get started
Press [Ctrl+C] to stop whistle...

启动后直接在浏览器中打开对应地址开始抓包。

HTTPS 抓包

抓 HTTP 一般不会遇到什么问题,这里要说的主要是 HTTPS 抓包时遇到的问题。

问题一:Android/iOS安装和信任证书

  • Android 直接下载后从 SD 卡安装即可。安装成功后在设置 > 受信任的凭据 > 用户中查看
  • iOS 使用 Safari 浏览器打开证书链接来安装。安装成功后在设置 > 通用 > 描述文件与设备管理中查看。注意iOS上需要手动设置信任第三方证书

-w336

-w396

-w426

经过如上设置后,可以抓到部分应用中的 HTTPS 请求了。但另一些应用的 HTTPS 请求,仍然无法抓取。大致可以归纳为两种原因(部分APP无法代理抓包的原因及解决方法(flutter 抓包)一文总结得不错):

  • HTTP 客户端没有走系统代理。这种情况比较少见,一个典型的例子是 Flutter
  • HTTP 客户端不信任第三方证书。这种情况比较多见,例如 Android 平台上滴滴出行、微信(7.0版本之后)

接下来看Android系统中如何避免应用不信任第三方证书。

问题二:应用不信任第三方证书

两个解决办法:

  • 模拟器(开启root) + 安装系统证书
  • 真机(无root) + VirtualXposed + JustTrustMe

方法一

有多种模拟器可供选择。这里推荐两个自带root功能,并且可成功运行大部分主流应用的模拟器。

  • Windows 上可以使用夜神模拟器
  • Mac 上可以使用 MuMu模拟器

第一步,将whistle 证书下载到电脑上,名字是 root.crt。执行如下命令得到类似 b4a43da9 这样的字符串。

1
openssl x509 -subject_hash_old -in getssl.crt

第二步,将 root.crt 重命名成 b4a43da9.0,安装到模拟器上。

1
adb push b4a43da9.0 /system/etc/security/cacerts/

第三步,设置 > 受信任的凭据 > 系统中检查证书是否安装成功。

将 whistle 证书安装成系统证书后,就可以正常抓取部分应用中的 HTTPS 请求。

方法二

  • 安装 VirtualXposed.apk 和 JustTrustme.apk
  • 给 VirtualXposed 足够的权限
  • 在 VirtualXposed 中安装 JustTrustme 和需要抓包测试的应用
  • 重启 VirtualXposed
  • 在 VirtualXposed 中打开待抓包的应用

参考