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),
]
我是 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),
]