使用Scapy分析pcap数据包


网络上首先搜到的是如下用法:


使用Scapy分析pcap数据包_第1张图片


看到 “for pktno in range(len(pkts))”,知道rdpcap是把整个数据包读入内存中。我担心数据包很大的情况下,性能影响很大。

于是继续搜,搜到了一篇这样使用的陷阱。解析如下:

Scapy所在目录:C:\Python27\Lib\site-packages\scapy

Rdpcap函数在utils.py文件中的定义:

继续找PcapReader这个类。同样在utils.py这个文件中。继承自同在这个文件中定义的RawPcapReader类。

Read_allPcapReader中的定义:


Read_allRawPcapReader中的定义

使用Scapy分析pcap数据包_第2张图片

可见一个read_all直接把整个的pcap文件全都加载到内存当中了。

而且这里存在一个陷阱。rdpcap其实就是一行代码——return. return时,实例化了PcapReader类,并调用了其read_all函数。不难想到——既然rdpcap的作用是读取一个pcap文件的内容,那一定会有open操作。我们必然要问一句:既然open了,那么你是在哪close的呢??

使用Scapy分析pcap数据包_第3张图片



可见,一旦实例化这个类,初始化函数就会自动的将用户指定的pcap文件打开,但用完之后,必须用户手动close掉才可以。而rdpcap这个函数只实例化了PcapReader这个类,却没有close掉,也没有将实例化的对象传递出来,用户也无法close


因此,代码做如下优化,参照Read_allRawPcapReader中的定义,直接拿出来自己用。

如下,就做到了一包一包的读。读完把文件关闭。

使用Scapy分析pcap数据包_第4张图片


接下来对数据进行分析

按照网上查到的pcap格式,可以获得数据包的时间戳(符合我的应用)

数据如何分析呢?

尝试了下通过repr打印出数据包:


使用Scapy分析pcap数据包_第5张图片



面对这样的数据,不知道如何分析了

于是想知道读取的数据包是什么类型的数据:

print type(data)

得到结果:

搜素其帮助:



得到如下信息:


使用Scapy分析pcap数据包_第6张图片


按照如下信息,试着:print data.src,打印出了源mac地址

同理,试着:print data.load,打印出了udp数据,由此就可以进行数据分析了。




你可能感兴趣的:(脚本语言)