Чтение / захват пакетов размером более 65535 байт с помощью scapy - PullRequest
0 голосов
/ 09 июля 2020

Я отправляю этот вопрос и отвечаю на него, потому что мне потребовалось так много времени, чтобы разобраться, и я надеюсь, что это поможет другим и сэкономит время в будущем.

Я читаю файлы USBPcap, созданные в Wireshark, с большими, изохронные пакеты до 494439 байт. Затем я пытаюсь разобрать пакеты в python с помощью scapy. К сожалению, scapy 2.4.3 по умолчанию игнорирует байты после 65535-го байта для пакетов размером более 65535 байт.

Есть ли способ читать пакеты размером более 65535 байт?

1 Ответ

0 голосов
/ 09 июля 2020

Чтобы указать scapy на чтение пакетов размером более 65535 байт, вы должны читать пакеты по одному с многих генераторов чтения pcap, найденных в scapy.utils API. В частности, следующие классы в 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 ). Для программирования pragmati c можно также установить эту конфигурацию при чтении pcaps вместо сохранения аргумента size везде, где read_packet() вызывается в генераторе.

Интересное примечание : Это значение по умолчанию, по-видимому, связано со структурой пакета IPv4, в которой длина пакета представлена ​​16-битным числом. Другими словами, самый большой пакет, который может отобразить это значение заголовка, составляет 1111111111111111 байт, или 2 ^ 16 = 65536. Если считать с нуля, то наибольший размер пакета IPv4 составляет 65535 байт. Для USB, как и в моем случае, возможны пакеты большего размера.

...