我是新来的Scapy,所以也许这是写在什么地方,但我找不到答案。
我正在尝试创建一个定制的数据包分解器,但是为了将特定的层绑定在一起,我需要在一个更深层的值的条件下这样做。我在RTP层上至少有三层,但是第二层和第三层的数量是由第一层中的值决定的。
Cust1保存接下来的Cust2层数。每个Cust2层将有一个对应的Cust3层,以便在Cust2层链的末尾与之匹配。下面我给出了一个例子,我使用了2a/2b/2c和3a/3b/3c来表示数字是相同的层类型,但是链接在一起。
I.
如果Cust1的值为one(1),则:
UDP / RTP / Cust1 / Cust2a / Cust3a
如果Cust1的值为2(2)
UDP / RTP / Cust1 / Cust2a/Cust2b / Cust3a/Cust3b
如果Cust1的值为3(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...
请告诉我,我不需要为每个场景创建一个自定义层,并使用它来获得我想要的结果。
发布于 2021-03-29 16:37:19
如果您在几个层中分离您的数据包,这是不容易的,使用一些特殊的字段是很容易实现的。(你实际上可以使用guess_payload_class
,但它更让人痛苦.)
这是总的想法:
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),
]
https://stackoverflow.com/questions/66837491
复制相似问题