python scapy过滤pcap文件

python scapy filter pcap file

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

遍历数据包
with PcapReader(pcap) as pcap_reader:
    for pkt in pcap_reader:
        ...

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

我看到有一个函数tdecode,它是一个tshark解码器,它以一个过滤器作为参数,但是没有办法将结果包保存到一个变量中,只能用所有结果。

有没有一种方法可以使用 scapy 从 .pcap 文件中过滤数据包并继续迭代结果?

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

您可以使用 libpcap,方法是自己编写一个小的 C 扩展或使用 binding, as a replacement for PcapReader. libpcap allows you to specify a filter in BPF-syntax,它应用于库中的传入数据包,或者 - 当从设备 - 由内核本身。这将大大提高您的表现。

基本布局为:

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

你可以得到quite sophisticated

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