【问题标题】:How to read .cap files other than Pyshark that is faster than Scapy's rdpcap ()?如何读取比 Scapy 的 rdpcap() 更快的 Pyshark 以外的 .cap 文件?
【发布时间】:2014-10-18 01:21:53
【问题描述】:

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

  • 斯卡皮: 这很好,文档可用,但是太慢了,当我尝试打开大小 > 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 如此不同以及是什么样的它在做计算吗?

【问题讨论】:

  • 我必须在这个上使用 python,它是更大框架的一部分
  • 也许你可以展示你编写的用 Scapy 打开文件的程序。如果是这样,我们可以帮助您了解为什么它不起作用。
  • 将立即进行编辑。
  • 在工作中,我经常使用 rdpcap() 打开较大的文件(大约 60MB),它绝对不会占用 16GB 的 RAM。您是否尝试过从代码中删除所有其他内容并且只使用 rdpcap(),并在之前和之后进行时间测量?我简直不敢相信打开一个 40MB 的 pcap 文件需要超过 16GB 的 RAM。
  • 顺便说一句,从我的角度来看,一个 10MB 的文件需要 20 秒是很正常的。如您所知,Scapy 将数据包分解为它知道的所有可能的标头和字段,并将它们存储在一个易于访问的数据结构中。

标签: python pcap


【解决方案1】:

您可以修补名为 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

但是链接现在失效了

【讨论】:

  • 正是我一直在寻找的,谢谢!
  • 注意:虽然是一个不错的解决方案,但这确实会破坏其他几个功能。如果您打算做的不仅仅是迭代,那么它很可能会中断。
  • 还有其他类似的 scapy 函数
  • 链接仅供参考,您仍然可以使用所描述的内容。
【解决方案2】:
with PcapReader('filename.pcapng') as pcap_reader:
    for pkt in pcap_reader:
        #do something with the packet
        ...

这很好用!

PcapReader 就像 xrange() 到 range()

【讨论】:

    【解决方案3】:

    如果 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

    【讨论】:

      【解决方案4】:

      感谢@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 的数据包解密并获取第 3 层标头,所以我也可能会添加。

      【讨论】:

        【解决方案5】:

        你试过dpkt吗?它有一个不错的阅读器界面,似乎可以延迟加载数据包(我已经用它加载了 100MB+ pcap 文件,没问题)。

        示例:

        from dpkt.pcap import Reader
        
        with open(...) as f:
            for pkt in Reader(f):
                ...
        

        【讨论】:

        • 我试过这个:f = open('new40.cap') pcapReader = dpkt.pcap.Reader(file("new40.cap")),我得到了这个:pcapReader = dpkt.pcap.Reader(file("new40.cap")) File "/usr/lib/pymodules/python2.7/dpkt/pcap.py", line 105, in __init__ self.dloff = dltoff[self.__fh.linktype] KeyError: 105
        【解决方案6】:

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

        1. 使用过滤器捕获数据包。在我的工作中,我从未捕获超过 2MB 的数据包,因为我只在一个无线信道上捕获过一次。
        2. 将庞大的数据包文件分成几个较小的部分。然后对付他们。

        希望对你有帮助。

        【讨论】:

        • 已经尝试分割cap文件,仍然需要太多时间,但我认为这是最后的手段,我可​​能只是用过滤器捕获,看看在大多数情况下我只需要管理数据包
        • @MrNoober 与流量相比,管理数据包的百分比非常低。过滤器可能是最好的解决方案。如果此答案对您有帮助,请不要忘记确认。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        • 2019-12-11
        相关资源
        最近更新 更多