Read/capture scapy 大于 65535 字节的数据包

Read/capture packets larger than 65535 bytes with scapy

我发布并回答这个问题是因为我花了很长时间才弄清楚,我希望它能帮助其他人并节省前进的时间。

我正在读取在 Wireshark 中创建的 USBPcap 文件,其中包含最大 494439 字节的大型同步数据包。然后我试图用 scapy 解析 python 中的数据包。不幸的是,对于大于 65535 字节的数据包,scapy 2.4.3 默认忽略第 65535 个字节之后的字节。

有没有办法读取大于 65535 字节的数据包?

为了指示 scapy 读取大于 65535 字节的数据包,您必须在 scapy.utils API 中找到的许多 pcap 读取生成器一次读取一个数据包。具体来说,scapy.utils 中的以下 类 支持从 pcap 或 pcapng 文件读取大数据包:

  1. class scapy.utils.PcapReader(filename)
  2. class scapy.utils.PcapNgReader(filename)
  3. class scapy.utils.RawPcapReader(filename)
  4. class scapy.utils.RawPcapNgReader(filename)

请注意 scapy.utils.rdpcap(filename, count=- 1) 不支持此功能。

我的解决方案:

from scapy.all import *

packet_reader = RawPcapNgReader('my_pcapng_file.pcapng')

while True:
    try:
        # created my own usb_packet class to parse packet header on __init__
        p = usb_packet(packet_reader.read_packet(size=500000)) # read packet up to 500 kB large
        if p.filter(): # filter packets based on usb_packet custom filter method
            print(len(p.hex_str), len(p.data_packets)) # do stuff to the filtered packets
    except EOFError:
        break

为了通过 sniff 或类似方式捕获数据包,可以通过 class scapy.config.Conf.bufsize 设置缓冲区大小,默认为 65536 以允许捕获 65535 字节的数据包(参见 docs) .对于实用编程,可以在读取 pcaps 时设置此配置,而不是在生成器上调用 read_packet() 的任何地方维护 size 参数。

An interesting note:这个默认值似乎是由于 IPv4 数据包结构,其中数据包长度由 16 位数字表示。换句话说,这个 header 值可以描述的最大数据包是 1111111111111111 字节,或 2^16=65536。从零开始计数,最大的 IPv4 数据包为 65535 字节。对于 USB,就我而言,更大的数据包是可能的。