Python Scapy — создайте новое определение протокола в данных UDP

#python #scapy #pcap

Вопрос:

Можно ли использовать PcapReader Scapy для анализа данных пакетов UDP с помощью пользовательских полей? Например, в данных пакета UDP (см. Прикрепленный захват Wireshark) есть следующие поля my_proto:

 VER - 2 bytes
FLAGS - 2 bytes
TIMESTAMP - 8 bytes
VAL1 - 4 bytes
VAL2 - 4 bytes, etc
 

Я хотел бы проанализировать эти поля таким образом, чтобы для каждого полученного пакета я мог получить [my_proto].ВЕР, [my_proto].ФЛАГИ и т. Д.

Я думаю, что то, что я хочу, похоже на пример Disney в документации, однако я не уверен, как привязать (не уверен, что это правильное слово) его к части данных UDP. (https://scapy.readthedocs.io/en/latest/build_dissect.html)

введите описание изображения здесь

Ответ №1:

как вы сказали, ваш протокол может быть похож на этот:

 from scapy.all import Packet,LEShortField, LELongField, LEIntField

class GreatProtocol(Packet):
    name = "GreatProtocol "
    fields_desc=[ LEShortField("VER", 0),
                  LEShortField("FLAGS",0),
                  LELongField("TIMESTAMP", 0),
                  LEIntField("VAL1", 0),
                 ]
 

теперь для привязки вам нужно использовать функцию bind.
вы можете использовать его 3 различными способами:

  • Вся полезная нагрузка UDP-это отличный протокол (не рекомендуется).
  • Все UDP с портом dest = X являются отличными (наиболее логичными)
  • Все UDP с портом src = X являются отличным протоколом
 from scapy.all import bind_layers
from scapy.layers.inet import UDP


# All UDP payload are GreatProtocol (not recomended)
bind_layers(UDP, GreatProtocol)

# All UDP with dest port = X are GreatProtocol (most logical)
bind_layers(UDP, GreatProtocol, dport=55)


# All UDP with src port = X are GreatProtocol
bind_layers(UDP, GreatProtocol, sport=99)

 

обратите внимание, что я показываю, используя порт src и dst, но вы можете использовать любое поле UDP уровня

существует также возможность сделать это один раз.

 

my_packet[UDP].decode_payload_as(GreatProtocol)

 

Документы:

создание слоя: https://scapy.readthedocs.io/en/latest/build_dissect.html

связующий слой: https://scapy.readthedocs.io/en/latest/build_dissect.html#binding-layers

decode_payload_as: https://scapy.readthedocs.io/en/latest/api/scapy.packet.html#scapy.packet.Пакет.decode_payload_as