Python dpkt抓包 IP片段組包

2021-10-21 03:30:06 字數 1553 閱讀 7495

使用pcap或者winpcapy抓包後,對包做處理,使用dpkt工具,資料處理速度較快,但是dpkt大多數都是資料片段,一次互動請求,通常被分為很多片段,通過報文頭部的

do_not_fragment(是否分包) more_fragment(有更多片段)倆個字段,也就是(df,mf)來確定是否有分包,是否是最後乙個。

因為理論不足,以及沒找到現成的**,所以寫了個組包**

ip = eth.data

# 取出分片資訊

df = bool(ip.off & dpkt.ip.ip_df)

mf = bool(ip.off & dpkt.ip.ip_mf)

offset = ip.off & dpkt.ip.ip_offmask

# 輸出資料報資訊:time,src,dst,protocol,length,ttl,df,mf,offset,checksum

output1 =

output2 =

output3 =

output4 =

if output2['src'].strip() == '202.99.232.54':

print('ip: %s -> %s (len=%d ttl=%d df=%d mf=%d offset=%d)' % ('%d.%d.%d.%d'%tuple(ip.src), '%d.%d.%d.%d'%tuple(ip.dst), ip.len, ip.ttl, df, mf, offset))

#print(ip.data.data)

global b

if df == 1 and ip.len == 1490:

b = b + ip.data.data

#print(str(b, encoding='utf-8'))

elif ip.len > 40:

b = b+ip.data.data

print("\n**********=")

try:

start_index = b.find(b'\r\n\r\n')

end_index = b[start_index+4:].find(b'\r\n')

x = b[start_index+ 4 + end_index + 2:]

x = x[:x.find(b'\r\n')]

print(json.loads(str(x, encoding='utf-8')))

except baseexception:

print("parse to json error:" )

print("*************")

print(x)

print("*************")

print("**********==\n")

b = bytes('', encoding='utf-8')

else:

b = ip.data.data

print(str(b, encoding="utf-8"))

僅作參考,比如最大片段長度 1490,以及 長度為40,53的互動分別是什麼資訊都不是很確定。

抓包分析IP報文結構

ipv4的頭部結構如圖所示。其長度通常為20位元組,除非含有可變長的選項部分 4位版本號 指定的ip協議的版本。對ipv4來說,其值是4。4位頭部長度 標識該ip頭部有多少個32bit字。因為4位最大能表示15,所以ip頭部長度最長是60位元組。8位服務型別 包括乙個三位的優先權字段 現在已經被忽略...

ip網路抓包分析(1)

獲取原先的網路配置,將ip位址的後8個位元組改為學號的後3位。連通性測試ping www.baidu.com能正常連線網路。源位址目的位址 網域名稱172.24.55.69 一 應用層 二 傳輸層 tcp協議tcp三次握手 第一次握手 客戶端傳送乙個tcp,標誌位為syn,序列號為0,代表客戶端請求...

IP網路協議抓包分析

一 配置 1 網路位址規劃表 主機ip 子網掩碼 預設閘道器 mac位址 192.168.43.121 255.255.255.0 192.168.43.174 18 56 80 84 35 db 2 配置源位址 開啟電腦 網路和共享中心 點選 本地連線 單擊 屬性 選擇 internet 協議版本...