在 Windows 上使用较多的是 Findder 进行抓包,但是该软件没有 Mac 版本。
这里使用 Charles 来进行抓包(该软件有很多平台的版本哦~),在抓包时的主要思路就是中间加一层,来拿到想要的内容。这篇博客主要介绍几个浅显的抓包方法。
如何使用 Charles 抓包
Charles 是一个 HTTP 代理服务器,HTTP 监视器,反转代理服务器,当程序连接 Charles 的代理访问互联网时,Charles 可以监控这个程序发送和接收的所有数据。它允许一个开发者查看所有连接互联网的 HTTP 通信,这些包括 request, response 和 HTTP headers (包含 cookies 与 caching 信息)
若资金允许,请点击 https://www.charlesproxy.com 购买正版,谢谢合作
这里放一个激活的方式
1 | Registered Name:(区分大小写) |
在 Mac 上抓取发出的包
我们在访问网页的时候,在浏览器中按 F12 键可以开发者控制台看到 network 中传输的每个包的内容
但是这样经常是不够的,在爬虫的过程中,控制台里面有的信息可能会省略。我们可以使用 charles 抓 Mac 中发出的包
设置打开和端口
设置 Proxy -> macOS Proxy
安装证书
给 MacOS 安装 charles 的根证书
信任安装的根证书,改成始终信任
抓包效果
此时已经开始抓取电脑上的 HTTP 包,并且系统的代理设置已经被更改了,打开 设置 -> 网络 -> WiFi -> 高级 -> 代理
,可以看到系统的代理已经被设置到了 8888
端口(同样可以根据 Chrome 的设置打开,Chrome 中 设置 -> 搜索代理 -> 打开您计算机的代理设置
)
一般使用的是系统的代理,如果你的 Chrome 安装了代理插件,Chrome 则会根据你的配置是否使用代理。在 Chrome 上打开网页或者其他软件发送 http 请求就可以被截获了,如果现在你没看到有包刷新,请检查你是否开了其他代理软件,请关闭
在 Mac 上抓取收到的包
在进行服务端开发的时候,可能会遇到需要检查收到包的内容。下面的内容使用到了 frp 内网穿透转发请求,可以看一下之前写过的一篇博客 使用 Frp 内网穿透进行开发
一个场景的例子
在这里举一个我在使用场景之中遇到的情况,如果前端遇到了问题,比如说发了某个包,但是你这边确实没有收到,或者收到的内容跟前端描述的内容不一样,那么可以通过抓包来判断到底问题出在哪儿(在个人开发的时候,我使用 frp 进行内网穿透,将自己的接口通过 frp 暴露在公网)
在本地模拟了一下上面的情况发生的事情,下一部分讲述如何实现
本地反向代理端口
实现的方式就是在设置里面的 Proxy -> Reverse Proxies Settings
Proxy HTTP and HTTPs requests from local ports to remote web servers. 将 http 或者 https 请求从本地端口发送到远程的 web 服务器
设置的时候这样设置,Remote Port
设置为你本地运行的服务的端口(比如 gin 的 http port 监听 8000 端口),然后将 Local Port
设置为你想监听的端口(也就是接受信息端口,之后被 frp 穿透)
现在可以看到自己的某个端口收到的请求了
抓取 Android 上的包
在安卓的 WiFi 处设置手动代理,让其通过 Charles 走一层代理(通过电脑的作为中间层抓包),可以抓到所有安卓发出和收到的内容,但是安卓手机需要 Root,安装电脑生成的中间根证书,这样才能解析 HTTPS 的包数据
设置和安装证书
然后需要在手机上设置对应的代理,查看电脑的 局域网 ip 地址,这里我的局域网 IP 地址为 192.168.123.4
然后在手机上设置手动代理,对应 ip 地址和端口
在电脑上选择安装 mobile 设备的证书
然后在手机浏览器上打开 chls.pro/ssl
这个链接,会弹出下载证书,然后安装即可(安卓手机需要 Root 才能信任根证书,iPhone 则需要在 设置->通用->描述文件->charles proxy custom root certificate
中信任该证书)
可能遇到的问题
postman 设置代理之后,可能出现证书信任问题
然后发包会遇到问题
这里需要设置一下 postman 的信任证书,偏好设置 -> General -> SSL certificate verification
设置为 off 即可
参考资料
闲逛的时候发现了一套比较好的系列教程 Charles 使用教程,因为已经达到自己的需求,一些并发测试的使用这里就不在深入研究。