【问题标题】:Scapy - Add field with type dependant on other fieldScapy - 添加类型取决于其他字段的字段
【发布时间】:2020-06-03 14:47:02
【问题描述】:

我正在尝试将一个字段添加到一个类型依赖于另一个字段值的数据包。 这些“类型”之一是 var 长度字符串,如果适用,还有一个附加的“len”属性。

考虑以下示例:

from scapy.all import *


class TestPacket(Packet):
        fields_desc=[ 
                  ShortField("index", 0),
                  ByteEnumField("type", 0 , { 1: "String", 2: "Integer" }),
                  ConditionalField(FieldLenField("len", None, length_of="data"), lambda x: x.type==1),
                  ConditionalField(StrLenField("data", "", length_from=lambda pkt:pkt.len), lambda x: x.type==7 or x.type==11),
                  ConditionalField(IntField("data", 1), lambda pkt: pkt.type==2)]


p = TestPacket(index=12, type=1, data="My Sample String")
p.show2()

p = TestPacket(index=13, type=2, data=5)
p.show2()

问题是“len”总是设置为 4(IntField 的长度,因为它是最后一个“data”条件字段)。

实现此功能的最佳方式是什么?具有不同名称的条件字段?将原始字节存储为 var 长度字符串,无论类型如何?

【问题讨论】:

    标签: python python-3.x scapy


    【解决方案1】:

    您可以使用 MultipleTypeField。看 https://scapy.readthedocs.io/en/latest/api/scapy.fields.html#scapy.fields.MultipleTypeField

    例如:

    class DebugPacket(Packet):
        fields_desc = [
            ByteEnumField("atyp", 0x1, {0x1: "IPv4", 0x3: "DNS", 0x4: "IPv6"}),
            MultipleTypeField(
                [
                    # IPv4
                    (IPField("addr", "0.0.0.0"), lambda pkt: pkt.atyp == 0x1),
                    # DNS
                    (DNSStrField("addr", ""), lambda pkt: pkt.atyp == 0x3),
                    # IPv6
                    (IP6Field("addr", "::"), lambda pkt: pkt.atyp == 0x4),
                ],
                StrField("addr", "")  # By default
            ),
        ]
    

    它允许您根据条件拥有具有多种类型的相同字段

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 2022-01-14
      • 2016-01-20
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多