scapy如何检查是否设置了字段

时间:2011-07-12 08:16:09

标签: python scapy

我正在用scapy构建一个图层。该图层具有ConditionalFields:

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包。

1 个答案:

答案 0 :(得分:3)

您没有将ConditionalField用于其预期目的。 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目前没有此功能。