如何检查 scapy 数据包中是不是存在层?
Posted
技术标签:
【中文标题】如何检查 scapy 数据包中是不是存在层?【英文标题】:How to check for presence of a layer in a scapy packet?如何检查 scapy 数据包中是否存在层? 【发布时间】:2011-07-29 06:35:20 【问题描述】:如何检查 scapy 数据包中是否存在特定层?例如,我需要检查 IP 标头的 src/dst 字段,我如何知道特定数据包实际上具有 IP 标头(例如与 IPv6 相对)。
我的问题是,当我检查 IP 标头字段时,我收到一条错误消息,指出 IP 层不存在。这个特定的数据包没有 IP 标头,而是使用 IPv6。
pkt = Ether(packet_string)
if pkt[IP].dst == something:
# do this
当我尝试引用 IP 层时出现错误。在尝试操作之前如何检查该层是否存在?
谢谢!
【问题讨论】:
如果抛出异常怎么办?抓住它,然后将它重铸成你现在所知道的样子。 虽然可行,但这是您通常想要做的事情吗?我的意思是使用异常来处理并非真正“异常”的情况。当然,这本身就是一个问题。我将把它打开一段时间,看看是否有一个真正的 scapy 解决方案。不过谢谢! 这很 Pythonic。绰号是,“请求宽恕比许可更好。” Python 库本身(及其对应的 C 语言)使用相同的异常处理作为控制结构的习惯用法。 嗯,听起来不错。我是 Python 的新手,所以我对此没有太多了解。至少添加代码很简单,就像 Python 中的许多东西一样。无论如何,我仍然会等待特定于 scapy 的响应,但我很欣赏这种洞察力。 【参考方案1】:您应该尝试in
运算符。它返回True
或False
,具体取决于Packet
中是否存在该层。
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#
【讨论】:
这正是我想要的。我也非常感谢圣诞老人的洞察力,因为那效果很好。但是我知道一定有某种方法可以检查这一点。谢谢你们! 我收到错误:IndexError: Layer [Radius] not found
尝试导入 Radius 层,如何解决?【参考方案2】:
为了完成,我想我还会提到haslayer
方法。
>>> pkts=rdpcap("rogue_ospf_hello.pcap")
>>> p=pkts[0]
>>> p.haslayer(UDP)
0
>>> p.haslayer(IP)
1
希望也能有所帮助。
【讨论】:
是的,这也是 Scapy 文档中建议的内容。 Latest Scapy socs say thathaslayer
is superceded by cls in self
method.以上是关于如何检查 scapy 数据包中是不是存在层?的主要内容,如果未能解决你的问题,请参考以下文章