使用scapy分组域
我在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
进一步解剖?
回答:
我已经解决了它,我只是增加了一个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
以上是 使用scapy分组域 的全部内容, 来源链接: utcz.com/qa/262250.html