• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

使用scapy分组域

scapy 来源:B Keenan 3次浏览

我在scapy中放置了一个新的协议层。我使用分组字段来表示协议内的len值对。我可以让图层构建一个包。 .show()hexdump()按预期显示数据包字段。然而,这是一个不同的故事。使用scapy分组域

我有类似的东西太多:如预期

<code class="prettyprint-override">p = foo() 
p.fld3 = bar(val="one") 
p.fld4 = bar(val="two") 
p.fld5 = bar(val="three") 
</code>

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

<code class="prettyprint-override">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) 
        ] 
</code>

如果你建造一个数据包本身。

但是,p.show2()建立数据包很好,但未能剖析数据包字符串。字段1 – 3按预期分解(fld3.len甚至得到正确计算)。解剖停在这里。剩余的字节变成fld3的原始有效载荷,并且字段4-7无法获得。

我试过bind_layers(foo, bar)并得到相同的结果。基于在这里阅读,在scapy文档和各种scapy协议文件中,我认为需要在bar.post_dissect()中完成,但我不确定是什么。

我如何获得bar将剩余的原始有效载荷放回到foo进一步解剖?


===========解决方案如下:

我已经解决了它,我只是增加了一个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


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)