Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何读取比Scapy';更快的Pyshark以外的.cap文件;s rdpcap()?_Python_Pcap - Fatal编程技术网

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

Python 如何读取比Scapy';更快的Pyshark以外的.cap文件;s rdpcap()?,python,pcap,Python,Pcap,我一直在寻找一种将802.11数据包从.cap文件放入阵列的方法。到目前为止,我发现: 斯卡皮: 这是一种很好的方法,有文档可供使用,但速度太慢,当我试图打开一个大于40 Mb的文件时,我会一直挂着,直到它消耗掉我所有的Ram(全部16 GB),这时我的电脑就会阻塞,我必须重新启动它 皮沙克: 没有任何Scapy的问题,但是文档太少了,我找不到处理和获取802.11数据包属性的方法 所以我在想也许有更好的解决方案,或者也许有人确实对pyshark有一些经验 from scapy.all im

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

  • 斯卡皮: 这是一种很好的方法,有文档可供使用,但速度太慢,当我试图打开一个大于40 Mb的文件时,我会一直挂着,直到它消耗掉我所有的Ram(全部16 GB),这时我的电脑就会阻塞,我必须重新启动它

  • 皮沙克: 没有任何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如此不同,它在进行什么样的计算?

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

  • 使用过滤器捕获数据包。在我的工作中,我从未捕获超过2MB的数据包,因为我只在一个无线通道上捕获一次
  • 将巨大的数据包文件分成几个较小的部分。然后再处理它们

  • 希望有帮助。

    你试过dpkt吗?它有一个很好的读卡器接口,似乎可以延迟加载数据包(我已经加载了100MB+pcap文件,没有问题)

    样本:

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

    如果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\u print())或使用autocomplete或查看packet.layer.\u所有\u字段即可。 例如packet.udp.srcport

    文档中缺少什么

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

    多亏了@KimiNewt和 在花了一些时间研究pyshark源代码之后,我对它的细节有了一些了解

    PS:使用pyShark打开一个450MB的文件根本不需要任何时间,而且数据访问也相当容易。目前我看不出使用它有什么坏处,但我会在我的项目进展过程中努力使这篇文章保持最新

    这是一个使用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进行数据包解密,并获取第三层头,因此我可能也会添加它。

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

    归功于:

    但林克现在死了

    with PcapReader('filename.pcapng') as pcap_reader:
        for pkt in pcap_reader:
            #do something with the packet
            ...
    
    这个很好用


    PcapReader就像xrange()到range()

    在这一点上,我必须使用python,这是一个更大框架的一部分。也许你可以展示你编写的用Scapy打开文件的程序。如果是这样的话,我们可以帮助您理解为什么它不起作用。我们将立即进行编辑。在工作中,我经常使用rdpcap()打开更大的文件(大约60MB),它肯定不会占用16GB的RAM。您是否尝试过从代码中删除所有其他内容,并只使用rdpcap(),以及前后的时间度量?我简直不敢相信打开一个40MB的pcap文件需要超过16GB的RAM。顺便说一下,在我看来,一个10MB的文件需要20秒是很正常的。正如您所知,Scapy将一个数据包分解为它知道的所有可能的头和字段,并将它们存储在一个可很好访问的数据结构中。我尝试了以下方法:
    f=open('new40.cap')pcapReader=dpkt.pcap.Reader(file(“new40.cap”)
    ,我得到了这个:
    pcapReader=dpkt.pcap.Reader(file(“new40.cap”))文件“/usr/lib/pymodules/python2.7/dpkt/pcap.py”,第105行,in_uuuinit_uuuself.dloff=dltoff[self.\uu fh.linktype]KeyError:105
    已经尝试分割cap文件,仍然需要太多的时间,但我认为这是最后的手段,我可能只是用一个过滤器捕获,看看在大多数情况下我如何只需要管理packets@MrNoober与流量相比,管理数据包的百分比非常低。筛选器可能是最佳解决方案。如果swer帮助您,别忘了确认。谢谢!正是我一直在寻找的,谢谢!注意:虽然这是一个很好的解决方案,但它确实会破坏其他几个函数。如果您计划做一些不只是迭代的事情,那么它很可能会断开。该链接的其他类似scapy函数仅用于信用卡,您仍然可以使用描述的内容。
    with PcapReader('filename.pcapng') as pcap_reader:
        for pkt in pcap_reader:
            #do something with the packet
            ...