【问题标题】:How to define a packet with variable amount of fields using Scapy?如何使用 Scapy 定义具有可变数量字段的数据包?
【发布时间】:2019-06-22 04:14:25
【问题描述】:

我正在尝试在 Scapy 中定义某种类型的数据包。 数据包的所有字段都是同一类型,除了第一个字段是 ByteField,字段的数量将由该 ByteField 字段的值决定。例如,如果值为 8,那么数据包中一共有 9 个字段。

我查看了 Scapy 文档,但在那里找不到任何相关内容。 问题是我必须在数据包本身的定义中执行此操作,并且我认为“fields_desc”结构中不接受循环和变量。

它显然是从某事开始的:

fields_desc = [
    ByteField("NumOfFields", 0),

]

但后来我被卡住了,因为我需要使用该字段的实际值并可能在循环中生成其他字段。

如何做到这一点?

【问题讨论】:

    标签: scapy


    【解决方案1】:

    我认为你可以使用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)
    

    我自己在this question 的代码中的一个非常相似的上下文中使用了它,也许它对你有用。

    【讨论】:

      【解决方案2】:

      您有多种选择:

      • 如果字段属于同一类型:FieldListField 带有 length_from 属性。
      • 创建您自己的自定义字段:使用i2m...
      • PacketListField 用于1 大小的数据包。它有比FielfListField更多的选择。

      无论如何,看看https://scapy.readthedocs.io/en/latest/build_dissect.html#fieldshelp(...) 需要时:-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        • 2014-05-28
        • 1970-01-01
        相关资源
        最近更新 更多