2

別のクラスのフィールドに応じて、クラスのフィールドタイプを動的に定義する方法を知りたいですか??? クラスから別のクラスにフィールドを定義してリンクする方法を意味します。例:

class TemplateRecord(Packet):
    name = "Template Record"
    fields_desc = [ ShortField("Type", 0),
                    ShortField("Length", 0) ]

    def extract_padding(self, s):
            return "", s


class DataRecord(Packet):
    name = "Data Record"
    fields_desc = [ ==> Here i would like something like this :

            "if Type == 0 from Class TemplateRecord:
                IPField("ipsrc", "0.0.0.0"),
            if Type == 1 from Class TemplateRecord
                IPField("ipdst", "0.0.0.0"),
            if Type == 2 from Class TemplateRecord
                                    ByteField("DstMask", 0),

            ....etc..." 

        ]
    def extract_padding(self, s):
            return "", s
4

2 に答える 2

2

Scapy があなたが望むものに最も近い機能は条件付きフィールドだと思います。形式は次のとおりです。

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

これを Packet.underlayer と組み合わせて使用​​してみてください。

レイヤーが TemplateRecord()/DataRecord() のように設定されていると仮定します

ConditionalField(IPField("ipsrc", "0.0.0.0"), lambda pkt:pkt.underlayer.Type==0),
ConditionalField(IPField("ipdst", "0.0.0.0"), lambda pkt:pkt.underlayer.Type==1),
ConditionalField(ByteField("DstMask", 0), lambda pkt:pkt.underlayer.Type==2)
于 2012-05-17T14:07:58.317 に答える
0

bind_layers 関数を使用して、条件付きレイヤーを追加することもできます。手順:

  1. メイン pkt テンプレート クラス (TemplateRecord) を定義します。
  2. サブ pkt クラスを定義します (Type=1 の場合は DataRecord1)。
  3. bind_layers を使用して、2 つのパケット レイヤーを条件付きでバインドします。

あなたの場合の構文は次のようになります。

bind_layers(TemplateRecord, DataRecordForType1, {'Type':1})
于 2014-03-08T14:58:07.673 に答える