Scapy:检查捕获的 DHCP 数据包的消息类型
Scapy: check the message type of a captured DHCP packet
我是 scapy 的新手,我正在尝试使用它为我的 LAN 构建 DHCP 监视器。我正在使用 sniff
来捕获通过 prn=
参数发送到回调的数据包。在回调中,我检查数据包是否有 DHCP
层,然后检查请求的类型。
我目前是这样做的:
def manage(pkt):
if pkt.haslayer(DHCP):
req_type = [x[1] for x in pkt[DHCP].options if x[0] == 'message-type'][0]
# Message type: request
if req_type == 3:
print ("Request from {}".format(pkt[Ether].src))
sniff(prn=manage, count=0, store=0)
我在 DHCP 层访问 options
的方式有点笨拙,但这是我想出的唯一可行的方式。但是我相信一定有更好、更 pythonic 的方式,比如通过 dict
或其他方式。
访问这些选项的适当方式是什么?
我认为这是做你想做的几乎最有效的方法。我会使用 next()
和生成器表达式而不是列表,以避免在不需要时解析整个选项列表:
req_type = next(opt[1] for opt in pkt[DHCP].options if isinstance(opt, tuple) and opt[0] == 'message-type')
请注意,我还添加了针对 opt
类型的检查,因为有些是字符串对象。
您可以使用 dict()
,但您必须再次解析整个选项列表。
附带说明一下,Scapy 中处理 DHCP 选项的方式有点陈旧,现在正确的做法可能是使用 PacketListField
更简洁的方法来访问选项。
我是 scapy 的新手,我正在尝试使用它为我的 LAN 构建 DHCP 监视器。我正在使用 sniff
来捕获通过 prn=
参数发送到回调的数据包。在回调中,我检查数据包是否有 DHCP
层,然后检查请求的类型。
我目前是这样做的:
def manage(pkt):
if pkt.haslayer(DHCP):
req_type = [x[1] for x in pkt[DHCP].options if x[0] == 'message-type'][0]
# Message type: request
if req_type == 3:
print ("Request from {}".format(pkt[Ether].src))
sniff(prn=manage, count=0, store=0)
我在 DHCP 层访问 options
的方式有点笨拙,但这是我想出的唯一可行的方式。但是我相信一定有更好、更 pythonic 的方式,比如通过 dict
或其他方式。
访问这些选项的适当方式是什么?
我认为这是做你想做的几乎最有效的方法。我会使用 next()
和生成器表达式而不是列表,以避免在不需要时解析整个选项列表:
req_type = next(opt[1] for opt in pkt[DHCP].options if isinstance(opt, tuple) and opt[0] == 'message-type')
请注意,我还添加了针对 opt
类型的检查,因为有些是字符串对象。
您可以使用 dict()
,但您必须再次解析整个选项列表。
附带说明一下,Scapy 中处理 DHCP 选项的方式有点陈旧,现在正确的做法可能是使用 PacketListField
更简洁的方法来访问选项。