scapy, как проверить, установлено ли поле - PullRequest
5 голосов
/ 12 июля 2011

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

1 Ответ

3 голосов
/ 17 мая 2012

Вы не используете ConditionalField s по прямому назначению.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 в настоящее время не имеет этой функции.

...