使用字段创建scapy中的新协议,具体取决于数据包的总长度

时间:2014-11-18 22:05:12

标签: python network-programming protocols scapy

我正在尝试定义一个协议,该协议使用由于数据包总长度而计算大小的字段。我的目标是从另一个脚本中剖析数据包。

我的第一个想法是重载__init__ Packet类函数以便能够传输变量,但它可能存在另一个 在定义字段时获取此值的简单方法?

我梦想着这样的事情:

class NewProtocol(Packet):
     frameSize = foo
     name = "myNewAwesomeProto"
     fields_desc=[
          BitField("startingField", None, 8),
          BitField("payload", None, (frameSize - (8+2))*8),
          BitField("endingField", None, 2*8)
     ]

提前致谢!

1 个答案:

答案 0 :(得分:1)

我终于在我的第一个想法之后实现了这一点:我重载了__init__ Packet类函数并使用了仅在使用我的数据包字符串作为参数调用构造函数时定义的全局变量:

class NewProtocol(Packet):
     def __init__(self, _pkt="", post_transform=None, _internal=0, _underlayer=None, **fields):
          self.name = "myNewAwesomeProto"
          if _pkt != "":
               global frameSize
               frameSize = len(_pkt)
               fields_desc=[
                    BitField("startingField", None, 8),
                    BitField("payload", None, (frameSize - (8+2))*8),
                    BitField("endingField", None, 2*8)
               ]
          super(NewProtocol, self).__init__(_pkt, post_transform, _internal, _underlayer)