本文介绍三种抓包方案.
提示: Android 设备可能需要获取 root 权限, 不同的厂商或者型号有不同的 root 操作方法, 非介绍重点
一. system 分区读写
我们的目标是将用户证书目录下的文件复制到系统证书目录, 但默认情况下 Android 系统的 system 分区为只读, 需要我们挂载为读写.
根据使用的设备进行分类, 可分为: 模拟器或者真机(root).
-
模拟器抓包方案最简单, 无需真机. 但多数模拟器的 Android 版本都比较老(基本为 7.0 及以下), 一些 app 可能会不兼容导致闪退, 再或者某些 app 会主动检测运行环境, 发现模拟器特征也会拒绝运行.
-
使用真机, 具体情况可分为以下三种:
1. Android 7.0 以下
这种场景最简单, 无需特殊配置.
2. Android 7.0+
Android 7.0+ 系统默认不再信任用户证书, 因此一些 https 请求由于证书不被信任, 导致链接建立失败, 需要我们获取到设备 root 权限, 然后挂载 system 分区为读写, 操作命令如下:
# adbd 以 root 权限执行
$ adb root
# 将 /system 目录置于可读写模式
$ adb remount
# 在这一步可能会出现 'Read-only file system' 错误, 如果有的话执行:
$ adb disable-verity (关闭在调试环境下的dm-verity检查)
# 有如下输出, 按照提示重启, 重新执行前两条命令即可
Successfully disabled verity
Now reboot your device for settings to take effect
若以上命令无报错, 说明 system 分区挂载读写成功.
3. Android 10+
高版本的 Android 即使拥有 root 权限, 也不能通过上面的命令达到挂载 system 分区为可读写的目的, 具体表现可能是这样的:
$ adb root
adbd cannot run as root in production builds
$ adb remount
/system/bin/sh: remount: inaccessible or not found
$ adb disable-verity
/system/bin/disable-verity only works for userdebug builds
verity cannot be disabled/enabled - USER build
如果使用了 Magisk root 方案, 可以通过安装 Magisk 模块: Magical Overlayfs达到目的.
Android 14
截止目前(2023.12), Magical Overlayfs 对于 Android 14 的支持还不是很好(手持 Xiaomi 13 Ultra, HyperOS, Android14, 在安装 Magical
Overlayfs 时会报错: Module Setup ext4 image failed, abort
, 也已经有了对应的 Issue)
, 目前是待解决状态.
且自 Android14 版本起, 系统证书目录不再是: /system/etc/security/cacerts/
, 而是 /apex/com.android.conscrypt/cacerts/
, 后续
在推送证书时需要注意.
若 system 分区无法达到挂在读写的目的, 则可以参考 adguardcert 项目, 其原理是创建一个
临时目录, 然后通过 mount --bind 临时目录 /apex/com.android.conscrypt/cacerts/
命令, 将临时目录和系统证书目录绑定挂载, 达到的作用是:
源目录的内容会实时同步到目标目录, 对源目录的任何修改(增删改文件)都会反映到目标目录, 看起来就像两个目录指向同一个文件系统, 但实际上源目录和目标
目录还是两个独立的目录,修改任一目录不会影响另一个目录的内容, 取消挂载后后两个目录互不影响.
可以将 module/post-fs-data.sh
文件中的 AG_CERT_HASH 变量改为要推送到系统证书目录的 hash, 调整完后重新压缩, 然后进入 Magisk 安装, 重
启后即可在 /apex/com.android.conscrypt/cacerts/
目录下看到自定义的证书 hash. 若本步骤已经完成, 则下面的操作可以略过~
如果这些准备完成, 可以看下一步.
二. 信任用户证书
可以使用命令或者 MT管理器 将用户证书复制到系统证书目录下, 参考 shell:
adb shell cp -f /data/misc/user/0/cacerts-added/* /system/etc/security/cacerts/
真机 Android 7.0+ 若想上面的命令不报错, 需要保证 system 分区具有读写权限, 就是步骤一所做的工作.
题外话
记录下远程调试的方法(保证 PC 和 Android 设备在同一局域网):
- 借助 USB 数据线, 执行以下 shell:
# 有线连接成功之后, 执行:
adb tcpip 5555
# 断开 USB 连接后 PC 执行:
adb connect youtIPAddress
- root + 无需 USB
Android 设备安装 shell 终端软件, 例如: termux/termux-app: Termux - a terminal emulator application for Android OS extendible by variety of packages., 然后在终端执行:
su # 获取 root 权限
setprop service.adb.tcp.port 5555 //设置 adbd 监听端口
# 重启 adbd 服务
stop adbd
start adbd
完成后 PC 端执行 adb connect ip
即可.
- adb pair
不同的系统可能有不同的操作路径, 此处以
XiaoMi 13
为例: Android 设备开启”开发者选项”, 进入开发者选项后找到”无线调试”, 打开调试开关, 点击”使用配对码配对设备”. PC 端执行:adb pair IP:port
, 然后输入设备上的配对码即可.