2018年蚪拦,我寫過 http://www.reibang.com/p/a33923734d3c
極簡http抓包
但是http抓包一直有問題。問題在什么地方呢抓艳?就是http協(xié)議里沒有特別明確的body長度苗踪。
再加上包序一錯颠区,就出現(xiàn)各種解決不了的問題。
那么這些問題怎么辦呢通铲?
第一毕莱、
tcp assembly 要使用 https://github.com/google/gopacket/tree/master/reassembly
而不能使用 https://github.com/google/gopacket/tree/master/tcpassembly
tcpassembly 目錄下的 代碼很久沒有更新,很多包序處理的不好颅夺。
而 reassembly非常完善朋截。
第二、
不要直接在run 里面通過 read 解析代碼
這樣做的缺點就是 當 keepalive 包存在的時候吧黄,同一個鏈接里因為http 協(xié)議里的body錯誤
會導致抓不到 request 和response 開頭质和,導致整個包錯亂。
我現(xiàn)在的解決方案是 每次read 都加一個中間環(huán)節(jié)進行判斷稚字。當出現(xiàn)了新的 equest 和response 開頭饲宿。就告知上一個body 已經結束了。
第三胆描、 http 協(xié)議里 keepalive 包可能會出現(xiàn) request 和response不匹配
這個我目前也不是100%解決了瘫想。只能模糊匹配。實際上通過seq+時間會比較好昌讲。
但是 reassembly 在傳輸數據的時候沒有給seq国夜,所以我只能通過時間戳 簡單的判斷。
整個的代碼短绸,我放在github上了 https://github.com/asmcos/httpdump
執(zhí)行結果:
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]