Как определить пакет с переменным количеством полей, используя Scapy? - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь определить пакет определенного типа в Scapy.Все поля пакета относятся к одному и тому же типу, кроме первого поля ByteField, и количество полей будет определяться значением этого поля ByteField.Например, если значение равно 8, то в пакете будет всего 9 полей.

Я просмотрел документацию Scapy, но не смог найти там ничего подходящего.Проблема в том, что я должен сделать это внутри определения самого пакета, и я не думаю, что циклы и переменные принимаются в структуре fields_desc.

Очевидно, это начинается как-то:

fields_desc = [
    ByteField("NumOfFields", 0),

]

Но тогда я застрял, поскольку мне нужно использовать фактическое значение этого поля и генерировать другие поля, вероятно, в цикле.

Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

У вас есть несколько вариантов:

  • Если поля одного типа: FieldListField с атрибутом length_from.
  • Создайте свое собственное поле: используя i2m ...
  • Используйте PacketListField с пакетами 1 размера.У него есть больше опций, чем у FielfListField.

. В любом случае обратите внимание на https://scapy.readthedocs.io/en/latest/build_dissect.html#fields и help(...) при необходимости: -)

1 голос
/ 18 июня 2019

Я думаю, вы можете использовать ConditionalField.

Из документации Scapy:

ConditionalField(fld, cond)
        # Wrapper to make field 'fld' only appear if
        # function 'cond' evals to True, e.g.
        # ConditionalField(XShortField("chksum",None),lambda pkt:pkt.chksumpresent==1)

Так что вы можете сделать что-то вроде -

ConditionalField(IntField('Field_1', 0), lambda pkt: pkt.NumOfFields >= 1)

Я сам использовал его в довольно похожем контексте в коде этот вопрос , возможно, он будет вам полезен.

...