如何检查scapy数据包中是否存在某层?
我该怎么检查一个scapy数据包中是否有特定的层?比如,我需要查看IP头中的源地址和目标地址字段,怎么知道一个数据包里到底有没有IP头(而不是IPv6之类的)呢?
我的问题是,当我去检查IP头的某个字段时,系统会报错,说IP层不存在。实际上,这个数据包里是IPv6,而不是IP头。
pkt = Ether(packet_string)
if pkt[IP].dst == something:
# do this
我的错误发生在我尝试引用IP层的时候。我该怎么在操作之前检查这个层是否存在呢?
谢谢!
2 个回答
18
为了完整起见,我想提一下 haslayer
这个方法。
>>> pkts=rdpcap("rogue_ospf_hello.pcap")
>>> p=pkts[0]
>>> p.haslayer(UDP)
0
>>> p.haslayer(IP)
1
希望这也能帮到你。
24
你可以试试 in
这个操作符。它会根据这个层是否在 Packet
中来返回 True
(真)或 False
(假)。
root@u1010:~/scapy# scapy
Welcome to Scapy (2.2.0-dev)
>>> load_contrib("ospf")
>>> pkts=rdpcap("rogue_ospf_hello.pcap")
>>> p=pkts[0]
>>> IP in p
True
>>> UDP in p
False
>>>
root@u1010:~/scapy#