首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用绑定作用域外的层条件的Scapy bind_layers

使用绑定作用域外的层条件的Scapy bind_layers
EN

Stack Overflow用户
提问于 2021-03-28 00:49:36
回答 1查看 393关注 0票数 0

我是新来的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来获取链中更远的绑定呢?

代码语言:javascript
运行
复制
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...

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-29 16:37:19

如果您在几个层中分离您的数据包,这是不容易的,使用一些特殊的字段是很容易实现的。(你实际上可以使用guess_payload_class,但它更让人痛苦.)

看看PacketListField充分的文件

这是总的想法:

代码语言:javascript
运行
复制
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),
    ]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66837491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档