目的

对数据包(pacp格式)中的数据,按照五元组(#流:源端口号、目的端口号、协议号、源IP、目的IP)对流进行划分。

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

思路

五元组提取

首先对每个数据包进行遍历,提取出里面有效的五元组信息。

在实践中:

  • 因为抓包在链路层,可能有些包是ARP协议等,所以没有上层信息,视为无效包。
  • 还有些数据包缺失端口号或者协议(无tcp,udp等扽标识),暂时没思考出来为什么,会抛出异常,视为无效包。所以在代码中需要加入异常处理。
  • 另外,在PCAP中,IPv4标识为“IP”,IPv6标识为“IPv6”,还有“ARP”协议等等,需要单独处理。

提取五元组后,放在tuple中。本功能单独在packetRead()函数中实现,也在flowProcess()函数中使用。

五元组信息统计

对于同一个流,所有数据报的五元组信息都相同。此处的思路为统计出不相同的五元组信息为一个字典,key为五元组,value为五元组重复次数。

接上一单元,每次tuple提取后,将其append到flow_list的尾部。统计完后列表有重复项。建立空字典,flow_list.count(item)用于统计列表中每一个表项的重复次数,将item设为字典key,count的返回值设为字典的value,即可创建字典。

数据包划分

字典key的数量既为切分结果的子pcap数量,创建子pcap,读取原pcap中每个数据包信息,遇到匹配的塞进去,重复key次即可。

完整代码

# -*- coding: utf-8 -*-
#流:源端口号、目的端口号、协议号、源IP、目的IPimport scapy
from scapy.all import *
from scapy.utils import PcapReader
import os
import json'''数据包五元组读取'''
def packetRead(p):packets=rdpcap(p) #提取pcapprint(packets) #打印pcap信息flow_list=[]   #用于五元组信息统计'''提取五元组信息'''for data in packets:#data.show()  #展示当前类型包含的属性及值#协议:其中1,标识ICMP、2标识IGMP、6标识TCP、17标识UDP、89标识OSPF。#data.payload.name:'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:continueprint("AttributeError")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:continueprint("AttributeError")elif data.payload.name == 'ARP':print('arp')else:print('不是ip ipv6 arp')print(five_tuple)#end for'''将大数据包按流切分'''
def flowProcess(p):packets=rdpcap(p) #提取pcapprint(packets) #打印pcap信息flow_list=[]   #用于五元组信息统计#用于统计不要的报文数arp = 0other = 0wrong_data = 0'''提取五元组信息'''for data in packets:#data.show()  #展示当前类型包含的属性及值#协议:其中1,标识ICMP、2标识IGMP、6标识TCP、17标识UDP、89标识OSPF。#data.payload.name:'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+1elif 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+1elif data.payload.name == 'ARP':arp = arp+1else:other = other+1flow_list.append(five_tuple)#end forprint('arp:',arp,' other:', other, ' 数据包损坏:',wrong_data)'''统计流的数目与五元组信息,并保存txt'''i=0dicts = {} #用于统计每个五元组出现次数for item in flow_list:if flow_list.count(item)>=1:dicts[item]=flow_list.count(item) #统计五元组重复次数i = i+1if i%1000==0:#每1000次打印一下进度print('字典处理进度:',i/len(flow_list)*100,'%')#end forfileCreate(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-1if 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函数保存统计好的五元组信息
#目录结构 ./dataset
if __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)

根据五元组对pcap数据包划分相关推荐

  1. Pcap数据包资源下载汇总-恶意威胁流量

    上一章介绍了一些正常的网络通信流量公开数据集的下载资源,在网络安全领域,对于恶意威胁流量也是很多工程师和研究人员的经常会使用到的,因此本章将介绍一些安全领域经常会用到的恶意威胁流量的下载资源,作为我的 ...

  2. python分析数据包_Python解析pcap数据包

    Post Views: 29,789 零.前言 历时数月,终于结束了考研初试,Blog也很长时间没有更新了,期间还是有些小伙伴来Blog看文章很是感动.以后一定会坚持更新,尽量给大家推送一些干货.这次 ...

  3. 自动还原pcap数据包中文件的几种方法

    本文介绍如何使用wireshark和python分别对pcap数据包中的文件内容进行自动和手动的还原. wireshark在分析数据包的时候,常常会遇到一些wireshark自身无法解码的数据内容,如 ...

  4. Pcap数据包资源下载汇总-多种场景协议流量

    本章汇总了一些网络上公开的pcap数据包的资源,供协议分析测试之用.同时作为我的专栏<Pcap网络数据包处理方法大全 >中的一篇. 前一个章节介绍了pcap数据包的基本结构,相信看过的同学 ...

  5. tshark解析本地pcap数据包提取五元组{src_ip,src_port,proto,dst_ip,dst_port}与时间戳,包长

    tshark官方文档:https://www.wireshark.org/docs/man-pages/tshark.html wireshark官方特征参考:https://www.wireshar ...

  6. Pcap 数据包捕获格式详解

    Pcap 是 Packet Capture 的英文缩写,是一种行业标准的网络数据包捕获格式.如果你是网络开发人员,那么通常会使用 Wireshark.Tcpdump 或 WinDump 等网络分析器捕 ...

  7. tshark 操作后保存为pcap数据包

    具体操作请参考:https://www.wireshark.org/docs/man-pages/tshark.html 使用如下代码即可: tshark -r 源数据包.pcap -w 保存名称.p ...

  8. 基于多种流量检测引擎识别pcap数据包中的威胁

    在很多的场景下,会需要根据数据包判断数据包中存在的威胁.针对已有的数据包,如何判断数据包是何种攻击呢? 方法一可以根据经验,对于常见的WEB类型的攻击,比如SQL注入,命令执行等攻击,是比较容易判断的 ...

  9. 各类攻击 单一协议 pcap数据包 下载网站

    http://packetlife.net/captures/ https://wiki.wireshark.org/SampleCaptures/ https://www.netresec.com/ ...

最新文章

  1. php 获取url文件名,php 获取当前访问的url文件名的方法小结
  2. 【PC工具】N个直播录屏相关软件,手机投屏电脑,电脑显示手机摄像头图像,必须好用无广告!...
  3. 将一个指针 free 两次之后会发生什么?
  4. Apache支持ASP.NET方法浅析
  5. python定义模块结束语_python-模块定义、导入、优化
  6. python新手灰帽脚本练习---文件路径遍历收集
  7. 盖得化工--selenium翻页测试
  8. python 写txt 换行_写入txt文本的内容为什么没换行效果?
  9. 【转】async await 的前世今生(Updated)
  10. paip.接入支付接口功能流程总结
  11. 一眼把人看穿之社交方式 如何辨别朋友的信任度
  12. 张朝阳一天只睡4小时?不知道,反正我每天都睡足7小时
  13. BootstrapTable 表格 checkbox 和 显示行号
  14. unity il2cpp 热更实现
  15. Windows 10 error code 0x80072efd
  16. MiniMap(小地图)插件
  17. 白酒行业如何结合互联网模式突破年营业额过亿
  18. 微信iOS版7.0版发布:界面全新改版
  19. (PMP)三、项目经理的角色
  20. 禁用笔记本触摸板功能

热门文章

  1. C#复习之委托(Delegate)和事件(Event)
  2. Python 16进制转ASCII(十六进制转ASCII)
  3. fatal: 无法访问 LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
  4. vscode中文路径问题
  5. 咻一咻 android代码,支付宝咻一咻怎么用 Android帮你实现咻一咻
  6. 【防火墙静态NAT转换】
  7. 【愚公系列】2023年04月 wireshark系列-数据抓包分析之之恶意流量FTP
  8. Newnode‘s NOI 模拟赛 第二题 (单调dp)
  9. 全球3G产业链研究报告
  10. vue打包文件配置说明vue.config.js