想用Charles抓包,某些app不让抓怎么办

Posted Jack_Chai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想用Charles抓包,某些app不让抓怎么办相关的知识,希望对你有一定的参考价值。

本文出处:http://blog.csdn.net/chaijunkun/article/details/116133490,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。

基本操作

熟悉抓包的同学一定都知道Charles,功能强大、跨平台,而且还能实现很多基于配置的抓取策略,非常好用。如果你想抓取https协议的调用,必须在客户端(手机端或者其它pc端,总之就是真正访问接口的设备)上进行一些操作。基本步骤是:

  1. 配置客户端网络连接的http代理,具体代理地址以及端口取决于运行Charles的机器配置;
  2. 客户端安装Charles的CA证书(不同Charles主机的CA证书不一样);
  3. Charles主机端同意客户端使用该代理;
  4. 启动客户端开始抓包。

经过上述步骤,目前绝大多数应用就可以实现SSL抓包了。

有些例外

但是有些app在运行时,一旦设置了Charles代理,一些接口就无法访问,主要是在SSL握手时停留在了域名握手后,连接建立,但无法正常通信。

android系统为例,我们都知道,操作系统内将证书分为两个存储区:系统用户.。在7.0之后,系统安全性有很大的提升,其中一项就是针对app开发者提供了网络安全配置选项(networkSecurityConfig),根据此选项指向的特定资源,可以选择只信任系统证书(当然也可以选择连系统的都不信任,只信任自己的。但证书是有失效期的,使用自己的证书代价就是一定要在失效前打包新的证书并确保全量更新,否则未更新用户就一样无法使用了。因此这种用法不是很常见)。

上述基本操作中,Charles的证书是安装在“用户”这个存储区的。因此遇到特殊配置了networkSecurityConfig的app就无法成功抓包。

知道了原理,有没有办法把自己的Charles证书伪装成系统级别的呢?答案是:有。不过,前提需要Root权限

Charles证书安装

上面提到了,先决条件是已获取Root权限。因为品牌和方法众多,这里不再赘述,直接说如何安装证书。

保存证书并重命名

在Charles的菜单中找到Help -> SSL Proxying -> Save Charles Root Certificate…
保存到本地时选择存储格式为pem,这种格式是Android直接可以使用的。

虽然pem格式的证书可以在Android中直接使用,但Android系统对证书的文件名有严格的规范——利用文件名校验文件哈希(hash),利用后缀判断级别。Android系统级别的证书后缀名是“0”。

[hash].[level]

因此想要该证书被正确载入,需要将得到该证书的哈希值。这里用到了openssl命令。

openssl x509 -inform PEM -subject_hash_old -in ***.pem | head -1

如果你使用的是Windows系统,没有head命令也无妨,去掉pem后面的命令,直接查看输出的第一行,即该证书的哈希值。

将证书重命名:

mv ***.pem [hash].0

例如

mv charles.pem 5c9c9fa4.0

传输Charles证书至Android设备

由于参考文献中的命令未能成功执行,本人也并非专业Android开发,因此我使用了替代方案。

这里需要一个adb工具。用来调试Android应用的工具,在很多地方都可以下载到,这里不再赘述。

首先将证书拷贝至/sdcard目录,该目录不需要root权限。

adb push [hash].0 /sdcard

这里就是把上一步生成的证书推送到Android设备的/sdcard目录,但此时文件的用户和用户组还不正确,需要后面修正。

然后使用root权限移动证书到正确的目录,并且修改成正确的访问权限

adb shell
OnePlus5T:/ $ su
OnePlus5T:/ # mv /sdcard/[hash].0 /system/etc/security/cacerts
OnePlus5T:/ # cd /system/etc/security/cacerts
OnePlus5T:/system/etc/security/cacerts # chown root:root [hash].0
OnePlus5T:/system/etc/security/cacerts # chmod 644 [hash].0

上述代码完成了如下内容:

  1. 进入adb脚本的交互模式
  2. 切换至root用户
  3. 将之前保存至/sdcard的证书文件移动到系统证书存储位置
  4. 切换工作目录至系统证书存储位置
  5. 修正证书文件所有者
  6. 修正证书文件访问权限

完成上述操作后,重启Android设备。即可在系统证书下看到Charles证书。

后续抓包流程与常规Charles抓包一致。

参考文献:
[1]春风秋水.如何将CA证书安装到Android的System下
[EB/OL].https://www.cnblogs.com/gwzz/p/13645337.html,2020-09-10.

以上是关于想用Charles抓包,某些app不让抓怎么办的主要内容,如果未能解决你的问题,请参考以下文章

charles进行手机抓包:安全证书不受信任,错误码3 怎么解决下?

XPosed+Charles抓包淘宝App

charles抓包显示乱码解决方法

遇到APP无法抓包怎么办

ios开发用Charles进行抓包的方法

Charles抓包以及解决抓取HTTPS请求unknown的问题