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

Jos*_*ino 5 python network-programming dhcp scapy

我对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)
Run Code Online (Sandbox Code Playgroud)

我在 DHCP 层访问的方式options有点尴尬,但这是我想出的唯一可行的方法。不过我相信一定有更好、更Pythonic的方式,比如通过 adict之类的。

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

Pie*_*rre 2

我认为这几乎是做你想做的事情最有效的方法。我会使用next()生成器表达式而不是列表,以避免在不需要时解析整个选项列表:

req_type = next(opt[1] for opt in pkt[DHCP].options if isinstance(opt, tuple) and opt[0] == 'message-type')
Run Code Online (Sandbox Code Playgroud)

请注意,我还添加了针对 的类型的检查opt,因为有些是字符串对象。

您可以使用 a,dict()但您将再次解析整个选项列表。

附带说明一下,Scapy 中处理 DHCP 选项的方式有点旧,现在正确的方法可能是使用PacketListField更干净的方法来访问选项。