You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:54:21