Charles从入门到精通

Charles从入门到精通

简介

Charles 是在一款网络封包截取工具,也即是我们说的抓包工具。同样的还有Flidder ,不过因为Flidder太丑了所有就选择了Charles。 Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。除了在做移动开发中调试端口外,Charles 也可以用于分析第三方应用的通讯协议。配合 Charles 的 SSL 功能,Charles 还可以分析 Https 协议。 Charles 是收费软件,可以免费试用 30 天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过 30 分钟,并且启动时将会有 10 秒种的延时。

Charles 主要的功能包括:
  • 截取 Http 和 Https 网络封包。
  • 支持重发网络请求,方便后端调试。
  • 支持修改网络请求参数。
  • 支持网络请求的截获并动态修改。
  • 支持模拟慢速网络。
Charles 4 新增的主要功能包括:
  • 支持 Http 2。
  • 支持 IPv6。

安装 Charles

你可以做官网轻松找到下载地址,这里就不多讲了。

如何使用

将Charles 设置成系统代理

启动 Charles 后,第一次 Charles 会请求你给它设置系统代理的权限。你可以输入登录密码授予 Charles 该权限。你也可以忽略该请求,然后在需要将 Charles 设置成系统代理时,选择菜单中的 “Proxy” -> “macOS Proxy” 来将 Charles 设置成系统代理。 20200119154053.jpg 之后,你就可以看到源源不断的网络请求出现在 Charles 的界面中。

值得注意的是,Chrome 和 Firefox 浏览器默认并不使用系统的代理服务器设置,而 Charles 是通过将自己设置成代理服务器来完成封包截取的,所以在默认情况下无法截取 Chrome 和 Firefox 浏览器的网络通讯内容。如果你需要截取的话,在 Chrome 中设置成使用系统的代理服务器设置即可,或者直接将代理服务器设置成 127.0.0.1:8888也可达到相同效果

使用注册码

打开后在help菜单里找到register然后在窗口输入下面的注册码就可以完成注册了。 当然有条件的话还是建议买正版的,毕竟开发不易能持支持还是支持下。

Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4

界面介绍

20200119155433.jpg如上图所示,上面的filter可以根据关键字进行过滤,最上边的structure/sequence可以切换两种不同的视图。

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

过滤网络请求

通常情况下,我们需要对网络请求进行过滤,只监控向指定目录服务器上发送的请求。对于这种需求,以下几种办法:

方法一:在主界面的中部的 Filter 栏中填入需要过滤出来的关键字。例如服务器的地址是:http://feewee.cn , 那么只需要在 Filter 栏中填入 feewee 即可。

方法二:在 Charles 的菜单栏选择 “Proxy”->”Recording Settings”,然后选择 Include 栏,选择添加一个项目,然后填入需要监控的协议,主机地址,端口号。这样就可以只截取目标网站的封包了。如下图所示: 20200119160029.jpg 方法三:在想过滤的网络请求上右击,选择 “Focus”,之后在 Filter 一栏勾选上 Focussed 一项,如下图所示: 20200119160557.jpg 这种方式可以临时性的,快速地过滤出一些没有通过关键字的一类网络请求。

截取移动设备的网络请求

设置代理端口信息

在 Charles 的菜单栏选择 “Proxy”->”Proxy Settings”来设置端口: 20200119160842.jpg

查看本机ip

在 Charles 的菜单栏选择 “Help”->”Local IP Addresses”可以查看本机ip地址: 20200119161109.jpg

在手机上设置代理

以Iphone为例,在 “ 设置 “->” 无线局域网 “ 中,可以看到当前连接的 wifi 名,通过点击右边的详情键,可以看到当前连接上的 wifi 的详细信息,包括 IP 地址,子网掩码等信息。在其最底部有「HTTP 代理」一项,我们将其切换成手动,然后填上 Charles 运行所在的电脑的 IP,以及端口号 8888,如下图所示: IMG_0878.PNG 配置好后,发送任意网络请求会看到Charles弹出请求确认的提示,这里点Allow即可。 现在你可以截取你手机发送的任意请求了。

截取Https通讯信息

在抓取数据的时候我们会发现有些请求是抓取失败了的,像这样: 20200119162107.jpg 这是因为这些是https也就是加了密的,那么如何解析这类的请求呢?

如果你需要截取分析Https协议相关的内容。那么需要安装Charles的CA证书。具体步骤如下。 首先我们需要在 Mac 电脑上安装证书。点击 Charles 的顶部菜单,选择 “Help” -> “SSL Proxying” -> “Install Charles Root Certificate”,然后输入系统的帐号密码,即可在 KeyChain 看到添加好的证书。如下图所示: 20200119162406.jpg 需要注意的是,即使是安装完证书之后,Charles 默认也并不截取 Https 网络通讯的信息,如果你想对截取某个网站上的所有 Https 网络请求,可以在该请求上右击,选择 SSL proxy,如下图所示: 20200119162837.jpg

如果想要截取移动设备上的https请求那么需要在移动设备上安装证书,点击 Charles 的顶部菜单,选择 “Help” -> “SSL Proxying” -> “Install Charles Root Certificate on a Mobile Device or Remote Browser”,然后就可以看到 Charles 弹出的简单的安装教程。如下图所示: 20200119163044.jpg 按照我们之前说的,在设备上设置好 Charles 为代理后,在手机浏览器中访问地址:chls.pro/ssl,即可打开证书安装的界面,安装完证书后,就可以截取手机上的 Https 通讯内容了。不过同样需要注意,iso10以上版本需要在设置里面安装一下描述文件才能使用,默认情况下 Charles 并不做截取,你还需要在要截取的网络请求上右击,选择 SSL proxy 菜单项。 20200119164747.jpg 可以看到现在已经可以抓取https的请求了。

模拟慢速网络

在做移动开发的时候,我们常常需要模拟慢速网络或者高延迟的网络,以测试在移动网络下,应用的表现是否正常。Charles 对此需求提供了很好的支持。 在 Charles 的菜单上,选择 “Proxy”->”Throttle Setting” 项,在之后弹出的对话框中,我们可以勾选上 “Enable Throttling”,并且可以设置 Throttle Preset 的类型。如下图所示: 20200119164908.jpg 如果我们只想模拟指定网站的慢速网络,可以再勾选上图中的 “Only for selected hosts” 项,然后在对话框的下半部分设置中增加指定的 hosts 项即可。

修改网络请求内容

有些时候为了调试服务器的接口,我们需要反复尝试不同参数的网络请求。Charles 可以方便地提供网络请求的修改和重发功能。只需要在以往的网络请求上点击右键,选择 “Compose”,即可创建一个可编辑的网络请求。如下所示:

20200119165412.jpg 我们可以修改该请求的任何信息,包括 URL 地址、端口、参数等,之后点击 “Execute” 即可发送该修改后的网络请求(如下图所示)。Charles 支持我们多次修改和发送该请求,这对于我们和服务器端调试接口非常方便,如下图所示:

给服务器做压力测试

我们可以使用 Charles 的 Repeat 功能来简单地测试服务器的并发处理能力,方法如下。 我们在想打压的网络请求上(POST 或 GET 请求均可)右击,然后选择 「Repeat Advanced」菜单项。接着我们就可以在弹出的对话框中,选择打压的并发线程数以及打压次数,确定之后,即可开始打压。 20200119165554.jpg 悄悄说一句,一些写得很弱的投票网站,也可以用这个办法来快速投票。

修改服务器返回内容

有些时候我们想让服务器返回一些指定的内容,方便我们调试一些特殊情况。例如列表页面为空的情况,数据异常的情况,部分耗时的网络请求超时的情况等。如果没有 Charles,要服务器配合构造相应的数据显得会比较麻烦。这个时候,使用 Charles 相关的功能就可以满足我们的需求。

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

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

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

在 Charles 的菜单中,选择 “Tools”->”Map Remote” 或 “Map Local” 即可进入到相应功能的设置页面。 对于 Map Remote 功能,我们需要分别填写网络重定向的源地址和目的地址,对于不需要限制的条件,可以留空。 20200119165836.jpg 对于 Map Local 功能,我们需要填写的重定向的源地址和本地的目标文件。对于有一些复杂的网络请求结果,我们可以先使用 Charles 提供的 “Save Response…” 功能,将请求结果保存到本地(如下图所示),然后稍加修改,成为我们的目标映射文件。 20200119170021.jpg

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

Rewrite

Rewrite 功能功能适合对某一类网络请求进行一些正则替换,以达到修改结果的目的。 例如,我们的客户端有一个 API 请求是获得用户信息,而当前用户电话是 “187****1915”,如下所示: 20200119170332.jpg 接下来我们启用Rewrite后设置规则: 20200119170834.jpg 20200119171134.jpg 20200119171217.jpg 20200119171252.jpg 可以看到电话号码已经改变了。

Breakpoints 功能

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

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

下图是我们临时修改获取用户信息的 API,将用户的电话号码进行了更改,修改完成后点击 “Execute” 则可以让网络请求继续进行。 20200119171648.jpg 需要注意的是,使用 Breakpoints 功能将网络请求截获并修改过程中,整个网络请求的计时并不会暂停,所以长时间的暂停可能导致客户端的请求超时。

反向代理

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

设置外部代理,解决与翻墙软件的冲突

Charles 的原理是把自己设置成系统的代理服务器,但是在中国,由于工作需要,我们常常需要使用 Google 搜索,所以大部分程序员都有自己的翻墙软件,而这些软件的基本原理,也是把自己设置成系统的代理服务器,来做到透明的翻墙。

为了使得两者能够和平共处,我们可以在 Charles 的 External Proxy Settings 中,设置翻墙的代理端口以及相关信息。同时,我们也要关闭相关翻墙软件的自动设置,使其不主动修改系统代理,避免 Charles 失效。

最后

通过 Charles 软件,我们可以很方便地在日常开发中,截取和调试网络请求内容,分析封包协议以及模拟慢速网络。用好 Charles 可以极大的方便我们对于带有网络请求的 App 的开发和调试

# 前端 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×