Python dpkt抓包 IP片段组包

使用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 = {'time':time.strftime('%Y-%m-%d %H:%M:%S',(time.localtime()))}
    output2 = {'src':'%d.%d.%d.%d'%tuple(ip.src) , 'dst':'%d.%d.%d.%d'%tuple(ip.dst)}
    output3 = {'protocol':ip.p, 'len':ip.len, 'ttl':ip.ttl}
    output4 = {'df':df, 'mf':mf, 'offset':offset, 'checksum':ip.sum}
    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===========")
    		if b.find(b'application/json') > 0:
    			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的交互分别是什么信息都不是很确定。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值