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? 私が書いたラムダ関数は私には正しいように見えます。ドキュメントによると、そのように使用されていますが、機能していません。どうすればこれを修正できるか分かりますか? アイデアは、クラス Foo をインスタンス化するときにbar1とが設定されている場合は、パケットに存在する必要があり、そうでない場合は存在しないということです。bar2そのためだけに 2 つのパケットを実行したくありません。

4

1 に答える 1

3

ConditionalField意図した目的で s を使用していません。AConditionalFieldは、その存在がパケット内の他のフィールドによって決定されるフィールドです。次の例を参照してください。

ConditionalField(XShortField("chksum",None),lambda pkt:pkt.chksumpresent==1)

フィールドの存在は、フィールド自体ではなく"chksum"、フィールドの値に依存していることに注意してください。"chksumpresent"

2 つのレイヤーを使用することが最善の方法かもしれません (これを回避しようとしている場合でも)。guess_payload_class()これを支援する方法を使用できます: http://trac.secdev.org/scapy/wiki/BuildAndDissect

あなたの質問は興味深いものです(基本的にis_present="None"、フィールドが存在するかどうかの指標として を設定しようとしています)。残念ながら、私の知る限り、Scapy には現在この機能がありません。

于 2012-05-17T16:18:32.620 に答える