python – Virtual PacketField:如何处理多态protocole?

python – Virtual PacketField:如何处理多态protocole?,第1张

概述我是一个新的scapy用户,今天我要求你的帮助. 我正在尝试在scapy中添加一个新的protocole.这个protocole有点特别,因为他是多态的.通过变形,我的意思是他的结构和他的长度取决于某些领域.通常,有一个’function’ByteField,更改此值会改变所有下一个字段. 所以,让我们看一下这段代码,说明我想做什么.有一个简单的多态数据包,带有一个主常量结构// header / 我是一个新的scapy用户,今天我要求你的帮助.

我正在尝试在scapy中添加一个新的protocole.这个protocole有点特别,因为他是多态的.通过变形,我的意思是他的结构和他的长度取决于某些领域.通常,有一个’function’ByteFIEld,更改此值会改变所有下一个字段.

所以,让我们看一下这段代码,说明我想做什么.有一个简单的多态数据包,带有一个主常量结构// header // parameter // data //.变化在参数和数据结构内.

### VIRTUAL ParaMETER PACKETclass myPacketParam(Packet):    name = "Virtual Param Packet"### REAL ParaMETER PACKET ONEclass myPacketParamOne(myPacketParam):    name = "Parameter Type One"    fIElds_desc = [        ByteFIEld("paramOne",0x0),ByteFIEld("paramTwo",0x0)    ]### REAL ParaMETER PACKET TWOclass myPacketParamTwo(myPacketParam):    name = "Parameter Type Two"    fIElds_desc = [        FIEldLenFIEld("length",None,length_of="stringOpt"),StrLenFIEld("stringOpt","BAGUETTE",# Random default value                    length_from=lambda pkt: pkt.length)    ]### VIRTUAL DATA PACKETclass myPacketData(Packet):    name = "Virtual Data Packet"### REAL DATA PACKET ONEclass myPacketDataOne(myPacketData):    name = "Data Type One"    fIElds_desc = [        ByteFIEld("length",2),ByteFIEld("dataOne",ByteFIEld("dataTwo",0x0)    ]### REAL DATA PACKET TWOclass myPacketDataTwo(myPacketData):    name = "Data Type Two"    fIElds_desc = [        FIEldLenFIEld("length",length_of="data"),StrLenFIEld("data","SAUCISSON",length_from=lambda pkt: pkt.length) # Random default value    ]### MAIN PACKETclass myPacket(Packet):    name = "myPacket"    def changeFunction(self,value,data):        if value == 0x1:            self.param = myPacketParamOne()            self.data = myPacketDataOne()        else:            self.param = myPacketParamTwo()            self.data = myPacketDataTwo()    fIElds_desc = [        ByteFIEld("version",0x15),ActionFIEld(ByteFIEld("function",0x1),"changeFunction"),FIEldLenFIEld("lengthParam",length_of="param"),FIEldLenFIEld("lengthData",PacketFIEld("param",myPacketParamOne(),myPacketParam),PacketFIEld("data",myPacketDataOne(),myPacketData)    ]

好吧,关键是主数据包“myPacket”中的“param”和“data”字段.例如,“param”packetfIEld正在询问myPacketParam数据包.但我希望这个数据包是虚拟的:后面的真正数据包可以是myPacketParamOne或myPacketParamTwo.数据同样如此.

构建此数据包看起来没问题.

p = myPacket()p.show()# great resultp.function = 2p.show()###[ myPacket ]###  version   = 21  function  = 2  lengthParam= None  lengthData= None  \param     \   |###[ Parameter Type Two ]###   |  length    = None   |  stringOpt = 'BAGUETTE'  \data      \   |###[ Data Type Two ]###   |  length    = None   |  data      = 'SAUCISSON'

但我猜解剖是行不通的.

p.show2()###[ myPacket ]###  version   = 21  function  = 2  lengthParam= 10  lengthData= 11  \param     \   |###[ Virtual Param Packet ]###   |###[ Raw ]###   |     load      = 'BAGUETTE\x00\tSAUCISSON'  \data      \   |###[ Data Type One ]###   |  length    = 2   |  dataOne   = 0   |  dataTwo   = 0

这是完全错误的.

我找到了一些解决方案通过示例使用conditionalFIEld.但在我真正的protocole中,同一个数据包中有很多形态.并且因为字段不能具有相同的名称,所以主数据包中没有简单的param字段,而是每个案例的新名称.因此,真正利用我的scapy实现是非常无聊而且不简单.

第二种解决方案是取消链接标题,参数和数据.所以你可以像这样使用protocole:p = myPacket()/ myPacketParamOne()/ myPacketDataOne().但对我来说这不是一个好的解决方案,因为我的真正的protocole在每个部分之间都存在依赖关系,而且对于我的scapy实现的用户来说仍然很复杂.

所以,如果可能的话,我正在寻找一个解决方案:
– 尊重主要结构(标题/参数/数据)
– 简单地使用这个protocole(myPacket.param.whatyouwant来获取param而不考虑它是什么样的param包(当然这种param packe中存在woutyouwant字段))

我觉得解决方案可以是在每个“虚拟数据包”中重新定义do_dissect函数,或者为新的字段编码,特别是对于虚拟数据包,但我尝试了许多事情而没有成功.

我希望我能理解.

先感谢您 :)

弥敦道

解决方法 (这有点旧^^)

自从Scapy的最新版本(使用2.4.3rc是安全的)以来,我们有一个新的MultipleTypeFIEld似乎在做你想要的.这是回归测试中的一个例子:

class DeBUGPacket(Packet):    fIElds_desc = [        ByteEnumFIEld("atyp",0x1,{0x1: "IPv4",0x3: "DNS",0x4: "IPv6"}),MultipleTypeFIEld(            [                # IPv4                (IPFIEld("addr","0.0.0.0"),lambda pkt: pkt.atyp == 0x1),# DNS                (DNsstrFIEld("addr",""),lambda pkt: pkt.atyp == 0x3),# IPv6                (IP6FIEld("addr","::"),lambda pkt: pkt.atyp == 0x4),],StrFIEld("addr","")  # By default        ),]

它允许您根据条件使具有多种类型的相同字段

总结

以上是内存溢出为你收集整理的python – Virtual PacketField:如何处理多态protocole?全部内容,希望文章能够帮你解决python – Virtual PacketField:如何处理多态protocole?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1196072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存