首页 文章

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

提问于
浏览
4

我完全是scapy,我'm trying to use it to build a DHCP monitor for my LAN. I'使用 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 或其他东西 .

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

1 回答

  • 1

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

相关问题