Как проверить наличие слоя в пакете scapy?

Как проверить наличие определенного слоя в пакете scapy? Например, мне нужно проверить поля src/dst в заголовке IP, откуда мне знать, что конкретный пакет действительно имеет заголовок IP (в отличие, например, от IPv6).

Моя проблема в том, что когда я иду проверять поле заголовка IP, я получаю сообщение об ошибке, говорящее, что уровень IP не существует. Вместо заголовка IP в этом конкретном пакете был IPv6.

pkt = Ether(packet_string)
if pkt[IP].dst == something:
  # do this

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

Спасибо!


person Mr. Shickadance    schedule 04.04.2011    source источник
comment
Так что, если выброшено исключение? Просто поймайте его и переделайте в то, что вы теперь знаете.   -  person Santa    schedule 04.04.2011
comment
Хотя это работает, вы обычно хотели бы это сделать? Я имею в виду использование исключений для обработки случаев, которые на самом деле не являются «исключительными». Конечно, это отдельный вопрос. Я собираюсь оставить это открытым на некоторое время, чтобы посмотреть, есть ли реальное решение scapy. Спасибо хоть!   -  person Mr. Shickadance    schedule 04.04.2011
comment
Это вполне по-питоновски. Прозвище таково, что лучше просить прощения, чем разрешения. Сама библиотека Python (и ее аналог C) использует ту же идиому обработки исключений как структуры управления.   -  person Santa    schedule 04.04.2011
comment
Ну, звучит хорошо для меня. Я новичок в Python, поэтому у меня не было большого опыта в этом. По крайней мере, добавление кода было простым, как и многое в Python. В любом случае, я все еще буду ждать ответов, специфичных для scapy, но я ценю понимание.   -  person Mr. Shickadance    schedule 04.04.2011


Ответы (2)


Вы должны попробовать оператор in. Он возвращает True или False в зависимости от того, присутствует слой или нет в Packet.

root@u1010:~/scapy# scapy
Welcome to Scapy (2.2.0-dev)
>>> load_contrib("ospf")
>>> pkts=rdpcap("rogue_ospf_hello.pcap")
>>> p=pkts[0]
>>> IP in p
True
>>> UDP in p
False
>>>
root@u1010:~/scapy#
person jliendo    schedule 05.04.2011
comment
Это именно то, что я искал. Я также очень ценю проницательность Санты, потому что она отлично сработала. Однако я знал, что должен быть какой-то способ проверить это. Спасибо вам обоим! - person Mr. Shickadance; 05.04.2011
comment
я получил ошибку: IndexError: Layer [Radius] not found при попытке импортировать слой радиуса, как это исправить? - person Morteza Soltanabadiyan; 15.10.2020

Для завершения я подумал, что я также упомяну метод haslayer.

>>> pkts=rdpcap("rogue_ospf_hello.pcap") 
>>> p=pkts[0]
>>> p.haslayer(UDP)
0
>>> p.haslayer(IP)
1

Надеюсь, это тоже поможет.

person dc5553    schedule 16.04.2012
comment
Да, это также предлагается в документации Scapy. - person Ricky Robinson; 13.02.2013