我一直在寻找一种方法将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有什么不同以及什么样的计算是在做什么?
答案 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实例。 我认为你的问题有两种解决方案。
希望它有所帮助。
答案 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()