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

Scapy自定义HSR层无法被遍历识别的问题求助

Scapy自定义HSR层无法被遍历识别的问题求助

我在Scapy里用bind_layers添加了一个HSR自定义层,但好像哪里操作出错了,数据包没法被正确识别。我折腾了好几次还是没搞明白问题出在哪,想请大家帮忙排查一下!

我的HSR头部是892f10b60000,其中892f是协议类型标识。我把这个自定义层和Ether、Dot1Q做了绑定,因为这两个是可能的下层协议。

以下是我写的代码:

from scapy.data import ETHER_TYPES
from scapy.fields import XBitField, BitFieldLenField, ShortField, XShortEnumField
from scapy.layers.l2 import Ether, Dot1Q, LLC
from scapy.packet import Packet, bind_layers


def remove_layer(pkt, pos):
    print('remove_layer N = ' + str(pos))
    payload = pkt[pos].payload
    pkt[pos - 1].remove_payload()
    return pkt / payload


def remove_hsr(pkt):
    print('remove_hsr')
    print('layers:')
    for layer in pkt:
        print(layer.name)
    if HSR in pkt:
        print('HSR is here')
    j = 0
    for layer in pkt:
        if layer is HSR:
            print('HSR layer index: ' + str(j))
            return remove_layer(pkt, j)
        j += 1
    print('remove_hsr : HSR not found')
    return pkt


class HSR(Packet):
    name = "HSR"
    fields_desc = [
        XBitField("path_id", 0, 4),
        BitFieldLenField("lsdu_size", 0, 12),
        ShortField("sequence_number", 0),
        XShortEnumField("type", 0x9000, ETHER_TYPES),
    ]


bind_layers(Ether, HSR, type=0x892f)
bind_layers(Dot1Q, HSR, type=0x892f)


pkt_nohsr = '0060089fb1f300400540ef24000e810000200800450000a43b3b40004006b7548397208183972015048a17704e14e0754d3d609980187c70b13900000101080a0004f0c90199a3f3420007001d00c0000800c00000005e00d9025e00d9020000d9025e00420007001d00c0000900c00001005d00d8025d00d8020100d8025d00420007001d00c0000700c00001000100d80201000100010001005d00420007001d00c0000a00c00000000000d90200000000000000005e00568034cb'
pkt_nohsr = bytearray.fromhex(pkt_nohsr)
pkt_nohsr = Ether(pkt_nohsr)
print(pkt_nohsr)
pkt = '0060089fb1f300400540ef24892f10b60000000e810000200800450000a43b3b40004006b7548397208183972015048a17704e14e0754d3d609980187c70b13900000101080a0004f0c90199a3f3420007001d00c0000800c00000005e00d9025e00d9020000d9025e00420007001d00c0000900c00001005d00d8025d00d8020100d8025d00420007001d00c0000700c00001000100d80201000100010001005d00420007001d00c0000a00c00000000000d90200000000000000005e00568034cb'
pkt = bytearray.fromhex(pkt)
pkt = Ether(pkt)
print(pkt)
print(remove_hsr(pkt))

运行这段代码后,我得到了如下输出:

802.3 00:40:05:40:ef:24 > 00:60:08:9f:b1:f3 / LLC / Raw / Padding
00:40:05:40:ef:24 > 00:60:08:9f:b1:f3 (0x892f) / HSR / Raw
remove_hsr
layers:
Ethernet
HSR is here
remove_hsr : HSR not found
00:40:05:40:ef:24 > 00:60:08:9f:b1:f3 (0x892f) / HSR / Raw

现在我遇到的问题是:

  • print(pkt)无法识别HSR层内部的其他协议层
  • HSR in pkt返回True,但用for layer in pkt遍历数据包时,只有1次循环,拿到的只有Ethernet层

到底是哪里写错了啊?

备注:内容来源于stack exchange,提问作者онконвулб дгюквншад

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:43:08