如何使用 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#fieldshelp(...) 需要时:-)