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

MrN*_*ber 4 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
Run Code Online (Sandbox Code Playgroud)

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

tbo*_*ozo 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

学分归于:http: //comments.gmane.org/gmane.comp.security.scapy.general/4462

但链接现在已经死了

  • 注意:虽然这是一个很好的解决方案,但这会破坏其他几个功能 如果你计划做的事情不仅仅是迭代,那么它可能会破裂. (2认同)