我正在用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时设置bar1
和bar2
,它应该存在于数据包中,否则不存在。我不想只针对那种情况做2包。
答案 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目前没有此功能。