2011-07-12 25 views
4

我正在用scapy构建一个图层。此图层具有条件字段:scapy如何检查一个字段是否设置

class Foo(Packet): 
    name = "Foo" 
    fields_desc = [ 
      ConditionalField(BitField("bar1", None, 4), 
          lambda pkt: pkt.bar1 is not None), 
      ConditionalField(BitField("bar2", None, 4), 
           lambda pkt: pkt.bar2 is not None), 

      ByteField("bar3", 0x0), 
      ByteField("bar4", 0x0) 
      ] 

现在如何检查bar1是否已设置? RESP。 BAR2?我写的lambda函数对我来说似乎是正确的,根据文档,它以这种方式使用,但它不起作用。你有什么想法我可以解决这个问题吗?这个想法是,如果我在实例化类Foo时设置了bar1bar2,它应该出现在数据包中,否则不会。我不想为这种情况做2个数据包。

回答

2

您未使用ConditionalField s用于其预期用途。 A ConditionalField是一个字段,其存在由数据包中的某个其他字段确定。请看下面的例子:

ConditionalField(XShortField("chksum",None),lambda pkt:pkt.chksumpresent==1) 

注意,"chksum"场的存在依赖于"chksumpresent"字段的值,而不是自己。

使用两层可能是最好的方法(即使您试图避免这一点)。您可以使用guess_payload_class()方法来帮助这个:http://trac.secdev.org/scapy/wiki/BuildAndDissect

你的问题是一个有趣的(基本上是试图给is_present="None"作为指标设置字段是否应该存在)。不幸的是,据我所知,Scapy目前没有这个功能。