Как получить значение поля из уровня пакета, если имя поля является строковой переменной? - PullRequest
2 голосов
/ 25 марта 2020

У меня есть layer и field в качестве переменных. Как я могу получить значение поля?

#packet is just a sniff() packet

layer = "IP"
field = "src"

# I need something like
fieldValue = packet[layer].field

# or
fieldValue = packet[layer].getfieldval(field)


print("Layer: ", layer, " Field: ", field, " Value: ", fieldValue)
#Output- Layer: IP Field: src Value: 192.168.1.1

1 Ответ

1 голос
/ 26 марта 2020

Допустим, мы нюхаем пакеты со scapy и хотим посмотреть на значения внутри. Во многом это связано с использованием scapy документации , чтобы найти, какие атрибуты имеет каждый слой. Вы также можете сделать это в вашем интерпретаторе python / scapy с помощью dir(packet), чтобы увидеть, какие атрибуты и методы у него есть. Например:

>>> dir(packet)
...
 'show',
 'show2',
 'show_indent',
 'show_summary',
 'sniffed_on',
 'sprintf',
 'src',
...

Чтобы динамически получить атрибут источника из пакета, нам нужно использовать функцию getattr , которая может получать как методы, так и атрибуты из объекта.

# Required if you are not using the scapy interpreter
from scapy.all import sniff, IP

layer = "IP"
field = "src"

# Sniff 4 packets, filtering for packets with an IP layer
packet_list = sniff(filter="ip", count=4)
# Choose first packet arbitrarily
packet0 = packet_list[0]
# We can get the attribute reflexively because python allows it
field_value = getattr(packet0[layer], field)

# Print this information
print("Layer: ", layer, " Field: ", field, " Value: ", field_value)
---
> Layer:  IP  Field:  src  Value:  192.168.1.246
...