最近需要对 Android 抓包,正好电脑上装了 Bluestacks,就尝试对其抓包。

根据以往的经验,就是在系统里安装证书,然后将代理设置到 App 的指定端口。
但是,突然发现行不通了。Bluestacks 不知何时砍掉了 Wi-Fi 设置,这也不是大问题,通过 Proxifier 可以强制代理。然后尝试安装证书,同样安装不上,无限循环卡在设置密码 / Pin 环节。

经过一番搜索。在 Stackoverflow 是上找到 解决方案。答案是针对 HttpCanary 的。简单来说就是要先获得 root,再通过手工导入证书。

最简单的 root 方案是使用 BS Tweaker 工具,一键 unlock

接着手动导入证书

adb shell
su
mount -o rw,remount /
cp -f /data/data/com.guoshi.httpcanary/cache/HttpCanary.pem /system/etc/security/cacerts/87bc3517.0
chmod 644 /system/etc/security/cacerts/87bc3517.0
touch /data/data/com.guoshi.httpcanary/cache/HttpCanary.jks
chmod 600 /data/data/com.guoshi.httpcanary/cache/HttpCanary.jks

解释一下:

  1. HttpCanary 以前是可以导出证书的,不知为何现在不行了,但可以从 cache 目录里提取到。
  2. 87bc3517 这个值是 pem 证书的 hash,可以通过 openssl x509 -inform PEM -subject_hash_old -in pemfile.pem 获得。
  3. 正常流程中 HttpCanary 会在证书安装成功后建立 HttpCanary.jks 文件,没有该文件 App 会提示证书不正确。

至此,HttpCanary 已经可以正常抓包。既然知道了导入证书的过程,相信 Charles、Fiddler 也可以顺利安装,不过我已经顺利抓到包,就没有再进一步尝试。

在 Reddit 上有 一个帖子 提到可以使用 Root Certificate Manager 安装证书,原理应该和上方脚本差不多。

我发现,HttpCanary 类的软件,比如 Packet Capture、抓包精灵,都有文中提到的问题,有些 App 提供导出证书,但又不知道导到哪去了。
这些 App 面向的大多是开发者,测试环境是很复杂的,除了提供开箱即用的方案,最好留有一些手动配置空间,例如写明检测机制、提供忽略/跳过选项、提供导出证书,而不是在傻瓜操作失败后让使用者束手无策。