Scapy如何创建自定义协议/数据包结构?自定义字段定义方法
Scapy自定义固定长度数据包实现方案
各字段对应类型选择
- 2字节的
field1:如果存储整数型数值,直接用内置的ShortField(默认大端序,小端序选LEShortField),这是Scapy预设的固定2字节整数字段;如果存储2字节原始字节串,换成StrFixedLenField指定长度2即可。 - 16字节
field2、12字节field3、17字节field4:这类非标准整数长度的固定字节内容,统一用StrFixedLenField即可,初始化时传入对应长度参数。
支持自定义长度的Scapy字段类型
常用的有三类:
StrFixedLenField:最常用的固定长度字节串字段,直接指定字节长度即可,适合存固定标识、自定义字节块这类内容,长度不足时默认自动补\x00填充。BitField:以位为单位指定长度的整数字段,适合非标准字节长度的整数场景,比如3字节整数就设长度为24(位)。FieldLenField:用于和其他字段联动的长度标识字段,一般配合变长载荷使用,当前固定长度场景不需要用到。
data字段处理方案
- 固定83字节的data载荷直接用
StrFixedLenField定义即可,也可以用PadField包裹实现自动补长,效果一致。 - 如果传入的data只有43字节,
StrFixedLenField默认会自动在内容末尾补40个\x00空字节凑够83字节长度,不需要手动处理。如果你需要用其他值填充(比如\xff),可以在赋值时手动对内容做补长:data_content.ljust(83, b'\xff')即可。
完整示例代码
from scapy.packet import Packet from scapy.fields import ShortField, StrFixedLenField class MyPacketStructure(Packet): name = "MyCustomPacket" fields_desc = [ ShortField("field1", 0), # 2字节整数字段,默认值0 StrFixedLenField("field2", b"", 16), # 16字节固定长度字段,默认空 StrFixedLenField("field3", b"", 12), # 12字节固定长度字段 StrFixedLenField("field4", b"", 17), # 17字节固定长度字段 StrFixedLenField("data", b"", 83) # 83字节固定载荷 ] # 测试用例 if __name__ == "__main__": test_pkt = MyPacketStructure( field1=0x1234, field2=b"test_field2_content", field3=b"test_field3", field4=b"test_field4_content", data=b"a"*43 # 仅43字节,构建时自动补40个\x00 ) test_pkt.show() # 总长度应为2+16+12+17+83=130字节 print(f"构建后包总长度: {len(bytes(test_pkt))} 字节")
注意:所有传入
StrFixedLenField的内容必须是bytes类型,不要直接传Python字符串,否则构建包时会抛出类型错误;如果field1不需要解析为整数,直接替换成StrFixedLenField("field1", b"", 2)即可按原始字节处理。
内容的提问来源于stack exchange,提问作者Capt
相关产品推荐
相关产品推荐

