如何使用 Scapy 定义具有可变字段数量的数据包?
How to define a packet with variable amount of fields using Scapy?
我正在尝试在 Scapy 中定义某种类型的数据包。
数据包的所有字段都是同一类型,除了第一个字段是 ByteField,字段的数量将由该 ByteField 字段的值决定。例如,如果值为8,则数据包中总共有9个字段。
我查看了 Scapy 文档,但在那里找不到任何相关内容。
问题是我必须在数据包本身的定义中进行,我认为 "fields_desc" 结构中不接受循环和变量。
它显然开始于:
fields_desc = [
ByteField("NumOfFields", 0),
]
但后来我卡住了,因为我需要使用该字段的实际值并可能在循环中生成其他字段。
如何做到这一点?
我想你可以使用 ConditionalField
。
来自 Scapy 文档:
ConditionalField(fld, cond)
# Wrapper to make field 'fld' only appear if
# function 'cond' evals to True, e.g.
# ConditionalField(XShortField("chksum",None),lambda pkt:pkt.chksumpresent==1)
所以你可以做一些像-
ConditionalField(IntField('Field_1', 0), lambda pkt: pkt.NumOfFields >= 1)
我自己在 的代码中的一个非常相似的上下文中使用它,也许它对你有用。
您有多种选择:
- 如果字段属于同一类型:
FieldListField
具有 length_from
属性。
- 创建您自己的自定义字段:使用
i2m
...
- 使用大小为 1 的数据包的
PacketListField
。它有更多的选项 FielfListField
.
无论如何,看看https://scapy.readthedocs.io/en/latest/build_dissect.html#fields
和 help(...)
需要时:-)
我正在尝试在 Scapy 中定义某种类型的数据包。 数据包的所有字段都是同一类型,除了第一个字段是 ByteField,字段的数量将由该 ByteField 字段的值决定。例如,如果值为8,则数据包中总共有9个字段。
我查看了 Scapy 文档,但在那里找不到任何相关内容。 问题是我必须在数据包本身的定义中进行,我认为 "fields_desc" 结构中不接受循环和变量。
它显然开始于:
fields_desc = [
ByteField("NumOfFields", 0),
]
但后来我卡住了,因为我需要使用该字段的实际值并可能在循环中生成其他字段。
如何做到这一点?
我想你可以使用 ConditionalField
。
来自 Scapy 文档:
ConditionalField(fld, cond)
# Wrapper to make field 'fld' only appear if
# function 'cond' evals to True, e.g.
# ConditionalField(XShortField("chksum",None),lambda pkt:pkt.chksumpresent==1)
所以你可以做一些像-
ConditionalField(IntField('Field_1', 0), lambda pkt: pkt.NumOfFields >= 1)
我自己在
您有多种选择:
- 如果字段属于同一类型:
FieldListField
具有length_from
属性。 - 创建您自己的自定义字段:使用
i2m
... - 使用大小为 1 的数据包的
PacketListField
。它有更多的选项FielfListField
.
无论如何,看看https://scapy.readthedocs.io/en/latest/build_dissect.html#fields
和 help(...)
需要时:-)