如何读取Pyshark以外的.cap文件比Scapy的rdpcap()更快?

时间:2014-08-24 21:48:37

标签: python pcap

我一直在寻找一种方法将802.11数据包从.cap文件转换为数组。到目前为止,我发现:

  • Scapy的: 当我尝试打开一个大小为>的文件时,这是一种很好的,可用的文档,但速度太慢40 Mb,我只是一直挂着,直到它消耗掉我所有的Ram(所有16个演出),此时我的电脑只是阻塞而且我必须重启它

  • Pyshark: 没有任何Scapy的问题,但文档太稀缺,我找不到处理和获取802.11数据包属性的方法

所以我想也许有更好的解决方案,或者有人确实对pyshark有一些经验?

from scapy.all import *
import pyshark
from collections import defaultdict
import sys
import math
import numpy as np
counter=0
Stats = np.zeros((14))
filename='cap.cap'

a = rdpcap(filename)
print len(a)
for p in a:
        pkt = p.payload
        #Management packets
        if p.haslayer(Dot11) and p.type == 0:
                ipcounter = ipcounter +1
                Stats[p.subtype] = Stats[p.subtype] + 1

print Stats

注意:当我使用10兆字节输入启动程序时(例如)大约需要20秒左右,但它确实有效,我想知道为什么会这样,为什么它与pyshark有什么不同以及什么样的计算是在做什么?

6 个答案:

答案 0 :(得分:9)

您可以修补名为utils.py的scapy文件,以便它不会将所有内容加载到内存中

改变:

def read_all(self,count=-1):
    """return a list of all packets in the pcap file
    """
    res=[]
    while count != 0:
        count -= 1
        p = self.read_packet()
        if p is None:
            break
        res.append(p)
    return res

def read_all(self,count=-1):
    """return an iterable of all packets in the pcap file
    """
    while count != 0:
        count -= 1
        p = self.read_packet()
        if p is None:
            break
        yield p
    return

信用额度: http://comments.gmane.org/gmane.comp.security.scapy.general/4462

但链接已经死了

答案 1 :(得分:2)

Scapy会将所有数据包加载到您的内存中并创建一个packetList实例。 我认为你的问题有两种解决方案。

  1. 使用过滤器捕获数据包。在我的工作中,我从未捕获超过2MB的数据包,因为我只在一个无线信道上捕获一次。
  2. 将巨大的数据包文件分成几个较小的部分。然后处理它们。
  3. 希望它有所帮助。

答案 2 :(得分:2)

如果pyshark符合您的需求,您可以这样使用:

cap = pyshark.FileCapture('/tmp/mycap.cap')
for packet in cap:
    my_layer = packet.layer_name # or packet['layer name'] or packet[layer_index]

要查看您拥有的可用图层以及它们具有的属性,只需打印它们(或使用layer / packet.pretty_print())或使用自动完成或查看packet.layer._all_fields。 例如packet.udp.srcport。

文档中缺少什么?

请注意,您还可以将过滤器作为参数应用于FileCapture实例(显示过滤器或BPF过滤器,请参阅docs

答案 3 :(得分:0)

你试过dpkt吗?它有一个很好的Reader接口,似乎是懒加载数据包(我已经加载了100MB + pcap文件,没问题)。

样品:

from dpkt.pcap import Reader

with open(...) as f:
    for pkt in Reader(f):
        ...

答案 4 :(得分:0)

感谢@KimiNewt和 在花了一些时间使用pyshark源代码后,我对它的基本知识有了一些了解

PS:使用pyShark打开一个450 MB的文件根本不需要任何时间,数据访问相当容易。我目前没有看到使用它的任何缺点,但是当我进入项目时,我会尝试使这篇文章保持最新状态。

这是使用pyShark解析802.11数据包的示例代码,我希望它能帮助那些从事类似项目的人。

import pyshark

#Opening the cap file
filename='data-cap-01.cap'
cap = pyshark.FileCapture(filename)

#Getting a list of all fields of this packet on the level of this specific layer
#looking somthing like this :['fc_frag', 'fc_type_subtype',..., 'fc_type']
print cap[0]['WLAN']._field_names

#Getting the value of a specific field, the packet type in
#this case (Control, Management or Data ) which will be represented by an Integer (0,1,2)
print cap[0]['WLAN'].get_field_value('fc_type')

我稍后会为WEP和WPA进行数据包解密并获得第三层标头,所以我也可以添加它。

答案 5 :(得分:0)

with PcapReader('filename.pcapng') as pcap_reader:
    for pkt in pcap_reader:
        #do something with the packet
        ...

这很有效!

PcapReader就像xrange()到range()