为何Scapy的bind_layers无法识别自定义IEEE1722协议层?
解决Scapy自定义IEEE1722协议无法解析的问题
问题原因
你定义的IEEE1722协议字段总位数不是8的整数倍:subtype(8位) + header_specific(1位) + version(3位) = 12位,也就是1.5字节。Scapy无法正确处理非字节对齐的字段组合,导致协议绑定未生效,数据仍被识别为Raw层。
修复方案
IEEE 1722协议的第二个字节实际包含4个保留位(或其他标准定义字段),需要补充完整至8位,让字段总长度为2字节(16位)。修改后的代码如下:
from scapy.all import * class IEEE1722(Packet): name = "ieee1722" fields_desc = [ BitField("subtype", 0, 8), BitField("header_specific", 0, 1), BitField("version", 0, 3), BitField("reserved", 0, 4), # 补充4位保留位,凑齐第二个字节的8位 Raw("payload") ] bind_layers(Ether, IEEE1722, type=0x22f0)
验证结果
修改后重新解析数据包,packet.haslayer(IEEE1722)会返回True,packet.show()也会正确显示ieee1722层:
###[ Ethernet ]### dst = 91:e0:f0:01:00:00 src = 00:fc:70:00:00:02 type = 0x22f0 ###[ ieee1722 ]### subtype = 0 header_specific= 0 version = 0 reserved = 0 ###[ Raw ]### ......
内容的提问来源于stack exchange,提问作者goon
相关产品推荐
相关产品推荐

