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

问题描述 投票:5回答:1

我正在用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包。

python scapy
1个回答
3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.