Python Scapy-添加类型依赖于其他字段的字段
我试图将一个字段添加到一个数据包中,该数据包的类型依赖于另一个字段值。 其中一个“类型”是一个var长度字符串,如果适用,还带有一个附加的“len”属性 考虑以下示例:Python Scapy-添加类型依赖于其他字段的字段,python,python-3.x,scapy,Python,Python 3.x,Scapy,我试图将一个字段添加到一个数据包中,该数据包的类型依赖于另一个字段值。 其中一个“类型”是一个var长度字符串,如果适用,还带有一个附加的“len”属性 考虑以下示例: 从scapy.all导入* 类测试包(数据包): 字段_desc=[ 短字段(“索引”,0), ByteEnumField(“类型”,0,{1:“字符串”,2:“整数”}), ConditionalField(FieldLenField(“len”,None,length of=“data”),lambda x:x.type==
从scapy.all导入*
类测试包(数据包):
字段_desc=[
短字段(“索引”,0),
ByteEnumField(“类型”,0,{1:“字符串”,2:“整数”}),
ConditionalField(FieldLenField(“len”,None,length of=“data”),lambda x:x.type==1),
条件字段(StrLenField(“数据”,“长度”from=lambda pkt:pkt.len),lambda x:x.type==7或x.type==11),
条件字段(IntField(“数据”,1),lambda-pkt:pkt.type==2)]
p=TestPacket(index=12,type=1,data=“我的样本字符串”)
p、 show2()
p=TestPacket(索引=13,类型=2,数据=5)
p、 show2()
问题是“len”总是设置为4(IntField的长度,因为它是最后一个“data”条件字段)
实现此功能的最佳方式是什么?具有不同名称的条件字段?将原始字节存储为var长度字符串,无论类型如何?您可以使用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
),
]
它允许您根据条件使用具有多种类型的同一字段