Python 如何读取比Scapy';更快的Pyshark以外的.cap文件;s rdpcap()?
我一直在寻找一种将802.11数据包从.cap文件放入阵列的方法。到目前为止,我发现: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
- 斯卡皮: 这是一种很好的方法,有文档可供使用,但速度太慢,当我试图打开一个大于40 Mb的文件时,我会一直挂着,直到它消耗掉我所有的Ram(全部16 GB),这时我的电脑就会阻塞,我必须重新启动它
- 皮沙克: 没有任何Scapy的问题,但是文档太少了,我找不到处理和获取802.11数据包属性的方法
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实例。 我认为有两种方法可以解决你的问题
希望有帮助。你试过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
...