Scapy中Layer1与IP层绑定后无法自动设置typeNext字段问题
问题解决:Scapy层绑定中自动设置嵌套PacketField字段
问题原因
你当前的bind_layers写法错误,Scapy无法识别直接传入的Header2(typeNext=9)作为嵌套字段的设置值。对于PacketField类型的嵌套字段,需要通过父字段名_子字段名的格式来指定要设置的子字段,而不是传递子Packet实例。
解决方案
修改bind_layers的参数,用header2_typeNext=9替代原有的header2=Header2(typeNext=9),具体代码如下:
class Header1(Packet): name = "Content" fields_desc = [ XByteField("foo1", 1), XByteField("bar1", 1)] class Header2(Packet): name = "Content" fields_desc = [ XByteField("foo2", 2), XByteField("typeNext", 2)] class Layer1(Packet): name = "headerPacket" fields_desc = [ PacketField("header1", Header1(), Header1), PacketField("header2", Header2(), Header2)] # 修改此处的绑定参数格式 bind_layers(Layer1, IP, header2_typeNext=9) P=Layer1()/IP() P.show()
输出结果
运行修改后的代码,将得到你期望的输出:
###[ headerPacket ]### \header1 \ |###[ Content ]### | foo1 = 0x1 | bar1 = 0x1 \header2 \ |###[ Content ]### | foo2 = 0x2 | typeNext = 0x9 ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = hopopt chksum = None src = 127.0.0.1 dst = 127.0.0.1 \options \
原理说明
Scapy的bind_layers函数支持通过下划线连接的方式访问嵌套字段:
- 当你使用
header2_typeNext时,Scapy会自动解析为Layer1中的header2字段下的typeNext子字段 - 这种格式同时适用于层绑定的匹配条件和自动设置字段的场景
内容的提问来源于stack exchange,提问作者N1N1
相关产品推荐
相关产品推荐

