Charles 简介 总结 HTTP 抓包 代理 [MD] 目录 Charles
我的GitHub | 我的博客 | 我的微信 | 我的邮箱 |
---|---|---|---|
baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
Charles
简介
charles是一个HTTP代理服务器、HTTP监视器、反转代理服务器,当浏览器连接Charles的代理访问互联网时,Charles可以监控浏览器发送和接收的所有数据。
Charles 通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的。该软件是用Java
写的,能够在Windows,Mac,Linux上使用。安装Charles的时候要先装好Java
环境。
Charles的主要功能:
- 截取 Http 和 Https 网络封包
- 支持重发网络请求,方便后端调试
- 支持修改网络请求参数
- 支持网络请求的截获并动态修改
- 支持模拟慢速网络
破解工具
用法:输入RegisterName
(此名称随意,用于显示 Registered to xxx),选择本地已安装的版本,点击生成,并下载charles.jar文件替换本地Charleslibcharles.jar
文件
界面介绍
主菜单
- 清除会话记录:点击之后可清除抓取到的所有请求
- 开始/停止抓取会话记录:红色说明正在抓取请求,灰色说明目前不在抓取请求状态
- 开启/停止限流:灰色乌龟是网速设置正常,绿色乌龟指慢速网速开启了
- 开启/关闭断点:灰色说明断点未开启,红色说明在使用断点
- 编辑会话:点击之后可以修改请求的内容,修改后可执行此请求
- 重新发一遍请求:先选定某一请求,点击该图标则请求会被再次发送
- 验证回话
- 工具
- 配置
会话右键菜单
- Repeat:重复执行请求,和主菜单中的功能一样
- Repeat Advanced:可以指定重复的次数,这样可以选中多会话,在右侧的chart查看请求的时间等性能
- Focus:在某个域名下点击Focus,会将当前域名放到顶部,没有 Focus 的域名统一放到下面的 Other Hosts 下。可以在
View -> Focused Hosts
中统一编辑 - Black List:黑名单中的域名不能联网,可以在
Toos -> Black List/Write List
下统一更改 - Write List:白名单开启后,只有白名单中的网络可以访问网络,不在白名单中的不能访问网络。如果一个域名既在 Black List 中也在 Write List 中,则也不能访问网络
- Export:导出会话 Session 保存到本地,然后下次可以通过
File -> Open Session
打开本地的 Session - Compose:即工具栏上的钢笔的图标,编辑请求然后执行
两种显示模式
Charles有两种显示模式,Stucture 和Sequence,其实并没啥大的区别。
Structure
按照不同hosts域名分组展示请求。
点击+
之后便可以展开该 host 域名下的所有请求,可以很清晰的看到请求的数据结构
,可以很清晰的去分析和处理数据,适合对单一
系列的访问请求从宏观上进行把握,可以快速定位。
Sequence
按照请求的顺序展示请求。
可以看到全部请求
,适合精确定位
内容,因为每条 sequence 都有size、status等属性信息,方便快速定位这条结果的价值。
内容区域
请求内容
- Overview:会展示该请求的一个大体情况,例如:请求头、请求开始时间、响应大小、自己的notes等
- content:请求和响应的详细内容,配合下面的导航栏进行查看
- summary:展示一个该请求的大体资源分布情况,例如:服务器响应了多长时间,host是什么等等
- chart:以表格形式告诉我们一个响应时间的分布情况
- notes:点击之后自己可以对该请求记录一些东西,方便后续查看该接口的用途,可在overview中查看
request 导航栏
- header :详细的请求头信息
- query string :请求时携带的参数
- cookies :以表格的形式展示请求中的 Cookie 信息
- raw :完整的原始请求信息
response 导航栏
- header :详细的响应头信息
- text :以文本形式显示响应体
- hex、compressed :以十六进制、压缩形式显示响应体,一般不予查看
- JavaScript、json、json text:以json形式显示响应体,区别不大
- raw :完整的原始响应信息
抓包
HTTP 抓包
原理
当你使用代理服务器后,所有的 HTTP 请求,都是先发到代理服务器,然后由代理服务器重新包装后,再发给目标服务器;响应也是如此,代理服务器先接收来自目标服务器的响应,然后包装后发给客户端,从而在代理服务器上可以实现抓包。
使用方式
- 工具栏选择
Proxy
->Proxy Settings
,并且勾选Enable transparent Http proxying
,设置一个端口号 - 在手机端打开你的 Wifi 设置,长按已经连接的 Wifi,继续点击进入设置页面,勾上
[手动代理]
选项,代理服务器主机名、端口号
填写 Charles 上的配置的 - 当手机连接上代理后并有网络请求时,Charles 会弹出相应的提示框,点击
Allow
即可
HTTPS 抓包
完成上述配置即可以对手机端发送的 HTTP 请求进行抓包。但由于 Chrles 属于代理服务器,缺少SSL
证书,无法对HTTPS
请求进行抓包,需进行如下配置。
方式一
- 点击
Proxy
->SSL Proxying Settings
,勾选上Enable SSL Proxying
- 点击
Add Host
填写需要代理的 host 及端口号,支持通配符*
,如果两者都是*
,则会代理所有 host 的请求 - 点击
Help
->SSL Proxying
->Install Charles Root Certificate on a Mobile Device
出现弹窗 - 在手机浏览器输入地址
chls.pro/ssl
,出现证书下载页面,下载并安装
方式二
- 打
Help
->SSL Proxying
->Save Charles Root Certificat
-> 输入文件名(如bqt.pem
),文件格式默认.pem
格式,名称随意 - 获取证书在安卓系统中的文件名:
openssl x509 -subject_hash_old -in bqt.pem
,执行后会生成一个类似1ac7b872
的名称 - 将
bqt.pem
重命名为1ac7b872.0
,必须以.0
格式结尾 - 将
1ac7b872.0
证书 push 到手机adb push 1ac7b872.0 /system/etc/security/cacerts/
目录中,可能需要重启手机才能生效 - 注意:只有 root 过的手机才能通过 push 命令向此目录导入文件
HTTPS 抓包原理
HTTPS通信的大致过程:
- 客户端将自己支持的
加密算法
发送给服务器,请求服务器证书
- 服务器
选取
一组加密算法,并将证书
返回给客户端 - 客户端
校验
证书合法性,生成随机对称密钥
,用公钥加密后发送给服务器
- 服务器
用私钥解密出对称密钥
,返回一个响应,HTTPS连接建立完成 - 随后双方通过这个
对称密钥
进行安全的数据通信
Charles 作为一个中间人代理,当浏览器和服务器通信时,Charles 接收服务器返回给客户端的证书
,但动态生成一张证书发送给客户端
,也就是说 Charles 作为中间代理在客户端和服务器之间通信,所以通信的数据可以被 Charles 拦截并解密。
由于 Charles 更改了证书,客户端(例如浏览器)校验不通过会给出安全警告,必须安装 Charles 的证书后才能进行正常访问。
请求重定向 Map remote
当请求这个链接时,将请求重定向到自己定义的一个链接,将其返回值当做自己的返回值。
实际开发时,有这样的场景,服务端线上版本有bug,你在本地修改程序后,需要模拟实际的线上环境,来验证程序的正确性,最直接的方法就是让客户端修改一下APP的调用地址
到你本机,然后重新打一个版本供你模拟测试,这样虽然可以,但效率极其低下,然而Charles为我们解决了这个问题。
两种配置方式:
- 会话列表中,右击需要重定向的请求 -> 点击Map Remote -> 将会自动带入
需要重定向的链接(Map from)
,配置好实际请求的链接(Map to)
,点击OK即可 - 工具栏处,Tools -> Map Remote -> 勾选Enable选项 -> 点击 Add 添加需要重定向的请求
注意:
- To map from a path and its subdirectories you must end the path with a
*
. - To map an entire host leave the path blank. 要映射整个主机,请将路径留空。
响应重定向 Map local
重定向到本地的文件内容作为返回值。
两种配置方式:
- 会话列表中,右击需要重定向的请求 -> 点击Map local -> 将会自动带入入
需要重定向的链接(Map from)
,选择本地需要被重定向到的目标文件(Map to)
,点击OK即可 - 工具栏处,Tools -> Map local -> 勾选Enable选项 -> 点击 Add 添加需要重定向的请求
使用技巧
断点调试
Intercept and edit requests and responses before they are sent and received
除了修改映射的方法,通过设置断点也可以实现想要的效果。和我们在 IDE 上设置断点一样,在断点处会进入调试模式,请求会暂时中断,这时我们可以进行一些自定义的操作。
设置 Charless 断点
Proxy -> Breakpoint Settings -> 勾选 Enable Breakpoints,点击 Add 添加
对指定的URL开启断点功能
选择一个URL链接 -> 右键开启菜单 -> 选择 Breakpoints 即可开启此请求的断点。这样Charles会遇到此请求时会弹出中断对话框
。
编辑请求与响应的内容
- 在中断对话框中,用户可以点击 Edit Request 来编辑请求的内容,编辑完成后然后点击
Execute
发出去这个请求给服务端。 - 在 Edit Request 对话中点击 Execute 发出请求后,服务端返回来数据后,用户点击 Edit Response 可对响应内容进行编辑,完成后然后点击 Execute 发出去这个数据给客户端。
需要注意一点:通过断点的方式会存在一定的问题。数据被拦截后,客户端的请求超时时长
是不会停止计算的,如果没在设置的超时时间内返回数据,本次请求也就按失败处理了。
过滤抓取请求
开始抓包后,随着时间的推移,抓取到的网络包越来越多,这时我们可以使用过滤功能,来过滤出我们想要的网络请求。
在 Proxy -> Recording Settings
中可以设置网络包的过滤选项,过滤选项中有 Include 和 Exclude 两种选项,只有当 Include 为空时,Exclude 中的设置才会生效。过滤条件支持通配符。
Include
- Only requests that match one of the locations below will be recorded.
- If this list is empty , all requests will be recorded unless otherwise excluded. 除非另有排除。
模拟网络限速
在做移动端开发的时候,我们常常需要模拟慢速网
络或者高延迟
的网络,以测试在移动网络下应用的表现是否正常。Charles对此需求提供了很好的支持。
在Charles的菜单上,选择 Proxy -> Throttle Setting
项,在之后弹出的对话框中,我们可以勾选上Enable Throttling
,然后设置 Throttle Preset(限流预值) 等。
也可以通过点击工具栏上小乌龟
的图标开启或停止限流。
给服务器做压力测试
我们可以使用 Charles 的Repeat
功能来简单地测试服务器的并发处理能力
,方法如下:
我们在想打压的网络请求上右击,然后选择Repeat Advanced
菜单项,接着我们就可以在弹出的对话框中,选择打压的并发线程数
以及打压次数
,确定之后,即可开始打压。
一些写得很弱的投票网站,也可以用这个办法来快速投票。
2019-10-29