App 抓包利器:Charles 以及 App 爬虫心得

答疑·限时优惠

如果,你想让我看见你的疑问并且百分之百的回答。可以加入我的知识星球。
AI悦创·进化岛
AI悦创·进化岛

整理不易,欢迎关注公众号:AI悦创,如果你想快速入门点击此阅读:

https://mp.weixin.qq.com/s/hxWpw5lydfRyqki45xly1Q

公众号:AI悦创

1. 前言

介绍移动端 app 抓包主流工具 Charles,以及具体使用心得,如何抓包普通的 http 的请求,和更高级的加密的https 的请求以看到明文数据。再介绍 Charles 使用期间的注意事项,常见的坑等。

期间涉及到如何给手机端安装 Charles 的 ssl 的 CA 证书,如何配合 XPosed,JustTrustMe 等框架、工具,插件等去实现绕过 ssl 证书绑定从而破解 https,如何选择合适的可以用上 JustTrustMe 的安卓模拟器或者安卓真机。

2. 简介

之前有需求是,想要抓取 app 内的数据包,以便于分析 app 调用了哪些 api,请求和响应分别是什么。

而 app 中 api 的请求,包括 http 和 https 的数据包。

市面上也有很多用来抓包的工具:

  • Wireshark:之前Windows系统中用过,功能也还是很强大的:https://www.wireshark.org/
  • FiddlerWindows系统中很强大的抓包工具,之前也简单用过:https://www.telerik.com/fiddler
    • 后来也支持 Linux
      • 所以Mac也可以用了
  • tcpdump:一个运行在命令行下的嗅探工具:https://www.tcpdump.org/
  • mitmproxyMan-In-The-Middle Proxy的简称,免费和开源的交互式代理工具:https://mitmproxy.org/

关于Mac中的抓包工具,最后经过折腾和比较,发现的Charles很好用。

经过一段时间的使用,有些心得和经验,整理如下供参考。

即:

此处主要介绍,用于Mac中网络抓包的工具:Charles

目前主要被自己用来去配合抓包安卓的app中的网络请求,尤其是部分app内部用https通信,此处用Charles配合其他工具,实现绕开https,抓包看到https的明文数据。

3. 如何抓包 app

此处介绍如何用 Charles 去抓包 app,包括:

  • 相对简单的普通的http
  • 加密的比较复杂的https

3.1 普通 http 请求

此处接着介绍,如何用 Charles 抓包 app 中普通的 http 的请求。

这个相对比较简单,不复杂。所以下面的相关配置也都是通用的。

核心逻辑:

  • 电脑:Mac 或 Windows
    • Charles 中设置 HTTP 代理
    • 设置代理的端口
  • 手机等移动端中设置 Charles 的代理
    • Wifi 中设置手动代理
      • IP 地址
      • 端口

下面详细解释如何操作:

3.2 用 Charles 抓包 app 中普通 http 包的流程(并配置)

3.2.1 PC 端设置 Charles 的 HTTP 代理

Proxy -> Proxy Settings -> Proxies -> HTTP Proxy

img

  • Port:
    4455
    
    • 默认是8888
    • 可以改为自己想要的任意端口
  • (默认已)勾选:
    • Support HTTP/2
    • Enable transparent HTTP proxying

3.2.2 给移动端手机中设置 WiFi 代理为 Charles

简答:

  • 确保电脑和手机是同一个网络
    • 注意:
      • 电脑端是要有线网络
        • 后续会有详细解释如何操作
      • 手机端可以是 Wifi 无线网
  • 然后设置手机端 Wifi 代理为 Charles 所在电脑的 IP 和 Charles 的 HTTP 代理的端口

详解:

去给手机端设置 Wifi 代理为 PC 端的 Charles

基本思路:

设置 -> 点击当前Wifi进入详情页 ->代理改为手动 -> 输入 IP 和端口

  • 代理 IP:Charles 所在电脑的 IP
    • 此处的有线网络的IP是:
      10.108.129.125
      
      • img
  • 代理端口:Charles 中 HTTP Proxy 设置的端口
    • 此处:4455

举例:

  • Android

    img

  • iOS

    img

关于手机端设置 Wifi 代理的详细介绍,参见后续章节:移动端设置Wifi代理

3.2.3 Charl开启抓包

Charles 中点击录制按钮:

3.2.4 手机中开始使用 app

手机中打开和使用你的(要抓包的)app

比如用浏览器打开网页,打开和使用某个你要抓包的app(其内部会访问网络,调用服务器接口,获取数据等)

比如此处打开网易云音乐

3.2.5 Charles 可以正常抓包

接着就可以用 Charles 愉快的抓包和分析 http 的请求了:

3.2.6 移动端设置 Wifi 代理

下面详细介绍移动端设置 Wifi 代理为 Charles:

注:下面设置 Charles 的 Wifi 代理的 IP,各自不同,请忽视,改用你自己的 Charles 的端口即可。

3.2.6.1 安卓中设置 Wifi 代理为 Charles
3.2.6.2 小米4中设置的 Wifi 代理为 Charles

img

img

img

3.2.6.3 小米9中设置的 Wifi 代理为 Charles

img

3.2.6.4 锤子中设置的 Wifi 代理为 Charles

img

img

img

img

3.2.7 iOS 中设置 Wifi 代理为 Charles

iPhone 6为例来解释,如何给iOS设置 Wifi 代理为 Charles

设置 -> Wifi -> 点击你的Wifi -> HTTP代理 -> 配置代理
  • 手动
    • 默认是关闭,此处改为手动
  • 服务器:10.108.129.57
  • 端口:5678

img

img

img

img

3.3 Charles 抓包普通 http 的常见问题

3.3.1 手机端已设置 Charles 代理但无法使用网络

手机端已经设置了 Charles 的代理,但是:

  • 手机端还是无法上网
    • 甚至 app 都没有网络了
  • Charles 中也无法抓到包

这种情况有多种可能:

3.3.2 PC 端要用有线网络而不能使无线 WiFi

如果各种配置都正常,但是手机端还是无法上网:

  • 小米4无法访问网络

  • 锤子M1L中无法使用访问

这时候可以去试试:

把 PC 端网络,从无线的Wifi换成有线的LAN口的网络。

3.3.3 Mac 中如何使用有线网络

  • 关闭无线Wifi

  • 电脑接上有线网络

    • 此处Mac Pro默认没有网口,可以用USB转网口转换器

    • 然后接到Mac上:

    • img

    • 电脑上即可看到:

    • 有线网卡:AX88179 USB 3.0 to Gigabit Ethernet

    • 和对应IP地址:10.108.129.57

      img

3.3.4 有线和无线网络的 IP 地址范围略有不同是正常的

很明显,此处

  • 有线网络 IP 是:10.108.129.xxx
  • 而无线网络IP是:10.108.132.xxx

看起来不像同属一个网络,

但实际上也是同属于一个局域网的

是正常的,不需担心

3.3.5 手机端首次使用网络时,Charles 要点击 Allow 去允许使用网络才行

注意到手机端刚刚设置 Charles 的 Wifi 代理后,手机中的 Wifi 会提示:已连接,但是无法访问互联网

已连接,但是无法访问互联网

意味着:此时手机还无法正常使用网络

原因:其他设置了代理为 Charles 的设备,在第一次使用网络时,Charles 会弹出是否允许使用网络:

A connection attempt to Charles has been made from the host x.x.x.. You should only allow
access to Charles to trusted users. If you deny this attempt you will not be asked again for this host
address until you restart Charles. Access controls are maintained in the Access Control Settings in the
Proxy menu.

Charles弹框提示是否允许网络

此时要点击Allow去允许使用网络,然后手机端才能正常使用Charles代理去访问网络。

之后你可以在:

Proxy -> Access Control Settings

中看到你的手机的IP:

3.3.6 Charles 抓包看到 unknown 是什么意思

从上述的普通http的抓包信息中可以看到:

对于https的请求来说,Charles中抓包:

  • 接口显示的是:<unknown>
  • Method 是:CONNECT
    • 顺带解释一下 CONNECT 的含义
      • 是 HTTP 的 8 中 Method 中的一种
      • 作用是:
        • HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器
        • 并非所有的 http 隧道支持 connect 方法
        • Http 隧道分为两种
          • 不使用 CONNECT 的隧道
          • 使用 CONNECT 的隧道
        • 总之:
          • Http CONNECT 相当于客户端和服务器之间建立的一个隧道
          • 而通过这个隧道的请求是加密的
            • 所以 CONNECT 方式的请求使用抓包是抓不到

是无法查看 https 的原文,明文的信息的。

想要 Charles 抓包 https 的话,相关设置要稍微复杂一点。

详见后续内容:复杂的https请求

3.4 复杂的 https 请求

接着介绍如何用 Charles,配合其他相关工具,如夜神安卓模拟器,XPosed 框架或太极 Magisk 框架,以及插件JustTrustMe 等,去实现抓包 app 中加了密的 https 的请求,即绕过 https,看到明文的数据。

3.4.1 Charles 抓包移动端 app 的 https 请求的流程

核心步骤和思路:

  • 电脑中
    • 安装Charles的根证书
      • Mac
        • 用钥匙串去信任 Charles 的根证书
    • Charles 中
      • 启用 Enable SSL Proxying
        • 再设置对应的过滤 api 地址
  • 手机
    • app 中
      • 安装 Charles 的根证书
        • 注意类型选择为:VPN和应用
          • 不要选择:WLAN
        • 确保证书安装成功
          • 受信任凭据 -> 用户 中可以看到已安装的 Charles 证书

下面详细介绍如何操作。

3.4.2 Charles 中开启 SSL 代理

Proxy -> SSL Proxying Settings -> SSL Proxying -> Enable SSL Proxying

然后去点击Add,设置为:

  • Host: *
  • Port: *

设置后是:

设置后是:

  • Location:*:*
  • 表示:针对所有的 https 的请求都 启用SSL代理
  • 这样所有的 https 的请求,都可以看到解密后的明文了

3.4.3 电脑中安装并信任Charles根证书

此处以 Mac 为例,解释如何在 Mac 中安装 Charles 根证书,并设置信任。

通过 Charles 中的帮助,把 Charles 的根证书安装到当前电脑中

点击 Charles 的

Help -> SSL Proxying -> Install Charles Root Certificate

会弹出 (调用 Mac 的)钥匙串 KeyChain Access,去其中设置信任 Charles 的根证书:

即可看到证书从红色蓝色➕加号的:

此证书已标记为受此账户信任

3.4.4 移动端安装 Charles 的 ssl 证书

接着就是去移动端的手机中安装 Charles 的 ssl 证书。

核心步骤:

得到 Charles 的手机端的证书

  • 有两种方式
    • 自己下载
      • 手机端打开 http://chls.pro/ssl 会自动弹框去下载得到 ssl 证书
        • 比如:charles-ssl-proxying-certificate.pem
        • 注意:事先要给手机端设置好 Charles 的代理,否则只能打开和看到普通网页,无法弹框下载
    • 从别处拷贝
      • 从 PC 端 Charles 导出手机端要安装的证书
        • 比如:charles-ssl-proxying-certificate.cer
      • 别人下载好的 或 你自己之前下载好的,拷贝或发送到手机端
  • 去安装证书
    • 直接点击即可开始安装
      • 如果不行,则通过从存储设备安装去安装,确定是可以安装的
    • 安装期间的设置
      • 凭据类型:VPN和应用
        • 不能选WLAN
    • 安装完毕后确定安装成功
      • 受信任的凭据 -> 用户 中可以看到已安装XK72 Ltd Charles Proxy CA字样的证书

详细过程:

详见后续的:移动端安装 Charles 的 ssl 证书

3.4.5 移动端安装 Charles 的 ssl 证书

此处整理,如何到移动端手机中安装 Charles 的 ssl 证书。

3.4.6 安卓中安装 Charles 的 ssl 证书的典型步骤

1. 通过浏览器下载 Charles 的 ssl 证书

在给安卓中设置了 Wifi 代理为Charles 之后,再去安卓端浏览器打开:

http://chls.pro/ssl

其会自动跳转到

http://charlesproxy.com/getssl

然后会自动弹框去下载证书文件

注意:不要用微信去打开,改用手机中单独的浏览器,比如QQ浏览器去打开

2. 安装 Charles 的 ssl 证书

找到下载好的证书文件:

点击去安装,正常情况下,可以弹出用安装证书所用工具。

比如:

  • 从微信等方式发送到手机端后点击证书显示的证书安装工具

小米4中用浏览器下载到getssl.crt后点击弹框选择证书安装工具

然后后续就是正常的安装证书的过程了。

另外,很多设备真正安装证书之前,需要进入设置 PIN 码或解锁图案的设置界面,比如:

小米9

小米4

正常的证书安装过程是:

进入为证书命名界面,输入证书名:

此处是:

  • 证书名称:Charles M1L
    • 注:
      • 此处可以随意命名
      • 一般命名中包含 Charles,更易于后期识别
  • 凭据类型:VPN和应用
    • 注意:
      • 有两个选项:

  • 应该VPN和应用
  • 不要WLAN
    • 我之前错误理解为:此处 Charles 代理是用于 Wifi,所以要选 WLAN

然后就会显示toast提示:已安装 xxx

3. 确认 Charles 证书已正确安装

接下来再去确认 Charles 证书已正常安装:

受信任的凭据 -> 用户 中可以看到已安装的证书:

XK72 Ltd
Charles Proxy CA

点击后可以看到 Charles 证书的详情:

另外,小米9中,还可以通过用户凭据中看到已安装的证书:

3.4.7 iOS 中安装 Charles 的 ssl 证书的典型步骤

iOS 中安装 Charles 的 ssl 证书的过程,和安卓中基本上是一样的。

此处以 iPhone 为例去解释具体过程。

在确保 iPhone 中也已经设置了 Wifi 的代理为 Charles 后,用 iPhone 中的 Safari 去打开:

http://chls.pro/ssl

其内部也会自动跳转到:

http://charlesproxy.com/getssl

弹框提示:

此网站正尝试打开"设置"以向您显示一个配置描述文件。您要允许吗?

点击允许后,进入 安装描述文件 页:

点击安装后,继续点击安装,弹出菜单后选择安装:

稍等片刻即可安装成功:

签名者 会显示绿色的 已验证✔️

即可。

点击可进入证书详情页:

3.4.8 iOS 10.3+ 还需要信任根证书

对于iOS 10.3之后的系统,还需要再去信任根证书才可以:

设置 → 通用 → 关于本机 → 证书信任设置

去点击勾选:Charles Proxy CA

3.5 移动端安装 Charles 的 ssl 证书的心得

1. 手机中安装了ssl证书后

会导致手机不安全,系统会有安全警告,如果后续不用,记得删除掉

成功安装Charles的ssl证书后,导致增加了中间人攻击的风险,手机变得不够安全,所以系统会有安全提示:

网络可能会受到监控 受到不明第三方的监控

比如:

  • 小米4

  • 某安卓真机

点击后,可以查看到对应的证书,即此处的 Charles 证书

  • 网易 MuMu 安卓模拟器

所以:如果在你调试抓包完毕之后,不再抓包时,记得卸载掉手机中的 CA 证书:

让手机恢复安全。

2. 部分应用的H5页面会有警告和提示

目前已经发现的有:

  • 小米9 安卓9.0
    • 安装了Charles的ssl证书后
      • 京东app
        • 打开H5页面会提示
          • 当前网站证书不可信且证书链长度为1,可能是服务器没有配置完整证书链,是否信任并继续访问?

点击后,可以看到的确是Charles的证书

有时候此警告会频繁跳出,点击关闭的速度都赶不上跳出警告的速度,导致无法正常继续查看页面内容

  • 支付宝app

  • 在用支付宝支付时,会弹出当前支付环境不可信,是否继续支付 之类的提示

3. 要先设置手机中Wifi代理为Charles后才能下载到ssl证书

在手机端浏览器打开:

http://chls.pro/ssl

去下载 ssl 证书文件之前,千万记得要去手机端给 Wifi 设置 Charles 的代理,才可以。

否则就会显示出普通的网页,而不会出现弹框和下载证书文件。

而无法看到,弹出下载文件的弹框的,无法下载到证书文件。

4. 不同移动端下载到的证书名和格式不太相同

经过多次的折腾而了解到,不同的移动端

  • 真机:小米4
  • 真机:小米5,红米5A
  • 模拟器:网易MuMu Mac版
  • 模拟器:夜神 Mac版

等,在浏览器打开

http://chls.pro/ssl

会自动弹框,去下载到的Charles的ssl证书,不同手机端往往有不同的文件名和后缀。

典型的有:

真机:锤子M1L Android 6.0.1

  • pem文件:charles-ssl-proxying-certificate.pem

真机:小米9 Android 9.0

  • pem文件:charles-ssl-proxying-certificate.pem

  • 真机:小米5红米5A小米4

    • crt文件:getssl.crt
      • 注:
        • 后来无法正常安装此getssl.crt证书
        • 而改用之前已下载的charles-ssl-proxying-certificate.pem才成功安装到小米4中
  • 模拟器:网易MuMu
    • crt文件:downloadfile.crt
  • 模拟器:夜神
  • Mac版
    • 直接跳出证书安装界面
      • 不知道,也无需知道证书文件名

目前的理解是:

-》好像是crt和pem的证书文件内部格式是不同的。

-》不过,不论是crt还是pem,都是可以正常安装证书的。

5. 可直接安装证书而并非一定要去下载

对于手机端去安装Charles的ssl证书来说

其实不一定非要根据官网说的,通过浏览器打开

http://chls.pro/ssl

去弹框下载ssl证书文件,再去安装。

而只要得到了Charles的ssl证书文件,即可直接点击去安装即可。

而得到Charles的ssl证书的方法,可以:

  • 直接把之前下载过的证书文件
  • PC端Charles导出的证书文件

发送到手机端即可,然后再安装就行了。

比如:把之前小米9中浏览器下载到的pem证书:

(此处通过微信或QQ去)发送到手机,比如锤子M1L,中:

然后点击去安装证书,后续流程和前面标准过程中就是一样的了。

6. PC 端用 Charles 导出的 ssl 证书文件

可以通过 PC 端的 Charles 去导出 ssl 证书文件:

Help -> SSL Proxying -> Save Charles Root Certificate

导出得到pem文件:

charles-ssl-proxying-certificate.pem

从图中可以看出,也可以导出cer格式的证书文件的。

7. 用某些方式无法正常安装证书

有时候会遇到证书无法正常安装

此时,对应的位置就没有证书:

受信任的凭据 -> 用户 是空的:

img

用户凭据中也是空的:

下面整理一些无法安装证书的情况:

8. 直接点击证书却无法识别和安装

有些手机系统中,直接点击Charles的ssl证书文件,却无法识别和安装

比如小米9中QQ浏览器点击pem证书文件,结果只弹出了爱奇艺,而不是开始安装的界面:

9. 直接从系统设置中搜索到的安装证书是无法直接点击安装的

之前在已下载证书文件(但是应该是没有把证书放到特殊指定位置),然后只是通过安卓系统的设置中,搜索出相关证书选项。

然后去点击安装时,都是无法找到并安装证书的:

比如,小米9中的设置中:

  • 安装证书,点击安装证书,提示没有可安装的证书

安装,点击从存储设备安装,提示没有可安装的证书

10. 有时候从ES文件管理器中点击证书选择证书安装程序去安装都无效

此处还遇到很奇怪的,小米9中,用ES文件管理器,找到已下载的证书了。

选择其他方式去打开:

再去选,觉得应该可以的,证书安装程序

结果都没任何反应,证书最终都没有正确安装。

11. 如果无法安装证书,则可以通过从存储设备安装去安装

如果遇到(前面几种方式)无法安装证书时,可以考虑通过系统设置中的从存储设备安装去安装。

比如:

  • 小米9中是:设置 -> 更多设置 -> 系统安全 -> 加密与凭据 -> 从存储设备安装

小米4中是:设置 -> 其他高级设置 -> 安全和隐私 -> 凭据存储 -> 从存储设备安装

点击从存储设备安装后,进入文件选择界面

注意:刚进入文件选择界面时,会默认显示的最近里往往是空的,看不到我们要的证书文件:

所以要去点击左上角三个横线,去切换到手机的存储设备中:

此处是MI 9

然后找到刚才下载到的证书文件:

点击对应证书文件,此处的pem文件,即可正常继续安装。

3.6 Charles 抓包 https 的一些心得

1. 可以针对单个请求开启 SSL

在去给移动端安装 ssl 证书后:

刚开始没有开启 SSL 时,对于某个 https 的链接:

https://api.music.xiaomi.com

抓包显示的是unknown

右键 -> Enable SSL Proxying 去开启SSL:

后,就可以看到https的明文了:

2. Charles 自带解释如何在移动端安装 ssl 证书

通过 Charles 的:

Help -> SSL Proxying -> Install Charles Root Cerificate on Mobile Device or Remote Browser

则会自动弹出解释:

Configure your device to use Charles as its HTTP proxy on 10.108.129.57:5678, then browse to
chls.pro/ssl to download and install the certificate.

的,意思就是:

手机端,在设置了Wifi代理是Charles后,去打开:

chls.pro/ssl

则可下载和安装证书了。

3. 都设置好了但还是无法看到https的明文

如果按照前面都配置好后,但看到的https都还是加密的数据,还是看不到https的明文。那么:

4. 看到的往往是https的资源文件

比如:

就是:

  • 对于部分https:看到的是红色 unknown
    • 往往是一些核心api,是我们需要破解和看到明文的
  • 对于另外一部分https:可以看到数据
    • 往往是图片等资源文件
  • 其他一些https可以看到明文
    • 但是往往不是核心api接口,不是我们需要的

3.7 如何才能看到 https 的明文

详见后续需要详细解释的:破解https的SSL Pinning

3.8 破解 https 的 SSL Pinning

如果有些 https,在之前设置了好各种证书和配置后,看到的:

  • 要么是unknown
  • 要么是:加密的乱码
  • 要么是:报错无法抓包

而无法看到我们希望的明文数据,则:

最大可能是,对方用了https的SSL pinning

1. 什么是SSL pinning

SSL pinning=证书绑定=SSL证书绑定

对方的 app 内部,只允许,承认其自己的,特定的证书

导致此处 Charles 的证书不识别,不允许

导致 Charles 无法解密看到 https 的明文数据

尤其是:

2. Android 7.0 之后系统如何破解 https 的 ssl pinning

对于 Android 7.0 (API 24) 之后,做了些改动,使得系统安全性增加了,导致:

  • APP 默认不信任用户域的证书
    • -》之前把 Charles 的 ssl 证书,安装到 受信任的凭据 -> 用户 就没用了,因为不受信任了
    • 只信任(安装到)系统域的证书

导致无法抓包 https,抓出来的 https 的请求,都是加了密的,无法看到原文了。

对此,总结出相关解决思路和方案:

  • (努力想办法)让系统信任 Charles 的 ssl 证书
    • 作为 app 的开发者自己:改自己的 app 的配置,允许 https 抓包
      • 重要提醒:前提是得到或本身有 app 的源码
    • 把证书放到受系统信任的系统证书中去
      • 重要提示:前提是手机已 root
  • 绕开 https 不去校验
    • 借助于其他(JustTrustMe 等)工具绕开 https 的校验
      • 重要提示:需要借助其他 XPosed 等框架配合才可以

下面详细介绍每一种方案和具体如何操作:

3. 自己修改 app 去增加配置,允许 https 抓包

通过修改 app 的配置,使得允许 https 抓包

而修改 app 的配置,又分两种:

  • 自己有 app 源码
    • 可以通过修改源码的方式去添加允许 https 抓包的配置
  • 自己没源码,只有 apk
    • 借助第三方工具修改 apk,增加配置,允许 https 抓包

下面详细介绍如何操作:

3.1 通过修改app源码去增加配置允许 htts 抓包

前提:

  • 要么你自己是该 app 的开发者
    • 本身就有源码,就是 app 的拥有者
  • 要么是你想要破解 app 的人
    • 本身就不可能有源码
      • 但是
        • 如果,有技术,有能力,有运气,破解得到 app 源码
          • 那理论上也可以使用此办法
        • 注意:实际情况下,

          往往没机会破解出 app 源码

          • 所以此办法不适用

如果具备修改 app 的源码,则具体操作过程是:

修改AndroidManifest.xml,增加如下配置:

<?xml version="1.0" encoding="utf-8"?>
  <manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                  ... >
    ...
    </application>
  </manifest>

res目录下新建一个xml文件夹,再新建文件:

res/xml/network_security_config.xml

内容为:

3.1.1 手机中已正确安装 Charles 证书
<?xml version="1.0" encoding="utf-8"?>
  <network-security-config>
    <domain-config>
      <domain includeSubdomains="true">你要抓取的域名</domain>
      <trust-anchors>
        <certificates src="user"/>
      </trust-anchors>
  </domain-config>
</network-security-config>

其中:

  • <certificates src="user"/>:信任用户自己安装的证书
  • 手机中没安装Charles证书,但是已有Charles证书文件
<?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config>
        <domain includeSubdomains="true">你要抓取的域名</domain>
        <trust-anchors>
        <certificates src="@raw/证书文件名"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

然后再去:res 目录下新建一个 raw 文件夹

  • 将手机上安装的证书文件放入 res/raw/ 目录下
    • 支持的证书格式:pemca

3.2 用工具修改 apk 增加配置允许 https 抓包

比如借助第三方工具:

https://github.com/levyitay/AddSecurityExceptionAndroid

GitHub 下载较慢,可以点击此链接下载:

去下载源码,再去:

cd AddSecurityExceptionAndroid
./addSecurityExceptions.sh ../xxx.apk

即可给 apk 增加允许 https 抓包的配置了,然后就可以继续用 Charles 抓包 https 了。

3.3 把证书放到系统信任区

  • 背景和思路:既然只信任系统区的证书,那么可以想办法把 Charles 证书放到系统区,就可以被信任了,就可以 https 抓包了
    • 而系统信任的地方
      • 对应安卓的设置中的:受信任的凭据 -> 系统
      • 对应安卓系统目录:/system/etc/security/cacerts/
      • 对应的系统证书的名字有特定规则
        • 需要找到工具根据规则计算出名字后
        • 才能再去把证书放到系统区中
  • 前提:手机已root
  • 详细步骤
    • 计算证书名
      • openssl x509 -subject_hash_old -in charles-ssl-proxying-certificate_saved.pem
      • 算出数值,比如3a1074b3
    • 证书文件改名
      • 然后把原 Charles 证书charles-ssl-proxying-certificate_saved.pem改名为3a1074b3.0
    • 放到系统分区
      • 放到/system/etc/security/cacerts/
  • 注意
    • 但是呢,现在多数手机都很难 root 了
      • 包括我之前的锤子 M1L 和很多常见品牌,比如小米、华为等,的最新手机
    • 如果真的可以 root,那倒是容易此办法去解决 ssl pinning 的问题

3.4 用其他工具绕开https校验实现https抓包

  • 确保了手机已 root 或越狱
    • Android:已 root
      • 确保后续可以安装 Xposed 等工具
    • iOS:已越狱
      • 确保后续能安装 Cydia 等工具
  • 再去用可以绕开/禁止 SSL pinning 的插件
    • Android
      • 基于 Xposed 的 JustTrustMe:https://github.com/Fuzion24/JustTrustMe
        • 限制:
          • 只能支持 Android 7.0 之前的安卓
            • 超过Android 7.0就不工作了
      • 基于CydiaAndroid-SSL-TrustKiller:https://github.com/iSECPartners/Android-SSL-TrustKiller
    • iOS
      • 基于 Cydia 的 SSL Kill Switch 2 :https://github.com/nabla-c0d3/ssl-kill-switch2
        • 旧版本:基于 Cydia 的iOS SSL Kill Switch :https://github.com/iSECPartners/ios-ssl-kill-switch

即可绕开ssl的验证,抓包到https被解密变成明文的数据。

下面详细解释,如何在已 root 的安卓中,借助 XPosed 和 JustTrustMe 去实现,绕开 https 证书校验,实现抓包 https 得到明文数据。

3.5 已 root 的安卓+XPosed+JustTrustMe 破解 ssl pinning

接下来详细,如何在已 root 的安卓中,借助 XPosed 和 JustTrustMe,去实现绕开 https 证书校验,实现抓包https 得到明文数据。

3.6 准备好已 root 的安卓

对于想要获取已 root 的安卓,有两种方式:

  • 对于安卓真机来说
    • 很久之前是很简单的事情
      • 随便买个安卓手机,都容易去 root
    • 现在
      • 大多数手机品牌(小米,华为等)新买到的都是安卓新版本
        • 比如 Android 8.0, Android 9.0之类的
      • 且都很难 root
        • 都要向官方申请,要等很长时间(以月为单位)
          • 申请先解锁 BL=BootLoader
          • 然后才能 root
        • 而且最后还未必通过
      • 结论就是:
        • 现在很难买到能 root 的新安卓手机了
    • 所以
      • 最终方案是:
        • 去淘宝买个二手的已 root 的安卓手机
          • 比如:400元左右的
            • 二手小米4
              • 型号:MI 4 LTE-CU
              • 安卓系统版本:Android 4.4.4
  • 对于安卓模拟器来说
    • Mac中也有很多安卓模拟器
      • 目前测试能用的有
        • 夜神Nox安卓模拟器
          • 模拟的是:Android 4.4.2
        • 网易MuMu安卓模拟器
          • 模拟的是:Android 6.0.1
      • 其他不能用,不好用的有
        • Andy:安装后无法正常运行
        • 天天模拟器:没有我要的Mac版
        • Genymotion:收费的,还要麻烦的去破解,暂时懒得继续试
        • BlueStacks:只支持Win,不支持 Mac,且也比较老旧

如前所述,已 root 的安卓,可以选用:

  • 安卓真机
    • 二手小米4:Android 4.4.4
  • 安卓模拟器
    • 夜神模拟器:Android 4.4.2
    • 网易MuMu:Android 6.0.1

中的任何一个。

此处以Mac中的夜神模拟器为例去解释。

  • Mac 版 夜神模拟器 Nox App Player

已经 root 了

模拟的是:Android 4.4.2

3.7 夜神模拟器

关于夜神的更多解释详见:

好用的安卓模拟器:夜神Nox

3.8 安装 XPosed 框架

在已root的安卓中,安卓XPosed框架。

根据XPosed官网 :https://repo.xposed.info/module/de.robv.android.xposed.installer 解释,XPosed 的版本和安卓版本需要对应,否则无法正常安装和使用:

  • Android 4.0.3 ~ Android 4.4
    • v2.7, v2.6.1XPosed installer
      • 支持:此处基于Android 4.4.2的夜神安卓模拟器
  • Android 5以上
    • 3.x版本的XPosed installer

下面介绍在夜神模拟器中安装XPosed的详细步骤:

下载v2.7的xposed installer的de.robv.android.xposed.installer_v33_36570c.apk

然后拖动到夜神模拟器中,即可自动安装,安装完毕后,可以在桌面上看到:

接着点击进入XPosed Installer,再去安装XPosed框架到安卓系统中:

点击 安装/更新,在弹框中对于 超级用户请求,设置永久记住选择

然后会去安装到系统中,再点击确定去重启:

重启后,看到 XPosed 框架中显示:

app_process 激活 58 程序自带 58
XposedBridge.jar  激活 54 程序自带 54

表示XPosed框架已激活,可以继续使用了。

3.9 XPosed 框架

关于XPosed框架的更多解释详见:

强大的安卓破解辅助工具:XPosed框架

3.10 安装 JustTrustMe

再去下载和安装JustTrustMe:

JustTrustMe的GitHub的release下载JustTrustMe.apk:https://github.com/Fuzion24/JustTrustMe/releases

像安装普通安卓apk一样,拖动进去,即可把JustTrustMe.apk安装到夜神模拟器中。

注意:此JustTrustMe没有app界面,所以安卓后,也没有打开之类的操作。而只能是,去XPosed中才能看到和激活此应用。

然后去XPosed中找到并勾选以激活JustTrustMe

然后记得重启 XPosed:

3.11 Charles 抓包可以看到 https 明文

然后再去用 Charles 抓包:

对于之前没有启动 https 的,抓包 https 看到的都是 unknown 的请求和数据是加密的乱码:

现在,即可绕开app的https的证书校验,从而可以看到明文数据了:

3.12 破解 https 的 ssl pinning 心得

1. 已 root 二手小米4安装 XPosed

淘宝上买的二手的已root的小米4,MI 4LTE-CU,Android 4.4.4

在无端被MIUI自动升级,从MIUI 5.8.5升级为MIUI 7.5.12.17),导致:

  • 丢失了root权限
  • 丢失了卖家原先已安装好的Xposed Installer

需要再去想办法:

  • 重新获取root权限
    • 用360超级Root去重新root

重装可用的Xposed

  • 也是费了番功夫的
    • 重新安装,会报错:Xposed目前不兼容Android SDK版本19或您的处理器架构armeabi-v7a
      • 试了N多个版本,都不行
    • 最后是从这里找到了大神SolarWarez修改后的v2.6的版本的730KB的Xposed
      • XposedInstaller_v2.6.1_by_SolarWarez_20151129.apk
      • XposedInstaller_v2.6.1_MIUI_edition_by_SolarWarez_20151129.apk
    • 才得以正常安装和使用XPosed

4. 抓包相关心得

此处介绍 Charles 抓包相关的一些经验和心得。

1. Charles 抓不到包可能是 IP 换了

心得:如果其他配置都对 Charles 还是没有任何数据包,则注意看看是不是(Charles 所在的 Mac 电脑中的)IP地址变化导致的

详细过程:

之前在 Mac 中用 Charles 抓包,其中 Mac 是连接的有线网卡(无线网卡无法抓包)

后来的某一天,突然抓包不能用了,Charles 中始终看不到请求了

在花了很多精力排除了其他因素后,突然发现此处的 Mac 的(有线网卡的)IP 地址都已经变了:

Mac -> Wifi -> 打开网络偏好设置

中设置。

从而导致安卓中设置的Charles的代理的IP失效,去手机端更新Charles代理的IP,即可继续抓包。

2. Charles 抓不到包,重启有时候就可以了

之前还遇到过,所有的配置都正确,Charles 还是无法抓包,最后是重启 Charles 而解决了问题。

3. 真机不行换模拟器试试

如果真机抓包抓不到,可以试试换成模拟器,对于有些特殊情况,就可以抓包了。

有些请求用安卓真机抓不到,换用安卓模拟器就可以了:

比如:

Mac 中用 Charles 去抓包 一起学(以前叫 家长通) app

  • 安卓真机:小米4
    • 部分请求抓不到:
      • 就是绘本馆的全部列表的请求和接口
      • 注意:不是抓取了无法解密,是根本看不到对应请求,无法抓包
  • 安卓模拟器:Nox 夜神安卓手机模拟器
    • 是可以抓到包的

4. 如果 Charles 无法抓包 https 则可以试试 Fiddler

别人的经验:

尝试用 Fiddler 抓包,上次我用 Charles 半天不行,换成 Fiddler 然后再设置里勾上忽略安全竟然就可以抓了

有机会可以去试试。

5. 手机端不用 Charles 时,记得把代理关闭了

当手机不抓包时(Charles 关闭时),记得把 Wifi 的代理去掉,设置为 无,否则手机无法上网。

5. 相关抓包工具

此处整理,和Charles抓包期间所用到的相关工具的情况。

之前折腾harles去抓包app期间,涉及过的各种工具有:

1. 安卓的移动端

  • 安卓模拟器
    • 安卓4.4.2夜神模拟器Mac版
    • 安卓6.0.1网易MuMu Mac版
  • 安卓真机
    • 安卓6.0.1锤子M1L

安卓4.4.4小米4

注:

  • 淘宝买的二手小米4,已root
  • MIUI版本:MIUI 7

2. 网易 MuMu 中 Charles 有关的心得

2.1 设置了Wifi代理后,会导致重启MuMU时无法启动,卡死在99%

  • 问题背景:给网易MuMU设置了Wifi代理为Mac中的Charles的代理后,重启MuMU,会卡死在99%
  • 解决办法:关于Charles
    • 如需使用Charles,等MuMu正常启动完毕后,再运行Charles

2.2 网易 MuMu 中设置 Wifi 代理为 Charles

旧版本网易MuMu无法设置Wifi代理,现在新版已经可以正常设置Wifi代理(为Charles)了

3. XPosed 类框架

  • XPosed框架
  • VirtualXposed
  • 太极Magisk

4. 禁用 ssl 相关插件

  • JustTrustMe
  • 其他没用过但听说过的
    • Android-SSL-TrustKiller
    • SSL Kill Switch 2

6. 功能相关心得

此处介绍如和Charles本身的功能相关的使用心得。

1. 注册和破解 Charles

  • 如果是免费版Charles,则每隔30分钟就强制重启Charles
    • 很郁闷,无法正常使用
  • 具体的破解办法,网上可以找到很多
    • 此处用的是注册码:
      • Registered Name: https://zhile.io
      • License Key: 48891cf209c6d32bf4

7. 过滤请求

如果需要,可以去开启请求的过滤功能。

这样就可以只看到你所关心的特定的请求了。

1. 过滤特定 api

对于Charles抓包常会遇到一个情况:

默认把所有的api请求都抓出来了,就显得太多太乱,导致想要找到自己关注的那些,不是很容易。

此时,可以去设置过滤特定的api,就可以只显示符合规则的api了。

此处去举例说明:

比如此处只关心:

https://xxx.qupeiyin.xxx/xxx

的api地址,则可以去设置:

  • Host:*.qupeiyin.*:
  • Port:443
    • 因为https的端口都是443

则就可以只显示对应的api的请求了:

  • https://img.qupeiyin.cn
  • https://childapi.qupeiyin.com

等等:

注:此处https接口显示unknown,则是另外的事情了。需要后续去解决破解https的SSL Pinning

8. 显示模式切换

可以在 树状 和 列表 之间切换显示模式。

方便好用之处:在目录结构和顺序显示之间切换

在Sequence期间,想要切换到Structure中,去看看某请求的详细数据

可以 右击 -> Show in Structure

即可切换并定位到对应目录结构中:

方便查找和定位。

9. 其他心得

此处介绍Charles相关的其他方面的心得。

1. Charles代理导致部分应用无法使用网络

比如锤子M1L中,设置了Wifi代理为Charles后:

QQ中的,用于PC端和手机端互传文件的文件助手,给PC端发送非文本消息,比如图片时,就会失败:

但是奇怪的是:

  • 浏览器可以正常上网
  • 微信也还可以正常发送普通包括表情等文本消息的
    • 微信中的文件助手也可以正常发送图片等文件的

2. Charles的CPU占用率奇高导致Mac系统卡

Mac版的Charles v4.2.6,在使用抓包期间,遇到过CPU占用率很高的问题,尤其是抓https的包时:

  • 经常:CPU占用率奇高
    • 导致Mac系统巨卡,印象笔记中输入文字都卡
  • 偶尔:CPU占用率还行,不会导致系统卡

看到提示Charles有新版:4.2.7

升级之前,去看了:

Version History • Charles Web Debugging Proxy

提到了Mac中

macOS: Find dialog no longer uses 100% CPU

但是此处我Mac中Charles的查询对话框,没有导致CPU 100%,而是正常抓包导致CPU占用率接近100%

刚已去升级Charles为4.2.7,等使用一段时间后,看看CPU占用率奇高的问题,是否有改善。

此处,使用了一会,貌似CPU占用率有很大改善,暂时不会导致Mac卡死了:

此处温度也只有60度不到

-》而之前系统卡死,稳定要到70多,80多度。

又试了试,好像的确彻底解决Mac卡顿的问题了?

过了几个月,后续使用发现:Charles有时候还会CPU占用率很高,但是频率还行,不算太高,基本能接受。

附录

下面列出相关参考资料。

参考资料

AI悦创·创造不同!
AI悦创 » App 抓包利器:Charles 以及 App 爬虫心得

Leave a Reply