本文基于 Ubuntu 18.04
系统通过使用 Wireshark
软件对微信网页版进行抓包来总结 Wireshark
抓包软件的使用和计算机网络的基础知识.
Wireshark 介绍
Wireshark
是一款网络分包分析软件.主要功能是获取网络封包,并显示出详细资料.这里主要通过这个软件来学习网络协议.
安装
直接使用 apt
安装即可:
1 | sudo apt-get install wireshark |
如果不给授权,目前的 Wireshark
大概率是会:
所以需要设置用户权限
1 | sudo dpkg-reconfigure wireshark-common |
在弹出的选项中选择 Yes
如果仍然不行,就手动把用户添加到 wireshark
的用户组中,然后赋予执行权限
1 | sudo usermod -a -G wireshark $USER |
加入用户组后注销用户重新登录,使用命令行或者应用启动器启动软件,就可以顺利实现抓包
选择网卡
机器上有两块网卡,一块有线网卡,一块无线网卡,所以需要选择其中一块网卡用于捕获数据包.菜单栏选择 捕获-选项-管理接口
,选择需要捕获的网卡.
过滤器
过滤器有两种,一种捕获过滤器一种是显示过滤器,捕获过滤器用来过滤需要什么数据包,用于控制捕获数据的数量,以避免产生过大的日志文件.显示过滤器用于在捕获的记录中过滤筛选出需要的数据包,相当于一个查找功能.其中捕获过滤器在 捕获-捕获过滤器
中编辑规则,然后在捕获开始时选择相应的规则.而显示过滤器则是在 分析-显示过滤器
中编辑.
打开网页抓包
首先打开软件,然后打开网页进行抓取如下:
查看 DNS
请求包,看到 https://web.wechat.com/
对应的 ip
为 183.232.103.154
,所以在过滤规则中写 ip.addr == 183.232.103.154
进行分析:
TCP 三次握手建立连接
TCP
完成的建立连接到释放过程如下:
从上图可知建立连接需要三次握手,从抓到的数据中可以看到三次握手的数据包:
TLS/SSL
在 OSI
模型中 TLS/SSL
位于表现层,从抓到的数据中可以分析出 微信使用的 TLS/SSL
的工作原理
Client Hello
客户端建立
HTTPS
连接时会发送一个ClientHello
消息:Server Hello
服务器端收到
ClientHello
消息后,会回复客户端一个ServerHello
消息,所带信息如下:Change Cipher Spec(Client发送密钥改变通知)
客户端生成
master secret
之后即可发送密钥改变通知通知服务器,之后就使用对称密钥master secret
来加密数据:
至此环境都OK,下面分析登录协议
扫码登录
在上面的过程中计算机已经和微信网页版的服务器建立了 TCP
连接,并且客户端每隔一段时间都向服务器发送数据保持链接不断开,而当用手机扫码登录后,服务器给客户端发送数据进行登录:
然后客户端发起了 DNS
查询请求,查询了 wx2.qq.com
的地址, DNS
服务器返回了两个地址,从之后的数据中可以看出客户端选择了第一个地址进行连接:
DNS
查询完成后,自然就是 TCP
三次握手建立连接,然后 SSL
交换密钥,最后客户端页面跳转进入微信网页程序对话框页面(https://wx2.qq.com)
进入界面之后,需要加载用户头像,各类会话信息等等,这时候又抓到了大量 DNS
查询请求,有 js.aq.qq.com
,res.wx.qq.com
,js.aq.tcdn.qq.com
等等,根据域名大概猜出是在查询 CDN
加速的静态 js
文件等,以及各种微信资源(其中应该包括用户头像,会话列表等等).由此也可见微信的不同功能是分给不同的服务处理的,这样看微信应该采用的是微服务的架构设计.
然后就是跟刚刚查询到的各种地址各种握手建立 TCP
连接,并且由于连接都是 HTTPS
协议的,所以每次连接建立都要执行 SSL
那一套东西:
建立连接以后,就是各类请求获得数据
至此登录也已经完成,网页已经显示出所有信息
分析好友聊天过程
为了方便,这里先把显示地址改为显示域名:
设置完成后,使用网页找好友给他发送四条消息,然后开始分析
首先是 DNS
查询,查询了 webpush.wx2.qq.com
的地址,然后根据客户端选择的地址 183.232.103.146
进行过滤,分析给好友发送消息的全过程:
第一步是进行 TCP
握手认证,建立连接,由客户端发送 SYN
请求,服务器收到后发送 SYN
和 ACK
进行确认,最后从客户端向服务器发送 ACK
完成认证.
第二步是 SSL
过程和之前打开网页的过程一样从 Client Hello
到最后发送 secret
第三步之后就是不断进行交互,不断进行连接.
其中客户端发送完消息后,还会发送 Fin
进行连接请求,如果这时候接着发送消息,由下图可见,客户端又发送了一个 ACK
恢复连接
分析群聊协议
使用网页版发送一些消息,然后抓取数据.
首先可以看到的是,交互的地址仍旧是 183.232.103.146
也就是说网页版的微信群聊和私聊用的是同一个服务器,根据这个地址进行过滤分析:
可以看到跟上面私聊的过程完全相同,并且由于上面已经建立了连接,群聊直接使用上面建立的连接发起 POST
请求发送数据.