#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