Работа с LenFields в ScaPy - PullRequest
       50

Работа с LenFields в ScaPy

0 голосов
/ 23 февраля 2012

Я пишу некоторые протоколы в ScaPy, но мне сложно понять, как работают поля len. После прочтения http://trac.secdev.org/scapy/wiki/LengthFields я не менее просветленный.

Очевидно, у нас есть то, что они называют 'lenfield' (содержит длину поля) и 'varfield' (содержит поле фактической переменной длины). Однако кажется, что единственными полями, которые могут быть переменными, являются PacketLenField, StrFixedLenField и StrLenField. Где остальные поля? Почему у вас не может быть BitField или XBitField переменной длины?

Например, у меня есть:

BitFieldLenField('lenfield', None, 8, length_of='varfield')

Это правильно возвращает длину 8 (поле, которое я хочу в этом случае, имеет длину 8 октетов / 4 шестнадцатеричных пары). Пока все хорошо. Однако, когда я пытаюсь получить это поле, кажется, что мой единственный вариант - это StrLenField, который возвращает что-то вроде 'A \ x81 \ x11 \ x11P 3'

Итак, мой вопрос: как мне вернуть это поле в качестве фактического гекса в пакете? Я что-то упускаю во встроенных полях или мне нужно создать что-то вроде XBitLenField?

Спасибо за вашу помощь.

Ответы [ 2 ]

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

Этот ответ относится к Scapy 2.2.0.

LenField с, как правило, работают в парах, как показано ниже:

FieldLenField("len", None, length_of="data")
StrLenField("data", "", length_from=lambda pkt:pkt.len)

Обратите внимание, как length_of и length_from связать два поля вместе.Значение length_of указывает Scapy, как вычислять поле "len" при отправке пакета (обратите внимание, что по умолчанию установлено значение None, чтобы указать, что оно должно рассчитываться автоматически).Значение length_from сообщает Scapy, сколько байтов нужно ввести в поле "data", когда оно рассекает пакет.

Существует специальное поле, называемое LenField, которое можно использоватьсамо собой.Еще раз обратите внимание, что значением по умолчанию является None, означающее, что оно должно рассчитываться автоматически.Когда отправка Scapy будет просто вычислять "len" как число байтов, следующих за текущим слоем.

LenField("len", None)

Теперь, когда введены поля длины, вы можете использовать Python для кодирования выводаStrLenField в гекс.

# In layer definition
BitFieldLenField("lenfield", None, 8, length_of="varfield")
StrLenField("varfield", "", length_from=lambda pkt:pkt.lenfield)

# In main script
print(pck[mylayer].varfield.encode("hex"))    # Replace "mylayer" with the name of your new layer
0 голосов
/ 31 июля 2012

Вы можете переписать объект Fields, например StrLenField:

# String to hex split by space
def str2hex(string):
    return ' '.join('%02x' % ord(b) for b in string)


class XStrLenField(scapy.fields.StrLenField):

    def i2repr(self, pkt, x):
        return str2hex(scapy.fields.StrLenField.i2m(self, pkt, x))

После того, как вы можете использовать XStrLenField в field_desc []:

XStrLenField("rand", "", length_from=lambda x: x.len)
...