使用Fiddler对Android进行抓包

近期,使用Fiddler调试Android应用,以下记录一下遇到的问题

将中间人证书安装为系统证书

根据 Android 7 行为更变 的说明

默认情况下,面向 Android 7.0 的应用仅信任系统提供的证书,且不再信任用户添加的证书颁发机构 (CA)。

因此,需要将整数安装为系统证书才可以进行抓包https。

  • 准备:Android已获得Root权限 或 使用TWPR类第三方Recovery

  • /system挂载为可读写

# 转换Fiddler导出的证书(DER编码)为PEM编码
openssl x509 -inform DER -in FiddlerRoot.cer -out cacert.pem
# 计算证书的MD5 Hash
$CERT_HASH=openssl x509 -inform PEM -subject_hash_old -in cacert.pem -noout
# 证书写入到System分区
# 如果已存在同名文件,将 .0 改为 .1 依次类推
adb push cacert.pem "/system/etc/security/cacerts/$CERT_HASH.0"
  • 重启Android即可

Android 模拟器System分区不可写的问题

使用AVD时出现 mount: 'system' not in /proc/mounts 或者 '/dev/block/dm-4' is read-only 等的问题,无法将 /system 分区挂载为可读写

  • 系统镜像选择使用Google Apis版本;Google Play版本为 User Mode,没有Root权限
# 向Emulator启动命令中添加 -writable-system
emulator -avd Pixel_3a_API_30  -no-snapstorage -writable-system

adb root
# adb 取消启动验证
adb shell avbctl disable-verification
adb disable-verity

adb reboot

adb root
adb remount # 此时可挂载为可读写
# Do Something ...
adb shell mount -o ro,remount /system

Fiddler默认签发的证书有效期过长的问题

根据Chromium 证书寿命政策

Beginning with Chrome 85, TLS server certificates issued on or after 2020-09-01 00:00:00 UTC will be required to have a validity period of 398 days or less.

在新版本的 Chrome / Android Webwiew,默认拒绝有效期超过398天的证书

然而Fiddler默认签发的证书有效期长达5年,因此需要修改其证书签发参数

  1. QuickExec 打开 about:config
  2. 添加 fiddler.certmaker.GraceDays 有效期从N天前开始
  3. 添加 fiddler.certmaker.ValidDays 有效期至N天之后

或者 直接在QuickExec中执行

  1. prefs set fiddler.certmaker.GraceDays -5
  2. prefs set fiddler.certmaker.ValidDays -360