前言
新手写博客,写博客主要目的是为了记录自己做项目的一些过程。关于网络流量项目,刚开始做项目一个月左右,所写的博客必然有很多不足的地方,欢迎大家交流和指教。
获取pcap包
pcap包特征提取第一步是要获得pcap包。pcap一般有两种获取方式,一种是下载开源的数据集,另外一种是通过自己抓包获得。
开源流量数据集有很多。这里贴一个博主总结的网络流量领域公开数据集。
抓包一般可以通过wireshark工具实现。在抓包的时候由于我需要获取网络流量client_hello的部分这里用了wireshark自带的过滤器来提取。
由于我需要client_hello的部分在黄色框的地方输入ssl.handshake.type == 1既可以获得有关于client_hello的数据包,然后再导出即可。
基于flowcontainer的特征提取
这里我在提取网络流量特征提取的时候采用了flowcontainer的库,在提取特征的时候有尝试过例如pyshark之类的库,比较用起来觉得flowcontainer方便。查阅了一些资料说是flowcontainer在速度上会比较慢,但是博主没有尝试过,大家可以自己选择。
安装flowcontianer,在自己对应环境下输入即可。
pip install flowcontainer -i https://pypi.douban.com/simple/
这里说一下自己个人在安装和使用中碰到的问题:
(1)确保环境变量有tshark的环境,这里没有配置过的,搜索下如何配置环境变量,各个环境变量配置方法基本一致。
(2)如果在编译器(博主是pycharm)运行记得启用管理者模式否则会出现以下报错,当时博主找了N久,才de出这个bug。
OSError: tshark is not installed or added to environment path.
其他有关于该库安装和使用的问题可以参考这篇博客。当时我学习这个库主要参考了这个博主的文章。
我自己使用这个库是为了获得有关网络流量中payload_length,time_delta,以及packet_length和sni的特征。这里上代码。extension可以自己选择想要提取的特征,如果想要提取别的特征参考上面超链接博客。
from flowcontainer.extractor import extract
result = extract(r"D:\Apaper\pyproje\pyproje\client-hello.pcap",filter='',extension=['tls.handshake.extensions_server_name','frame.time_delta','frame.cap_len'])payload_length =[] #total payload_length
time_delta=[] #total time_delta
packet_length=[] #total packet_length
sni = [] #total snifor key in result:value = result[key]payload_length.append(value.payload_lengths[0])#save total payload_lengthtime_delta.append((value.extension['frame.time_delta'][0])[0])#save total time_deltapacket_length.append((value.extension['frame.cap_len'][0][0]))#save total packet_lengthif ('tls.handshake.extensions_server_name' in value.extension):#一些没有sni的client_hello数据包用NULL先暂时替代sni.append((value.extension['tls.handshake.extensions_server_name'][0])[0])#save total snielse:sni.append('NULL') #删除没有sni的pcap
for i in range (len(sni)-1,-1,-1):if sni[i] =='NULL':payload_length.pop(i)packet_length.pop(i)sni.pop(i)time_delta.pop(i)print(payload_length)
print(time_delta)
print(packet_length)
print(sni)
print('\n')
这里我以列表的形式储存了特征。之所以有删除没有sni的pcap这个步骤,是因为我使用wireshark过滤后的client_hello包没有sni标志。具体原因不太理解,如果有懂的可以评论区说下。输出的结果如下:
然后使用保存储存到excel就可以了,完整代码,两部分直接合并修改路径即可运行。
import xlwt
f = xlwt.Workbook('encoding = utf-8') #设置工作簿编码
sheet1 = f.add_sheet('sheet1',cell_overwrite_ok=True) #创建sheet工作表
sheet1.write(0,0,'sni')
sheet1.write(0,1,'payload_length')
sheet1.write(0,2,'packet_length')
sheet1.write(0,3,'time_delta')
for i in range(len(sni)):sheet1.write(i+1,0,sni[i]) #写入对应数据sheet1.write(i+1,1,payload_length[i])sheet1.write(i+1,2,packet_length[i])sheet1.write(i+1,3,time_delta[i])f.save('text.xls')#保存.xls到当前工作目录