Charles抓包Android的App
因工作原因,偶尔需要对安卓网页的请求进行抓包,之前都是通过正常安装证书来实现对浏览器的https进行抓包,这块没什么大问题。
但最近需要对App进行抓包,由于Android7+(貌似)之后的版本进行限制,普通方式的证书只能对部分App生效(浏览器),找了一圈发现需要把证书装到系统级别去,方法如下:
- 证书重命名,先通过
openssl x509 -subject_hash_old -in charles-ssl-proxying-certificate.pem
得到Hash值($hash),然后把这个文件重命名成 $hash.0 我这里得到的是4aa133f9.0, 加入系统证书里面有同名的hash的话(虽然很少见),后缀就改成$hash.1。 - 把这个目标文件移动到
/system/etc/security/cacerts/
这个文件夹 - 设置-安全-高级设置-加密与凭据-信任的凭据-系统 然后拉到底就可以看到新装的证书了(由于命名未知,所以可以和前面安装到用户级别的证明命名比对)
那么问题来了,我的安卓测试手机是pixel4 Android12,装了Magisk,带了root权限,我先连接手机,然后adb进手机的shell adb shell
,接着获取root权限su
,然后把文件复制过去cp 4aa133f9.0 /system/etc/security/cacerts/
这时候确得到了Read-only file system
这个报错
然后各种google 百度,找到的无非就是 mount -o remount rw /system
或者 mount -o remount rw /
可能是以为系统版本问题都没有用,最终花了不少时间才搞定,记录如下
- Superuser (Grant permission to shell on your phone)
$ adb shell
$ su
# whoami
root
- Create a separate temp directory, to hold the current certificates
mkdir -m 700 /sdcard/Download/files/
- Copy the existing certificates
cp /system/etc/security/cacerts/* /sdcard/Download/files/
- Create an in-memory mount
mount -t tmpfs tmpfs /system/etc/security/cacerts
- Copy the existing certs back into the tmpfs mount
mv /sdcard/Download/files/* /system/etc/security/cacerts/
- Copy the new certificate, the cert file should be named in the hash.0 format (See @gcaillet 's comment)
cp /sdcard/Download/cert/4aa133f9.0 /system/etc/security/cacerts/
- Update the perms & selinux context labels, so everything is as readable as before
chown root:root /system/etc/security/cacerts/*
chmod 644 /system/etc/security/cacerts/*
chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*
- Don't reboot
最终挂上charles代理后,打开Youtube App测试,成功抓到完整的内容,踩坑结束。
补充:
以上流程操作后,每次重启会重置系统证书,可以通过安装Magisk模块解决,见 https://github.com/NVISOsecurity/MagiskTrustUserCerts
- 正常安装charles证书到user目录
- 安装MagiskTrustUserCerts模块
- 重启即可
参考链接
- https://blog.csdn.net/weixin_42962924/article/details/123546242
- https://gist.github.com/pwlin/8a0d01e6428b7a96e2eb?permalink_comment_id=3499340
- https://blog.nviso.eu/2017/12/22/intercepting-https-traffic-from-apps-on-android-7-using-magisk-burp/