Не удается извлечь отдельные поля из пакета scapy

#python #python-3.x #attributes #scapy #arp

#python #python-3.x #атрибуты #scapy #arp

Вопрос:

Я экспериментировал с scapy и Python 3, и я хочу использовать протокол ARP для поиска mac-адресов компьютеров в сети. Это мой код:

 >>> packet = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=IP_OF_HOST))
  

Затем для извлечения данных из этого пакета я использовал следующую строку:

 >>> packet[0][Ether].src
  

Однако по какой-то причине это приводит к ошибке:

 AttributeError: 'list' object has no attribute 'src'
  

В каждом учебном пособии, которое я прочитал, использовался метод, который я использовал для извлечения данных поля, почему это не сработало бы для меня?

Комментарии:

1. Из сообщения об ошибке это выглядит как packet[0][Ether] список. Вы могли бы попытаться print(packet[0][Ether]) посмотреть, что в нем.

Ответ №1:

Это связано с различием между функциями srp() и srp1() (которые предназначены для сетевого уровня 2, для уровня 3 вы бы использовали sr() и sr1() соответственно).

srp() отправляет пакет и сохраняет все пакеты, независимо от того, получили они ответ или нет. Чтобы получить, скажем, исходный MAC-адрес, я бы сделал это:

 answered_packets, unanswered_packets = packet
for packet_i_sent, packet_i_received in answered_packets:
    print(packet_i_received.src)
  

srp1() отправляет пакет, ожидает одного ответа и сохраняет только ответный пакет. Это означает, что формат отличается, поскольку вам не нужно иметь дело с неотвеченными пакетами, и мой предыдущий метод будет работать:

 print(packet.src)     #The [Ether] part doesn't matter, 
                      #that's just for looking fancier when you print(packet)
  

Итак, в основном я использовал команду srp() и попытался расшифровать ответ, как я использовал srp1 ()