2018年,我写过 https://www.jianshu.com/p/a33923734d3c
极简http抓包
但是http抓包一直有问题。问题在什么地方呢?就是http协议里没有特别明确的body长度。
再加上包序一错,就出现各种解决不了的问题。
那么这些问题怎么办呢?
第一、
tcp assembly 要使用 https://github.com/google/gopacket/tree/master/reassembly
而不能使用 https://github.com/google/gopacket/tree/master/tcpassembly
tcpassembly 目录下的 代码很久没有更新,很多包序处理的不好。
而 reassembly非常完善。
第二、
不要直接在run 里面通过 read 解析代码
这样做的缺点就是 当 keepalive 包存在的时候,同一个链接里因为http 协议里的body错误
会导致抓不到 request 和response 开头,导致整个包错乱。
我现在的解决方案是 每次read 都加一个中间环节进行判断。当出现了新的 equest 和response 开头。就告知上一个body 已经结束了。
第三、 http 协议里 keepalive 包可能会出现 request 和response不匹配
这个我目前也不是100%解决了。只能模糊匹配。实际上通过seq+时间会比较好。
但是 reassembly 在传输数据的时候没有给seq,所以我只能通过时间戳 简单的判断。
整个的代码,我放在github上了 https://github.com/asmcos/httpdump
执行结果:
192.168.10.110->175.27.0.201:54893->80
extshort.weixin.qq.com
POST /mmtls/1d70cf00 HTTP/1.1
Connection :[close]
Content-Length :[542]
Content-Type :[application/octet-stream]
Upgrade :[mmtls]
User-Agent :[MicroMessenger Client]
Accept :[*/*]
Cache-Control :[no-cache]
175.27.0.201->192.168.10.110:80->54893
HTTP/1.1 200 OK
Content-Type :[application/octet-stream]
Content-Length :[229]