安装

Charles Web Debugging Proxy • HTTP Monitor / HTTP Proxy / HTTPS & SSL Proxy / Reverse Proxy (charlesproxy.com)

免费版有使用期限,分享一个在线的激活码生成网站

Charles破解工具 (zzzmode.com)

配置

  1. 电脑安装证书->安装到本地计算机->选择受信任的证书颁发机构
  2. proxy->proxy_setting->端口号
  3. SSL proxy settings->Enable SSL->端口 *:443(443是HTTPS默认端口)
  4. help->local IP address->找到wifi的ip地址->手机wifi(手机电脑连一个wifi)设置手动代理 ip+port
  5. 手机安装证书,先计算hash再用MoveCertificates(一个magisk模块)mount到系统目录(android 13 系统,折腾不来system分区解锁,直接用magisk面具吧)

一些额外操作:

Proxy -> Windows Proxy 可以关闭主机代理,只接收移动端的包

原理

在这里插入图片描述

如上图所示:

  1. 客户端发送请求,客户端可以是安卓手机/ios手机/PC机上的浏览器等
  2. Charles 接收请求,再发送给服务器,这个步骤可以篡改请求内容, 比如请求体的内容,URL GET 方法?之后拼接的参数,Header 中的token,cookie 等
  3. 服务端把响应结果返回给Charles
  4. Charles 把响应结果再转发给客户端,这个步骤可以篡改响应内容

功能

  • 支持HTTP 和 HTTPS 代理
  • 支持流量控制,可以用来模拟弱网环境,设置2G、3G、4G等场景的网络环境
  • 支持断点调试
  • 支持MOCK
  • 支持接口请求并发

界面

image-20240906114417514

左边显示的是Query的网址,右边是总览,包含请求的域名(Host),路径(Path),注释(Notes),协议(Protocols),请求(Requests)的各种信息,请求时间(Timing),请求大小(Size)

还要概要(Summary)和表格(Chart),表示一些详细信息

image-20240906115521835

在这里插入图片描述

断点

先开启断点设置,然后在某个API上右键选择breakpoint,就可以设置断点,断下来以后就可以修改这个请求包的信息了

image-20240906122818360

我们就可以看到表单信息,这里是要用GET方法获取到list1.json

image-20240906122849683

我们给他改成 list2.json,再按 execute,然后会收到一个 Response,这里也会断下来,我们也可以对 Response 进行修改再按excute,一个包的请求响应就结束了

image-20240906123014847

发现获取的就是第二个 list

弱网测试

关注点:

  • APP反应慢的时候是否有友好的提示信息
  • APP弱网情况下,提交数据不会产生重复数据
  • APP 不会出现Crash、ANR 的情况

Proxy -> Throttle Settings具体参数设置这里不详述了,用不到暂时

image-20240906132204998

mock

有时候抓包一个 app 使用断点去构造 Response 的时候,会遇到服务器因为超时拒绝响应的问题

这时候我们可以把 Response 消息的 JSON 构造好存放在本地,然后对请求的某个接口进行映射,一旦匹配到这个请求,那么我直接把本地构造好的数据用作 Response 返回,达到构造 Response 的目的。

Map Local

作用:用一个本地文件内容替换匹配拦截到的接口的响应数据

Tools -> Map Local

对于这个接口

image-20240906133348296

我们想要把响应的数据包改成我们想要的,可以先在本地保存一份响应包,右键 save Response

这里我们简单修改一个字段,把这个 "count": 102 改成 "count_epsilon", 100

文件的格式可以是 .txt 、 .json

image-20240906133531238

右击 movie,选择 copy URL,再打开Map Local

image-20240906133722707

贴进去,会自动解析,然后再选择端口号即可,Local path选择我们构造的响应包,我们要把该接口的所有请求都给变成我们构造的响应包,需要在 path 后面加一个 *

Case-sensitive :区分大小写,勾选说明填写的文件路径区分大小写,不勾选,文件路径不区分大小写

image-20240906134028749

接口匹配规则:

  • Protocol :协议,选项有HTTP 、HTTPS
  • Host : 域名,或 服务器的IP地址
  • Port :端口
  • Path :接口的路径
  • Query: URL 中 ? 后面拼接的查询参数

【重点】以上字段支持通配符,比如说Path ,填写 /test/api1 ,只支持拦截/test/api1 这一个接口,是全匹配,比如无法匹配 /test/api1/apis ;如果填写/test/* ,就能够匹配以/test/开头的所有接口,比如 /test/api1 、/test/api1/apis

然后再抓包,mock 成功

image-20240906134149608

Map Remote

作用:将一个请求映射到另一个地址上,比如说 访问百度www.baidu.com 映射到CSDN博客 www.csdn.net 上

Tools > Map Remote

比如我们要把 list1.json 映射到 list8.json 就配置如下,Map To 只填了path其他默认跟上面一样

image-20240906135148066

看一下结果确实变成了 list 8

image-20240906135255185

notes 里也说明了

image-20240906135125153

Rewrite

作用:字面意思 Re - write 重写,可以重写、重新修改请求,上面两个Mock方式, Map Local 和 Map Remote 都是修改响应数据 ,而 Rewrite 即可以修改响应数据(响应头和响应体), 又可以修改 请求数据 (请求头 和 请求体)。

Tools -> Rewrite

image-20240906135646486

接口的匹配规则和 Map Local 中接口的匹配规则一致 (整个charles 所有接口的匹配规则都是一样的) 。
重写规则中的type类型比较多:

  • Add Header : 新增header 信息(原来没有此信息),where 选择的是request ,则新增是请求头信息 ,where 选择的是 response ,则新增是 响应头信息;
  • Modify Header : 修改原有的header信息
  • Remove Header : 删除掉原有的header信息
  • Host : 修改HOST 信息,仅仅替换Host,可以把请求指向另一个域名,和 Map Remote 的功能差不多
  • Path : 修改接口的路径
  • URL :修改URL,替换整个URL,可以把请求指向其他的地址,和 Map Remote 的功能差不多
  • Add Query Param :在URL ? 之后新增参数
  • Modify Query Param :修改URL ? 之后的参数内容
  • Remove Query Param :删除URL ? 之后的参数内容
  • Response Status :修改响应状态,比如把code码 由200 调整为 404
  • Body :where 选择的是request ,则是请求体 ,where 选择的是 response ,则是响应体