再談golang 抓包gopacket

2018年,我寫過 http://www.itdecent.cn/p/a33923734d3c
極簡(jiǎn)http抓包
但是http抓包一直有問題。問題在什么地方呢?就是http協(xié)議里沒有特別明確的body長(zhǎng)度。
再加上包序一錯(cuò),就出現(xiàn)各種解決不了的問題。

那么這些問題怎么辦呢?
第一、
tcp assembly 要使用 https://github.com/google/gopacket/tree/master/reassembly

而不能使用 https://github.com/google/gopacket/tree/master/tcpassembly
tcpassembly 目錄下的 代碼很久沒有更新,很多包序處理的不好。

而 reassembly非常完善。

第二、
不要直接在run 里面通過 read 解析代碼
這樣做的缺點(diǎn)就是 當(dāng) keepalive 包存在的時(shí)候,同一個(gè)鏈接里因?yàn)閔ttp 協(xié)議里的body錯(cuò)誤
會(huì)導(dǎo)致抓不到 request 和response 開頭,導(dǎo)致整個(gè)包錯(cuò)亂。

我現(xiàn)在的解決方案是 每次read 都加一個(gè)中間環(huán)節(jié)進(jìn)行判斷。當(dāng)出現(xiàn)了新的 equest 和response 開頭。就告知上一個(gè)body 已經(jīng)結(jié)束了。

第三、 http 協(xié)議里 keepalive 包可能會(huì)出現(xiàn) request 和response不匹配
這個(gè)我目前也不是100%解決了。只能模糊匹配。實(shí)際上通過seq+時(shí)間會(huì)比較好。
但是 reassembly 在傳輸數(shù)據(jù)的時(shí)候沒有給seq,所以我只能通過時(shí)間戳 簡(jiǎn)單的判斷。

整個(gè)的代碼,我放在github上了 https://github.com/asmcos/httpdump

執(zhí)行結(jié)果:

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]
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容