gpt4 book ai didi

python - 绕过 Python Scapy 中的一些数据包层

转载 作者:太空宇宙 更新时间:2023-11-03 14:24:12 25 4
gpt4 key购买 nike

我想构造一个带有Vlan部分的IP包。使用 Scapy 可以轻松完成:

from scapy import inet
newpkt = inet.Ether()/inet.Dot1Q()/inet.IP()

有时我想在数据包中包含inet.Dot1Q(),有时不需要。inet.Dot1Q() 的默认值应该是多少,以便在运算符“/”中简单地绕过它?我尝试了 ''None - 它们不起作用。

from scapy import inet
myDot1Q = SOME DEFAULT VALUE
newpkt = inet.Ether()/myDot1Q/inet.IP()
#new packet is a valid IP packet here

编辑:对我的问题的不同解释

1) 我可以创建一个带有 VLAN 标签的数据包

inet.Ether()/inet.Dot1Q/inet.IP()

2) 我可以创建一个带有双 VLAN 标签的数据包

inet.Ether()/inet.Dot1Q/inet.Dot1Q/inet.IP()

3) 我如何构建一个可能是无标记数据包、VLAN 标记数据包或双重 VLAN 标记数据包的数据包?有这样的东西会很棒:

#No VLAN
myVlan = ???
myDoubleVlan = ???

#VLAN
myVlan = inet.Dot1Q()
myDoubleVlan = ???

#Double VLAN
myVlan = inet.Dot1Q()
myDoubleVlan = inet.Dot1Q()

#In any case the packet structure should remain the same
inet.Ether()/myVlan/myDoubleVlan/inet.IP()

我不知道默认值 ??? 应该是什么才能正确构造数据包。

最佳答案

首先,我想不出任何您不使用像这样的简单解决方案的理由:

# example for single Vlan
# myVlan = Dot1Q()
# myDoubleVlan = None

# generate the package
package = Ether()
if myVlan: package /= myVlan
if myDoubleVlan: package /= myDoubleVlan
package /= IP()

但无论如何,如果这种方法出于某种原因 Not Acceptable ,还有另一种可能性......
您可以重写 Packet 类并创建您自己的与除法运算符无关的类。您唯一需要做的就是覆盖 __div__ 方法并添加一些括号以保留正确的优先级。

这就是你将如何实现它:

from scapy.all import *

class NeutralPacket(Packet):
def __init__(self, _pkt="", _internal=0, **fields):
super(NeutralPacket, self).__init__(_pkt, _internal, **fields)
def __div__(self, other):
return other

#No VLAN
myVlan = NeutralPacket()
myDoubleVlan = NeutralPacket()

#VLAN
myVlan = Dot1Q()
myDoubleVlan = NeutralPacket()

#Double VLAN
myVlan = Dot1Q()
myDoubleVlan = Dot1Q()

# this part doesn't need to change, but you need to have two
# additional parenthesis for proper precedence
Ether()/(myVlan/(myDoubleVlan/IP()))

补充说明:

__div__()方法是除法运算符的实现。解释器将 a/b 作为 a.__div__(b) 执行,并且 Packet 类有自己的此运算符的实现。如果你看一下它的 code ,你可以看到它基本上是将 b 包的 payload 附加到 a 包。
我们在这里做的只是返回 other 包,在这种情况下是 b,有效地完全忽略 a
请注意,这仅在一个方向上有效,当 NeutralPacket 是左侧运算符时,否则它是其他类的 __div__() 方法正在执行。为了处理这个问题,我们必须添加括号,以便优先级使我们的 NeutralPacket 类始终是左侧运算符。由于 Packet 的实现,这不会影响整体结果,因此这很适合您的情况。唯一行不通的是,如果 NeutralPacket 是最右侧(即最后一个)运算符,那么您就无法强制使用正确的优先级。但是对于 VLAN 这不是问题,因为它上面总是有层..

关于python - 绕过 Python Scapy 中的一些数据包层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23047827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com