Установить размер FieldLenField - PullRequest
0 голосов
/ 20 апреля 2020

Я хочу, чтобы 1 байт FieldLenField позволял только 256 элементов в соответствующем FieldListField, как я могу это сделать?

from scapy import *

class Foo(Packet):
    name = "Foo"
    fields_desc = [
        ShortField("id", random.getrandbits(16)),
        FieldLenField("len", None, count_of="pld"),
        FieldListField("pld", None, IPField("", "0.0.0.0"), count_from=lambda pkt: pkt.len)
    ]

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

1 Ответ

1 голос
/ 22 апреля 2020

Установка FieldLenField на 1 байт

Вам необходимо переопределить длину по умолчанию для FieldLenField, которая в настоящее время H. H - это символ формата из структуры библиотеки Python, представляющий собой 2 байта без знака (0-65535). Чтобы форсировать однобайтовое беззнаковое, вместо этого используйте B:

from scapy import *

class Foo(Packet):
    name = "Foo"
    fields_desc = [
        ShortField("id", random.getrandbits(16)),
        FieldLenField("len", 0, fmt="B", count_of="pld"),
        FieldListField("pld", None, IPField("", "0.0.0.0"), 
                       count_from=lambda pkt: pkt.len)
    ]

pkt = Foo()
print(bytes(pkt))

Запустив это, мы получим 2 случайных байта для идентификатора и 1 байт для len, который выглядит следующим образом:

b'\x21\xea\x00'

где последний байт является значением по умолчанию 0, которое мы установили.

Проверка

Если вместо этого мы попытаемся установить значение len равным 300, который находится вне интервала [0, 255], мы получим ошибку:

pkt.len = 300
bytes(pkt)

...<traceback>
error: ubyte format requires 0 <= number <= 255
...