2016-07-13 3 views
2

Я собираю новый слой протокола в 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 для дальнейшего вскрытия?

+0

Там что-то не так с '' FieldLenField' и StrLenField'. Какова цель «Пакета»? – StephenG

+0

'bar' - это просто пара len: value. В приведенном выше случае в моих пакетах foo есть более одного из них. Но есть прецедент для их предоставления в списках и предоставления нескольких форматов отображения. В краткосрочной перспективе я просто использовал foo {bar1_len, bar1_val, bar2_len, bar2_val, ... и т. Д.}. Но искал что-то более гибкое для будущего использования. –

ответ

2

Я решил это, я только что добавили функцию extract_padding к классу Bar, Кодекс, как:

class Bar(Packet): 
name = "Bar Packet" 
fields_desc = [ 
       FieldLenField("len", None, length_of="val", fmt="!H"), 
       StrLenField("val", 0, length_from=lambda pkt:pkt.len) 
       ] 

def extract_padding(self, p): 
    return "", p 

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) 
       ] 

Если просмотреть документацию Scapy, он говорит:

  • extract_padding() - важная функция, которую должен вызывать каждый слой, содержащий свой собственный размер, так что он может разделить в полезной нагрузке то, что действительно связано с этим слоем, и что будет рассматриваться как дополнительные байты заполнения.

я запускаю этот код, и это результат:

###[ Foo Packet ]### 
    fld1  = 0x0 
    fld2  = 0x0 
    \fld3  \ 
    |###[ Bar Packet ]### 
    | len  = 3 
    | val  = 'one' 
    \fld4  \ 
    |###[ Bar Packet ]### 
    | len  = 3 
    | val  = 'two' 
    \fld5  \ 
    |###[ Bar Packet ]### 
    | len  = 5 
    | val  = 'three' 
    fld6  = 0x0 
    fld7  = 0x0 

Процесс закончил с кодом выхода 0

 Смежные вопросы

  • Нет связанных вопросов^_^