我必须从pcap文件中过滤数据包并进一步处理它们。 文件非常大,因此一次将整个内容读入内存是不可行的。 Scapy似乎非常复杂,我能够使用
迭代数据包with PcapReader(pcap) as pcap_reader:
for pkt in pcap_reader:
...
不幸的是我无法找到一种方法将过滤器(例如BPF)应用于PcapReader
,因此只会迭代匹配的数据包,也不会pkt
(应该是scapy.packet
}!?)。
我看到有一个函数tdecode
,这是一个tshark解码器,它将过滤器作为参数,但是没有办法将结果数据包保存到变量中,只是为了使终端充满所有结果。
有没有办法使用scapy
从.pcap文件中过滤数据包并仍在迭代结果?
答案 0 :(得分:2)
Scapy的速度令人难以置信,以至于交互式使用是唯一的用途。它也不允许在完全(in-python)解剖之前过滤数据包,这会加剧问题。
您可以使用libpcap
来自行编写小型C扩展程序,也可以使用binding代替PcapReader
。 libpcap
允许您在BPF-syntax中指定过滤器,该过滤器应用于库中的传入数据包,或者 - 当从设备实时捕获时 - 由内核本身应用。这将大大提高您的表现。
基本布局是:
open_offline()
一个pcap文件你可以用quite sophisticated获得。
答案 1 :(得分:0)
您可以使用tcpdump()
函数应用BPF过滤器。
with PcapReader(tcpdump("myfile.cap", args=["-w", "-", "my BPF filter"],
getfd=True)) as pcap_reader:
for pkt in pcap_reader:
print pkt.summary()
如果您对此感兴趣,也许您可以提交功能请求,以便PcapReader()
接受filter
参数(并且行为或多或少类似于sniff()
使用offline=
参数。