赞
踩
使用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的交互分别是什么信息都不是很确定。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。