抓包工具Charles从入门到入土

本文最后更新于:2023年3月29日 下午

简介

image Charles 是在 Mac 下常用的网络封包截取工具,通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。

Charles 是收费软件,可以免费试用 30 天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过 30 分钟,并且启动时将会有 10 秒种的延时。因此,该付费方案对广大用户还是相当友好的,即使你长期不付费,也能使用完整的软件功能。只是当你需要长时间进行封包调试时,会因为 Charles 强制关闭而遇到影响。

主要功能

  • 截取 Http 和 Https 网络封包;
  • 支持重发网络请求,方便后端调试;
  • 支持修改网络请求参数;
  • 支持网络请求的截获并动态修改;
  • 支持流量控制,可以模拟慢速网络以及等待时间(latency)较长的请求;
  • 支持 AJAX 调试,可以自动将 json 或 xml 数据格式化,方便查看;
  • 支持 AMF 调试,可以将 Flash Remoting 或 Flex;
  • Remoting 信息格式化,方便查看;
  • 检查 HTML,CSS 和 RSS 内容是否符合 W3C 标准。

安装

设置系统代理

image

紧接着,软件中就会出现抓取的网页信息:

image

Charles 主要提供两种查看封包的视图,分为 Structure 和 Sequence:

  • Structure 视图将网络请求按访问的域名分类;
  • Sequence 视图将网络请求按访问的时间排序。

获取手机上的网络封包

  • 打开代理功能

    在 Charles 的菜单栏上选择 “Proxy”->”Proxy Settings”,填入代理端口 8888,并且勾上 “Enable transparent HTTP proxying” 就完成了在 Charles 上的设置。如下图: image

    image

  • 获取电脑 IP

    Charles 顶部菜单的 “Help”->”Local IP Address”,即可在弹出的对话框中看到 IP 地址,如下图:

    image

    image

  • 手机设置代理连接

    一定一定,手机和电脑要处于同一局域网下。 在手机的网络设置中,填入刚才获取到的电脑 IP 和 Charles 上设置的端口,如下图:

    image

    image

    完事之后,打开手机上任意需要联网的程序,就可以在 Charles 上看到请求连接的确认提示,点击确认,如下:

    image

截获 HTTPS

必须安装 Charles 的 CA 证书,不然 HTTPS 的返回结果会是一堆乱码。

首先我们需要在 Mac 电脑上安装证书。点击 Charles 的顶部菜单,选择 “Help” -> “SSL Proxying” -> “Install Charles Root Certificate”,然后输入系统的帐号密码,即可在 KeyChain 看到添加好的证书。如下图:

image

如果我们需要在手机上截取 Https 的内容,还需要在手机上安装相应的证书。点击 Charles 的顶部菜单,选择 “Help” -> “SSL Proxying” -> “Install Charles Root Certificate on a Mobile Device or Remote Browser”,然后就可以看到 Charles 弹出的安装教程。如下图:

image

image

在设备上设置好 Charles 为代理后,在手机浏览器中访问地址:chls.pro/ssl ,即可打开证书安装的界面,安装完证书后,就可以截取手机上的 Https 内容了。

模拟低速网络

在做移动开发的时候,我们常常需要模拟慢速网络或者高延迟的网络,以测试在移动网络下,应用的表现是否正常。Charles 对此需求提供了很好的支持。

在 Charles 的菜单上,选择 “Proxy”->”Throttle Setting” 项,在之后弹出的对话框中,我们可以勾选上 “Enable Throttling”,并且可以设置 Throttle Preset 的类型。如下图:

image image

如果我们只想模拟指定网站的慢速网络,可以再勾选上图中的 “Only for selected hosts” 项,然后在对话框的下半部分设置中增加指定的 hosts 项即可。

给服务器做压力测试

我们可以使用 Charles 的 Repeat 功能来简单地测试服务器的并发处理能力,我们在想打压的网络请求上(POST 或 GET 请求均可)右击,然后选择 「Repeat Advanced」菜单项,如下图:

image

接着我们就可以在弹出的对话框中,选择打压的并发线程数以及打压次数,确定之后,即可开始打压。

image

反向代理

Charles 的反向代理功能允许我们将本地的端口映射到远程的另一个端口上。例如,在下图中,我将本机的 8080 端口映射到了远程(pangao1990.github.io)的 80 端口上了。这样,当我访问本地的 8080 端口时,实际返回的内容会由 pangao1990.github.io 的 80 端口提供。

image image

修改服务器返回内容

根据具体的需求,Charles 提供了 Map 功能、 Rewrite 功能以及 Breakpoints 功能,都可以达到修改服务器返回内容的目的。这三者在功能上的差异是:

  • Map 功能适合长期地将某一些请求重定向到另一个网络地址或本地文件。
  • Rewrite 功能适合对网络请求进行一些正则替换。
  • Breakpoints 功能适合做一些临时性的修改。

Map 功能

Charles 的 Map 功能分 Map Remote 和 Map Local 两种,顾名思义,Map Remote 是将指定的网络请求重定向到另一个网址请求地址,Map Local 是将指定的网络请求重定向到本地文件。

在 Charles 的菜单中,选择 “Tools”->”Map Remote” 或 “Map Local” 即可进入到相应功能的设置页面。

image

对于 Map Remote 功能,我们需要分别填写网络重定向的源地址和目的地址,对于不需要限制的条件,可以留空。下图是一个示例,我将所有 www.baidu.com 的请求重定向到了 pangao1990.github.io 。

image

对于 Map Local 功能,我们需要填写的重定向的源地址和本地的目标文件。对于有一些复杂的网络请求结果,我们可以先使用 Charles 提供的 “Save Response…” 功能,将请求结果保存到本地(如下图),然后稍加修改,成为我们的目标映射文件。

image

将一个指定的网络请求通过 Map Local 功能映射到了本地的一个经过修改的文件中。

image

Map Local 在使用的时候,有一个潜在的问题,就是其返回的 Http Response Header 与正常的请求并不一样。这个时候如果客户端校验了 Http Response Header 中的部分内容,就会使得该功能失效。解决办法是同时使用 Map Local 以下面提到的 Rewrite 功能,将相关的 Http 头 Rewrite 成我们希望的内容。

Rewrite 功能

Rewrite 功能功能适合对某一类网络请求进行一些正则替换,以达到修改结果的目的。例如,我博客返回的昵称是“潘高”,我现在要改成“大帅哥”,如下图:

image image image

Breakpoints 功能

上面提供的 Rewrite 功能最适合做批量和长期的替换,但是很多时候,我们只是想临时修改一次网络请求结果,这个时候,使用 Rewrite 功能虽然也可以达到目的,但是过于麻烦,对于临时性的修改,我们最好使用 Breakpoints 功能。

Breakpoints 功能类似我们在 Xcode 中设置的断点一样,当指定的网络请求发生时,Charles 会截获该请求,这个时候,我们可以在 Charles 中临时修改网络请求的返回内容。

需要注意的是,使用 Breakpoints 功能将网络请求截获并修改过程中,整个网络请求的计时并不会暂停,所以长时间的暂停可能导致客户端的请求超时。



如果这篇文章对你有帮助,或者想给我微小的工作一点点资瓷,请随意打赏。
潘高 微信支付

微信支付

潘高 支付宝

支付宝


抓包工具Charles从入门到入土
https://blog.pangao.vip/抓包工具Charles从入门到入土/
作者
潘高
发布于
2019年1月28日 下午
更新于
2023年3月29日 下午
许可协议