Scapy bind_layers 使用绑定范围外的层条件

Scapy bind_layers using a layer condition outside the binding scope

我是 Scapy 的新手,所以也许这被写在某处但我找不到答案。

我正在尝试创建一个自定义数据包解析器,但为了将特定层相互绑定,我需要在更深层的值的条件下执行此操作。 我在 RTP 层之上至少有三层,但第二层和第三层的数量由第一层中的值决定。

Cust1 包含随后的 Cust2 层数。在 Cust2 层链的末尾,每个 Cust2 层都将有一个对应的 Cust3 层与之匹配。我在下面展示了一个示例,其中我使用 2a/2b/2c 和 3a/3b/3c 只是为了表明数字是相同的层类型但链接在一起。

如果 Cust1 的值为 one(1) 那么:

UDP/RTP/Cust1/Cust2a/Cust3a

if Cust1 的值为 two(2):

UDP/RTP/Cust1/Cust2a/Cust2b/Cust3a/Cust3b

if Cust1 的值为 three(3):

UDP/RTP/Cust1/Cust2a/Cust2b/Cust2c/Cust3a/Cust3b/Cust3c

等...

那么我如何为链中更远的绑定引用 Cust1?

bind_layers(RTP, Cust1)
bind_layers(Cust1, Cust2a)
bind_layers(Cust2a, Cust2b, {conditional REF_to_Cust1.value})
bind_layers(Cust2b, Cust2c, {conditional REF_to_Cust1.value})
# etc...

请告诉我,我不必为每个场景创建自定义层并使用它来获得我想要的结果。

如果您将数据包分成几层,这并不容易实现,使用一些特殊字段很容易实现。 (你实际上可以使用 guess_payload_class 但它更痛苦......)

看看PacketListField or at the adequate documentation

这是总体思路:

class Cust2(Packet):
    ...

class Cust3(Packet):
    ...

class Cust1(Packet):
    fields_desc = [
        ByteField("number_of_cust2", 0),
        ...,
        PacketFieldList("cust2s", [], Cust2, count_from=lambda pkt: pkt.number_of_cust2),
        PacketFieldList("cust3s", [], Cust3, count_from=lambda pkt: pkt.number_of_cust2),
    ]