scapy как проверить, установлено ли поле

Я создаю слой с помощью 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? Написанная мной лямбда-функция кажется мне правильной, и согласно документации она используется именно так, но она не работает. У вас есть идеи, как я могу это исправить? Идея состоит в том, что если bar1 и bar2 установлены, когда я создаю экземпляр класса Foo, он должен присутствовать в пакете, иначе нет. Я не хочу делать 2 пакета только для этого случая.


person Steve    schedule 12.07.2011    source источник


Ответы (1)


Вы используете ConditionalField не по назначению. ConditionalField — это поле, существование которого определяется некоторым другим полем в пакете. См. следующий пример:

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

Обратите внимание, что существование поля "chksum" зависит от значения поля "chksumpresent", а не от него самого.

Использование двух слоев может быть лучшим подходом (даже если вы пытаетесь избежать этого). Вы можете использовать метод guess_payload_class(), чтобы помочь с этим: http://trac.secdev.org/scapy/wiki/BuildAndDissect

Ваш вопрос интересен (в основном попытка установить is_present="None" в качестве индикатора того, должно ли присутствовать поле). К сожалению, насколько мне известно, Scapy в настоящее время не имеет этой функции.

person phoenix    schedule 17.05.2012