2016-07-13 269 views
2

我在scapy中放置了一個新的協議層。我使用分組字段來表示協議內的len值對。我可以讓圖層構建一個包。 .show()hexdump()按預期顯示數據包字段。然而,這是一個不同的故事。使用scapy分組域

我有類似的東西太多:如預期

p = foo() 
p.fld3 = bar(val="one") 
p.fld4 = bar(val="two") 
p.fld5 = bar(val="three") 

p.show()hexdump(p)工作:

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.show2()建立數據包很好,但未能剖析數據包字符串。字段1 - 3按預期分解(fld3.len甚至得到正確計算)。解剖停在這裏。剩餘的字節變成fld3的原始有效載荷,並且字段4-7無法獲得。

我試過bind_layers(foo, bar)並得到相同的結果。基於在這裏閱讀,在scapy文檔和各種scapy協議文件中,我認爲需要在bar.post_dissect()中完成,但我不確定是什麼。

我如何獲得bar將剩餘的原始有效載荷放回到foo進一步解剖?

+0

完成有什麼毛病'FieldLenField'和'StrLenField'。 'Packet'' bar'的目標是什麼? – StephenG

+0

'bar'只是len:value對。在上面的例子中,我的foo包中有不止一個。但是有一個用例提供列表並提供多種顯示格式。在短期內,我只用了foo {bar1_len,bar1_val,bar2_len,bar2_val,... etc}。但正在尋找一些對未來使用更靈活的東西。 –

回答

2

我已經解決了它,我只是增加了一個extract_padding功能的酒吧類,代碼如下:

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