首页 > 编程知识 正文

pcap采集数据包,pcap

时间:2023-05-05 06:30:56 阅读:182174 作者:1350

目的地分组(pacp格式)中的数据被分为5组(#流)源端口号、目的地端口号、协议号、源IP、目的地IP )的对流波。

示例: flow1(data[IP].src、data.sport、data[IP].dst、data.dport、data.proto )。

在构思的元组提取中,首先对每个包进行扫描,从中提取有效的元组信息。

在实践中:

由于链路层中有数据包,也可能有ARP协议等数据包,因此没有上层信息,被视为无效数据包。 有些包缺少端口号和协议(没有tcp、udp等标签),但我暂时没有考虑为什么抛出异常并将其视为无效包。 所以你需要在代码中加入异常处理。 此外,对于PCAP,还必须分别处理IPv4、IPv6和ARP协议等。 提取5个元组后放入tuple中。 此功能单独在packetRead () )函数中实现,也用于flowProcess () )函数中。

对于同一流,五组信息统计信息中所有数据报的五组信息是相同的。 这里的思路是统计不同的5组信息为1个词典,key为5组,value为5组的重复次数。

连接到上一个单元,每次提取tuple时,都会将其append发送到flow_list的末尾。 统计结束后,列表中有重复项目。 制作空词典。 flow_list.count(item )用于计算列表中每个表项的重复次数,如果将item设置为词典key,将count返回值设置为词典value,则会创建词典。

数据包分割词典中的key数是分割结果的子pcap数。 创建子pcap,读取原始pcap中的每个包信息,遇到匹配项时,只需重复几次key即可。

完整代码----coding:utf-8----#流:源端口号、目标端口号、协议号、源IP、目标ipimportscapyfromscapy.all import * fromscapy.utilsimportpcapreaderimportosimportjson“”数据包五图读取程序“”(p ) :数据包=rd pcap (p ) 信息统计信息“”用于提取五对信息的“”fordatainpackets 3360 # data.show (#表示当前类型中包含的属性和值#协议。 其中1、ICMP、2标识igmp # data.payload.name : ' IP '、' IPV6 '、' ARP '或其他if data.payload.name==' IP data.dport, DATA.proto(flow_list.append ) five _ tuple (exceptattributeerror : continue print (attribute error ' ) ) elif data.payload.name==' IPv6 ' : try : five _ tuple=' { } : { } }.format (data [ IPv6 ] ) DATA.proto(flow_list.append ) five_tuple ) exceptattributeerror : continue print ) attributeerror ' ) elif data else end for ) )将大数据包分割为每个流) (' def flowProcess(p ) p ) 3360packets=rdpccets pcap信息的打印flow_list=[] #组的信息统计用# 用于统计不需要的消息数的ARP=0other=0wrong_data=0''5对信息' ' fordatainpackets 3360 # data.shata # data.payload.Nam

e:'IP','IPV6','ARP'或者其他 if data.payload.name == 'IP': try: five_tuple = "{}:{} {}:{} {}".format(data[IP].src,data.sport,data[IP].dst,data.dport,data.proto) flow_list.append(five_tuple) except AttributeError: wrong_data = wrong_data+1 elif data.payload.name == 'IPv6': try: five_tuple = "{}:{} {}:{} {}".format(data[IPv6].src,data.sport,data[IPv6].dst,data.dport,data.proto) flow_list.append(five_tuple) except AttributeError: wrong_data = wrong_data+1 elif data.payload.name == 'ARP': arp = arp+1 else: other = other+1 flow_list.append(five_tuple) #end for print('arp:',arp,' other:', other, ' 数据包损坏:',wrong_data) '''统计流的数目与五元组信息,并保存txt''' i=0 dicts = {} #用于统计每个五元组出现次数 for item in flow_list: if flow_list.count(item)>=1: dicts[item]=flow_list.count(item) #统计五元组重复次数 i = i+1 if i%1000==0:#每1000次打印一下进度 print('字典处理进度:',i/len(flow_list)*100,'%') #end for fileCreate(dicts,p,flow_list) #保存txt ''' 创建每个流的pcap ''' #对每个五元组创建一个文件 t_name1=p.split('.pcap') #t_name1[0] ./****/*** t_name2=t_name1[0].split('./dataset') #t_name2[1] /*** os.mkdir('./dataset'+t_name2[1]) total=len(dicts) #统计流的数目 for key in dicts.keys(): #创建写入器 writer = PcapWriter('./dataset'+t_name2[1]+t_name2[1]+'%d'%total+'.pcap', append = True) total = total-1 if total%100 == 0: print('流切分进度:',(1-(total/len(dicts)))*100,'%') #打印当前进度 for data in packets: if data.payload.name == 'IP': try: #读取当前数据包的信息 t_tuple = "{}:{} {}:{} {}".format(data[IP].src,data.sport,data[IP].dst,data.dport,data.proto) #比较信息 if t_tuple == key: writer.write(data) #写入流 writer.flush() except AttributeError: wrong_data = wrong_data+1 #print("AttributeError") writer.close() #end for'''将五元组信息统计到文件中'''def fileCreate(dicts,p,flow_list): #拆分拼接字符串 创建txt文件 tlist=p.split('pcap') txt_name=tlist[0]+'txt' f = open(txt_name,'w') json_dicts = json.dumps(dicts,indent=1) f.write(json_dicts+"n"+"the number of flows:"+str(len(dicts))+"n"+"the number of packets:"+str(len(flow_list))) f.close() #flowProcess函数用于将pcap按流切分成小pcap#packetRead函数用于读取pcap中所有数据的五元组信息,可用于切分后验证。#fileCreate函数保存统计好的五元组信息#目录结构 ./datasetif __name__=='__main__': #文件夹下数据集列表 ''' dirct = './dataset' dirList=[] fileList=[] files=os.listdir(dirct) print('files:',files) print() ''' #选择要切分的流的位置 p ="./dataset/AppStore-web.pcap" pp="./dataset/AppStore-web/AppStore-web6.pcap" flow_list=flowProcess(p) packetRead(pp)

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。