如何在自定义Scapy Packet类中设置字段字节长度
Scapy固定长度自定义报文实现
Scapy 中支持任意固定字节长度的通用字段为 StrFixedLenField,不受 ByteField 仅支持1字节的限制,完全匹配你需要的字段长度要求,完整类定义如下:
from scapy.packet import Packet from scapy.fields import StrFixedLenField class MyPacketStructure(Packet): name = "MyPacketStructure" fields_desc = [ StrFixedLenField("field1", b"\x00"*2, length=2), StrFixedLenField("field2", b"\x00"*16, length=16), StrFixedLenField("field3", b"\x00"*12, length=12), StrFixedLenField("field4", b"\x00"*17, length=17), StrFixedLenField("data", b"\x00"*83, length=83), ]
相关问题说明
- 字段选型规则:如果对应字段是存储整数值的语义,2字节的field1也可以替换为
ShortField(默认无符号2字节整数),但对于12、17这类非标准整数字节长度的字段,直接用StrFixedLenField是最通用的方案,不需要额外自定义字段逻辑。 - data载荷选型:你要求data固定占83字节,用
StrFixedLenField是最稳妥的;只有当data是可变长度的尾部载荷时,才需要换用StrLenField或留空让Scapy自动匹配剩余字节。 - 短数据填充逻辑:
StrFixedLenField自带默认填充能力,如果你传入的data实际只有43字节,Scapy会自动在字段尾部补零(b'\x00')凑满83字节,不需要手动写填充逻辑。测试示例:
# 传入仅43字节的data pkt = MyPacketStructure(data=b"t"*43) # 序列化后总长度固定为2+16+12+17+83=130字节,data尾部自动补40个零字节 pkt_raw = bytes(pkt) print(len(pkt_raw)) # 输出130
如果协议要求用非零值填充剩余字节,可以在传入字段值时手动用指定字符补齐长度,常规网络协议默认均采用零填充,直接使用默认逻辑即可。
内容的提问来源于stack exchange,提问作者Capt
相关产品推荐
相关产品推荐

