注意:阅读本文须要一台已经root的安卓手机!
系统:MacOS 10.13.6 手机:小米6(已root) 抓包工具:Charles 微信版本:7.0.4
安卓手机没法经过Charles代理抓包https请求,我前天(2019年04月16日)用的7.0.3不知道为何能抓到,昨天手残更新到7.0.4就不行了。而iOS(iPhone5S 12.1.4)没有问题。node
查找相关资料,都说微信升级到版本7以后就限制了用户证书凭据。根据网上较多的推荐方案,建议把证书放在系统证书存放目录下,那这就须要Root手机了,若是没有,如下内容不适合阅读。linux
接下来,我尝试将Charles生成的证书放在手机的系统证书中,并无那么顺利,很失败!我慢慢来说解一下。android
咱们要生成一个能够存放在系统证书目录下的可被识别的证书。
手机代理设置好了后,手机访问:<chls.pro/ssl>下载下来证书,名称是这样的charles-proxy-ssl-proxying-certificate.pem
(你把这个文件搞到电脑上,假设该证书存在电脑的路径:~/charles-proxy-ssl-proxying-certificate.pem
)。web
在你的电脑终端经过这个命令生成一个hash值:shell
openssl x509 -subject_hash_old -in ~/charles-proxy-ssl-proxying-certificate.pem
能够看到输出了相似以下安全
P750TM:webs whidy$ openssl x509 -subject_hash_old -in ~/certificate.pem 07e87b3d -----BEGIN CERTIFICATE----- MIIFYjCCBEqgAwIBAgIGAWeQpfWHMA... .... 77JclxPc0UdJHi5rOf7w+LU8YZFPdMTLa/c2JjMlspt08UeQVDE= -----END CERTIFICATE-----
将证书改名07e87b3d.0
注意后缀!bash
接下来你能够用任意手段将该文件拷贝至手机的/system/etc/security/cacerts/
目录,若是成功则再次尝试抓包,若是失败,请继续看。微信
若是不嫌麻烦的话,你彻底能够在安卓手机上面的超级终端(自行下载的工具)进行如下操做,可是我没有这样,我在MacOSX中启用adb链接操做手机,若是你正有此意,请按照个人方式操做。app
电脑终端执行如下命令(这里不介绍brew,不理解的自行学习)tcp
brew cask install android-platform-tools
装好后,数据线连上手机,测试一下
adb devices
没报错,且大概出现如下信息则正常:
List of devices attached * daemon not running; starting now at tcp:5037 * daemon started successfully fa8a05fd device
而后获取root权限,尝试将文件07e87b3d.0
拷贝到/system/etc/security/cacerts/
adb root
得到权限后,直接执行下面命令将证书放入系统目录。
push ~/07e87b3d.0 /system/etc/security/cacerts/
若是成功了,请尝试抓包。若是提示失败,好比权限不足,只读啥的,反正大概错误信息以下:
P750TM:/ whidy$ adb push ~/07e87b3d.0 /system/etc/security/cacerts/ adb: error: failed to copy '/Users/whidy/07e87b3d.0' to '/system/etc/security/cacerts/07e87b3d.0': remote couldn't create file: Read-only file system /Users/whidy/07e87b3d.0: 0 files pushed. 0.0 MB/s (1947 bytes in 0.119s)
那就要继续折腾了。网上抄到的chmod 777目前是无论用的。要经过mount的相关操做来解决这个问题。
查看当前system目录挂载在哪里mount
,能够获得大体以下:
rootfs on / type rootfs (ro,seclabel,size=2828452k,nr_inodes=707113) tmpfs on /dev type tmpfs (rw,seclabel,nosuid,relatime,size=2912600k,nr_inodes=728150,mode=755) devpts on /dev/pts type devpts (rw,seclabel,relatime,mode=600) proc on /proc type proc (rw,relatime,gid=3009,hidepid=2) sysfs on /sys type sysfs (rw,seclabel,relatime) selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime) /dev/block/dm-0 on /system type ext4 (ro,seclabel,relatime,discard,data=ordered) debugfs on /sys/kernel/debug type debugfs (rw,seclabel,relatime) none on /acct type cgroup (rw,relatime,cpuacct) none on /dev/stune type cgroup (rw,relatime,schedtune) tmpfs on /mnt type tmpfs (rw,seclabel,relatime,size=2912600k,nr_inodes=728150,mode=755,gid=1000) none on /config type configfs (rw,relatime) none on /dev/memcg type cgroup (rw,relatime,memory)
注意到/dev/block/dm-0 on /system type ext4 (ro,seclabel,relatime,discard,data=ordered)
这一行,后面括号有个ro,表明readonly!
接下来尝试修改成可写(rw
)状态:
mount -o rw,remount /dev/block/dm-0 /system
若是成功了,就试试将文件拷贝进去,失败了,例如提示:'/dev/block/dm-0' is read-only
,请继续阅读。
这里参考Android O, failed to mount /system, /dev/block/dm-0 is read only,一顿操做!我这边是这样的:
adb disable-verity adb reboot
关闭验证是要重启设备的。执行重启后,继续:
adb root adb remount adb shell
再执行mount
发现结果跟刚才不同了,找到有system的那一行发现这样的
/dev/block/sde43 on /system type ext4 (rw,seclabel,relatime,discard,data=ordered)
已经可写了,我试试拷贝进去。执行adb push ~/07e87b3d.0 /system/etc/security/cacerts/
,出现如下结果:
P750TM:/ whidy$ adb push ~/07e87b3d.0 /system/etc/security/cacerts/ /Users/whidy/07e87b3d.0: 1 file pushed. 0.1 MB/s (1947 bytes in 0.022s)
应该就完成了。再去个人小米6手机里面的设置 > 更多设置 > 系统安全 > 加密与凭据 > 信任的凭据 > 系统
里面看看,滚到最低部,ok,证书导入成功了。再去抓包看看~
我这文章是边写边记录的,如今能够看到https请求的抓包已经Ok啦~
为了手机安全,我建议最后还原一下以前操做过的(若是你再也不测试抓包了请执行)下面命令:disable-verity
命令,执行
adb root adb enable-verity adb reboot
注意:我觉得证书是存好了,把这个从新打开,提升安全性,结构发现打开后,重启,证书又没了。。。因此可能,要想抓包,这个就不能从新开启了
行了差很少就这些了。
写文本有参考阅读的相关文章: