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 类(DataRecord1 for Type=1)
  3. 使用 bind_layers 有条件地绑定 2 个数据包层。

您的案例的语法是:

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