使用scapy读取/捕获大于65535字节的数据包

时间:2020-07-09 17:03:11

标签: python scapy

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

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

是否可以读取大于65535字节的数据包?

1 个答案:

答案 0 :(得分:0)

为了指示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)。对于实用的编程,在读取pcap时也可以设置此配置,而不是在生成器上调用size的任何地方都保持read_packet()参数。

An interesting note:此默认值似乎归因于IPv4数据包结构,其中数据包长度由16位数字表示。换句话说,此标头值可以描述的最大数据包为1111111111111111字节,即2 ^ 16 = 65536。从零开始,我们拥有最大的IPv4数据包6553​​5字节。就我而言,对于USB,更大的数据包是可能的。