Я собираю новый слой протокола в scapy. Я использую поле пакета для представления пары значений len-value в протокале. Я могу получить слой для создания пакета. .show()
и hexdump()
показывают поля пакетов, как ожидалось. .show2()
Однако это совсем другая история.Использование scapy пакетов полей
У меня есть что-то подобное тоже:
class bar(Packet):
name="Bar Packet"
fields_desc = [
FieldLenField("len", None, length_of="val", fmt="!H"),
StrLenField("val", "", length_from=lambda p:p.len)
]
class foo(Packet):
name="Foo Packet"
fields_desc = [
XByteField("fld1", 0x00),
XByteField("fld2", 0x00),
PacketField("fld3", '', bar),
PacketField("fld4", '', bar),
PacketField("fld5", '', bar),
XByteField("fld6", 0x00),
XByteField("fld7", 0x00)
]
Если я построить пакет как таковой:
p = foo()
p.fld3 = bar(val="one")
p.fld4 = bar(val="two")
p.fld5 = bar(val="three")
p.show()
и hexdump(p)
работать, как ожидалось.
Однако p.show2()
строит пакет просто отлично, но не может рассекать пакетную строку. Поля 1 - 3 рассеиваются, как ожидалось (fld3.len
даже правильно вычисляется). Препятствие здесь. Оставшиеся байты становятся Raw полезной нагрузкой для fld3, а поля 4 - 7 ничего не получают.
Я попытался получить bind_layers(foo, bar)
и получить те же результаты. Основываясь на чтении здесь, в документации scapy и в различных файлах scapy протокола, я думаю, что что-то нужно сделать в bar.post_dissect()
, но я не уверен, что.
Как я могу получить bar
, чтобы оставить оставшуюся необработанную полезную нагрузку до foo
для дальнейшего вскрытия?
Там что-то не так с '' FieldLenField' и StrLenField'. Какова цель «Пакета»? – StephenG
'bar' - это просто пара len: value. В приведенном выше случае в моих пакетах foo есть более одного из них. Но есть прецедент для их предоставления в списках и предоставления нескольких форматов отображения. В краткосрочной перспективе я просто использовал foo {bar1_len, bar1_val, bar2_len, bar2_val, ... и т. Д.}. Но искал что-то более гибкое для будущего использования. –