如何检查 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 运算符。它返回TrueFalse,具体取决于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 that haslayer is superceded by cls in self method.

以上是关于如何检查 scapy 数据包中是不是存在层?的主要内容,如果未能解决你的问题,请参考以下文章

获取数据包中的所有层

Scapy:伪造数据包时要重新计算的字段

检查包中是不是存在文件

python解析pcap文件中的http数据包

Python Scapy ARP

在R中,如何检查卸载包中是否存在函数?