Charles 抓包学习
安装
免费版有使用期限,分享一个在线的激活码生成网站
配置
- 电脑安装证书->安装到本地计算机->选择受信任的证书颁发机构
- proxy->proxy_setting->端口号
- SSL proxy settings->Enable SSL->端口
*:443
(443是HTTPS默认端口) - help->local IP address->找到wifi的ip地址->手机wifi(手机电脑连一个wifi)设置手动代理 ip+port
- 手机安装证书,先计算hash再用MoveCertificates(一个magisk模块)mount到系统目录(android 13 系统,折腾不来system分区解锁,直接用magisk面具吧)
一些额外操作:
Proxy -> Windows Proxy 可以关闭主机代理,只接收移动端的包
原理
如上图所示:
- 客户端发送请求,客户端可以是安卓手机/ios手机/PC机上的浏览器等
- Charles 接收请求,再发送给服务器,这个步骤可以篡改请求内容, 比如请求体的内容,URL GET 方法
?
之后拼接的参数,Header 中的token,cookie 等 - 服务端把响应结果返回给Charles
- Charles 把响应结果再转发给客户端,这个步骤可以篡改响应内容
功能
- 支持HTTP 和 HTTPS 代理
- 支持流量控制,可以用来模拟弱网环境,设置2G、3G、4G等场景的网络环境
- 支持断点调试
- 支持MOCK
- 支持接口请求并发
界面
左边显示的是Query的网址,右边是总览,包含请求的域名(Host),路径(Path),注释(Notes),协议(Protocols),请求(Requests)的各种信息,请求时间(Timing),请求大小(Size)
还要概要(Summary)和表格(Chart),表示一些详细信息
断点
先开启断点设置,然后在某个API上右键选择breakpoint
,就可以设置断点,断下来以后就可以修改这个请求包的信息了
我们就可以看到表单信息,这里是要用GET方法获取到list1.json
我们给他改成 list2.json
,再按 execute
,然后会收到一个 Response
,这里也会断下来,我们也可以对 Response
进行修改再按excute
,一个包的请求响应就结束了
发现获取的就是第二个 list
弱网测试
关注点:
- APP反应慢的时候是否有友好的提示信息
- APP弱网情况下,提交数据不会产生重复数据
- APP 不会出现Crash、ANR 的情况
Proxy -> Throttle Settings具体参数设置这里不详述了,用不到暂时
mock
有时候抓包一个 app 使用断点去构造 Response 的时候,会遇到服务器因为超时拒绝响应的问题
这时候我们可以把 Response 消息的 JSON 构造好存放在本地,然后对请求的某个接口进行映射,一旦匹配到这个请求,那么我直接把本地构造好的数据用作 Response 返回,达到构造 Response 的目的。
Map Local
作用:用一个本地文件内容替换匹配拦截到的接口的响应数据
Tools -> Map Local
对于这个接口
我们想要把响应的数据包改成我们想要的,可以先在本地保存一份响应包,右键 save Response
这里我们简单修改一个字段,把这个 "count": 102
改成 "count_epsilon", 100
文件的格式可以是 .txt 、 .json
右击 movie,选择 copy URL,再打开Map Local
贴进去,会自动解析,然后再选择端口号即可,Local path选择我们构造的响应包,我们要把该接口的所有请求都给变成我们构造的响应包,需要在 path 后面加一个 *
Case-sensitive :区分大小写,勾选说明填写的文件路径区分大小写,不勾选,文件路径不区分大小写
接口匹配规则:
- 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 成功
Map Remote
作用:将一个请求映射到另一个地址上,比如说 访问百度www.baidu.com 映射到CSDN博客 www.csdn.net 上
Tools > Map Remote
比如我们要把 list1.json 映射到 list8.json 就配置如下,Map To 只填了path其他默认跟上面一样
看一下结果确实变成了 list 8
notes 里也说明了
Rewrite
作用:字面意思 Re - write 重写,可以重写、重新修改请求,上面两个Mock方式, Map Local 和 Map Remote 都是修改响应数据 ,而 Rewrite 即可以修改响应数据(响应头和响应体), 又可以修改 请求数据 (请求头 和 请求体)。
Tools -> Rewrite
接口的匹配规则和 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 ,则是响应体