5

我正在用 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?分别 酒吧2?我写的 lambda 函数对我来说似乎是正确的,根据文档,它是这样使用的,但它不起作用。你知道我该如何解决这个问题吗?这个想法是,如果在我实例化类 Foo 时设置了bar1bar2,它应该存在于数据包中,否则不存在。我不想只为这种情况做 2 个数据包。

4

1 回答 1

3

您没有将ConditionalFields 用于其预期目的。AConditionalField是一个字段,它的存在由数据包中的某个其他字段确定。请参见以下示例:

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 目前没有这个功能。

于 2012-05-17T16:18:32.620 回答