python – Scapy:检查捕获的DHCP数据包的消息类型

我是
scapy的新手,我正在尝试用它为我的局域网构建一个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层中的选项的方式有点尴尬,但它是我提出的唯一可行的方法.但是我相信必须有更好的,更加抒情的方式,比如通过词典或其他东西.

访问这些选项的适当方式是什么?

最佳答案 我认为这是做你想做的几乎最有效的方式.我会使用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来访问选项.

点赞