使用Charles抓包
概念
什么是抓包
抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。
为什么要抓包
当业务发生异常, 或是界面数据展示不正确时. 客户端说他没问题,服务端也说他没问题,到底谁有问题?这时候没必要相互推脱,拿数据出来说话才是王道.定位问题时, 往往是从客户端开始debug, 找了一圈最后可能发现是服务端返回出错, 这样效率太低. 抓包可以直接看到服务端返回的数据, 从而快速定位问题.
使用抓包工具, 截取request, response数据, 进行修改, 可以方便测试不同的场景以及一些难以触发的场景及分支.
使用抓包工具, 可以模拟慢速网络以及等待时间(latency)较长的请求.
抓取其他应用的包, 可以看到其他应用的数据接口设计, 接口设计, 学习一些东西.
更多用处待补充...
工具选择
抓包工具有很多, 常见的有Charles, Fiddler, wireshark等...
这里推荐使用Charles, 支持Mac&windows, 功能好用, logo好看..
![](https://img.haomeiwen.com/i1611940/900db43b8448bb3c.png)
使用
用起来, 开搞
下载charles
可以去charles官网下载,下载地址:http://www.charlesproxy.com/download/ 根据自己的操作系统下载对应的版本,然后进行安装,然后打开charles工具 (破解版也可以用, 但是我们也要尽量支持官方哈...)
设置代理
确保手机和电脑在同一局域网下
查看当前电脑的ip
查看默认端口 Proxy->Proxy Settings 在这个页面会看到HTTP Proxy的默认端口是8888 我们不需要修改,只需要知道有这个值就行
知道了默认端口跟ip地址,我们就可以手机上设置代理了
charles同意连接授权
然后就可以愉快的抓包啦
抓不到Https?
乱码?
我们按照上面的方式设置好代理之后, 可以成功的抓到http请求的包.
但是https的包, 看到数据却全部都是乱码
王德发? 这谁看得懂?
为什么?
Https数据传输过程中是加密的, 所以会出乱码.
要怎么做呢?
设置SSL代理 Proxy->SSL Proxy Settings.
把我们需要解析的域名填进去
我们可以使用*通配符来匹配所有的域名.
配置完成后, 看下效果
刚才的乱码不见了, 但是我们的请求直接被拒绝了, 变成了红色的叉叉. (Https除了数据的加密, 还有双发身份真实性的合适, 以及数据完整性的保护)
Failure里面显示, SSL握手过程中证书被拒绝.
Notes里面提示我们需要去配置charles的根证书.
我们按照它的步骤, 使用浏览器打开 chls.pro/ssl 这个链接 (代理我们在第一步就已经连上了)
安装完描述文件之后, 需要开启证书信任, 设置-> 通用 -> 关于本地 -> 证书信任设置
大功告成
按照上述步骤设置好证书以及信任设置后, 我们的工作就完成了, 接下来看看成果吧
原理 <开发同学重点关注>
客户端向服务器发起HTTPS请求
Charles拦截客户端的请求,伪装成客户端向服务器进行请求
服务器向“客户端”(实际上是Charles)返回服务器的CA证书
Charles拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)
客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)
Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)
服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应
Charles拦截服务器的响应,替换成自己的证书后发送给客户端
至此,连接建立,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。
HTTPS抓包的原理还是挺简单的,简单来说,就是Charles作为“中间人代理”,拿到了 服务器证书公钥 和 HTTPS连接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的。
进阶
除了普通的抓取接口数据外, 我们还可以对数据进行修改, 重发, 批量发送, 模拟弱网等操作
重发
断点
选中要断点的请求, 右键选择breakpoints, 就可以打上断点, 同理也可是使用*等通配符进行过滤匹配需要断点的域名
修改之前App界面:
断点之后我们可以修改返回的response:
我们修改了它的一些字段如desc, nickname, location, level_name等
再看看App的展示效果:
![](https://img.haomeiwen.com/i1611940/6bab2b419daaba58.png)
附录
charles抓https原理:https://www.jianshu.com/p/405f9d76f8c4
https相关知识:https://www.jianshu.com/p/fb6035dbaf8b
网友评论