我正在用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)
]
Run Code Online (Sandbox Code Playgroud)
现在我如何检查bar1是否已设置?RESP.BAR2?我写的lambda函数对我来说似乎是正确的,并且根据文档它以这种方式使用,但它不起作用.你知道我怎么解决这个问题吗?我们的想法是,如果bar1和bar2我实例化类Foo设置,它应该出现在包,否则不行.我不想只针对那种情况做2包.
您没有将ConditionalFields 用于其预期目的。A是一个字段,其中它的存在由数据包中的某个其他ConditionalField字段确定。请参见以下示例:
ConditionalField(XShortField("chksum",None),lambda pkt:pkt.chksumpresent==1)
Run Code Online (Sandbox Code Playgroud)
请注意,"chksum"字段的存在依赖于字段的值"chksumpresent",而不是字段本身。
使用两层可能是最好的方法(即使您试图避免这种情况)。您可以使用该guess_payload_class()方法来帮助解决此问题:http://trac.secdev.org/scapy/wiki/BuildAndDissect
您的问题很有趣(基本上是尝试将 an 设置is_present="None"为指示字段是否应该存在)。不幸的是,据我所知,Scapy 目前不具备此功能。