2012-05-11 3 views
2

Мне интересно, как определять типы полей для класса динамически в соответствии с полем из другого класса ??? Я имею в виду, как определить и связать поле из класса в другой класс, например:Получение типов полей динамически в соответствии с полем из другого класса (с использованием инструмента Scapy - Python)

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 

ответ

1

Я считаю, что ближайшая особенность, которая 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) 
0

Вы также можете использовать bind_layers функцию, чтобы добавить условный слой. Шаги:

  1. Определение основного шаблона ПКТ класс (TemplateRecord)
  2. Определение суб ПКТ класса (DataRecord1 для Type = 1)
  3. Используйте bind_layers для связывания 2 пакета слоев условно.

Синтаксис для Вашего случая будет:

bind_layers(TemplateRecord, DataRecordForType1, {'Type':1})