Scapy: Добавление нового протокола со сложными группировками полей

Я пытаюсь указать новый формат пакета, используя scapy . В пакете есть список элементов, а элементы состоят из «сгруппированных полей». Под «сгруппированными полями» я подразумеваю подпоследовательность полей разных типов. Единственный способ создания «сгруппированных полей», который я знаю в scapy, - это использовать класс Packet и использовать FieldLenField / PacketListField для ссылки на длину последовательности. и тип членов списка. Это путь? Примерно так:

from scapy.packet import Packet
from scapy.fields import *

class RepeatingGroupedSequence(Packet):
    name = "Simple group of two fields"

    fields_desc = [IntField('field1', 1), 
                   IntField('field2', 2)]

class TopLayer(Packet):
    name = "Storage for Repeating Sequence"

    fields_desc = [FieldLenField("length", None, count_of='rep_seq'),
                   PacketListField('rep_seq', None, RepeatingGroupedSequence, 
                                   count_from = lambda pkt: pkt.length),
                  ]

#Now here is the problem that I have with assembling PacketListField: 

#craft TopLayer packet
p = TopLayer()

#add two "repeated sequences"
p.rep_seq = [ RepeatingGroupedSequence(), RepeatingGroupedSequence() ]

#both sequences can observed
p.show()

#but the underlying structure of the repeated sequence is #Raw# at this stage
p.show2()

#length is 2
print p.rep_seq, 'length:', len(p.rep_seq)

#but the cloned packet has only one "repeated sequence", the rest is raw
clone = TopLayer(str(p))
clone.show()

#length is 1
print clone.rep_seq, 'length:', len(clone.rep_seq)

Проблема с этим подходом состоит в том, что структура группировки не сохраняется при повторной сборке пакета. При сборке второй экземпляр RepeatedSequence обрабатывается как необработанное тело, даже если поле count равно 2. Как добавить RepeatingSequences таким образом, чтобы структура сохранялась при повторной сборке ? Есть ли способ группировать поля, не прибегая к пакету в качестве типа хранения списков?

5
задан Oleksiy 10 November 2011 в 01:01
поделиться