python scapy过滤器pcap文件

时间:2017-09-28 13:34:31

标签: python scapy pcap

我必须从pcap文件中过滤数据包并进一步处理它们。 文件非常大,因此一次将整个内容读入内存是不可行的。 Scapy似乎非常复杂,我能够使用

迭代数据包
with PcapReader(pcap) as pcap_reader:
    for pkt in pcap_reader:
        ...

不幸的是我无法找到一种方法将过滤器(例如BPF)应用于PcapReader,因此只会迭代匹配的数据包,也不会pkt(应该是scapy.packet }!?)。

我看到有一个函数tdecode,这是一个tshark解码器,它将过滤器作为参数,但是没有办法将结果数据包保存到变量中,只是为了使终端充满所有结果。

有没有办法使用scapy从.pcap文件中过滤数据包并仍在迭代结果?

2 个答案:

答案 0 :(得分:2)

Scapy的速度令人难以置信,以至于交互式使用是唯一的用途。它也不允许在完全(in-python)解剖之前过滤数据包,这会加剧问题。

您可以使用libpcap来自行编写小型C扩展程序,也可以使用binding代替PcapReaderlibpcap允许您在BPF-syntax中指定过滤器,该过滤器应用于库中的传入数据包,或者 - 当从设备实时捕获时 - 由内核本身应用。这将大大提高您的表现。

基本布局是:

  • open_offline()一个pcap文件
  • 设置BPF过滤器
  • 从libpcap提供的句柄
  • 中读取
  • 将传入的数据包数据传递给scapy进行进一步检查

你可以用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=参数。