Scapy:嗅探自制图层

Scapy: Sniffing for self made layers

假设我在 scapy 中创建了一个自己的层,例如

class MyProtocol(Packet):

    name = "MyProtocol"
    fields_desc = [ IntField("layerLength", 8), # always the same
                    ShortField("numberA", 4),
                    ShortField("numberB", 2),
                    IntField("numberC", 2) ]

如果我有两台设备,一台发送包含此自制层的数据包,另一台嗅探网络流量 - 第二台设备如何检测其中一个嗅探数据包是否包含此特殊层? Scapy 已经识别了很多图层,但是如何让它识别我自己制作的图层呢?

我知道我可以简单地获取每个数据包的原始部分,在字节级别对其进行剖析,例如,检查 "layerLength" 字段是否真的包含层的总长度,或者添加一些特殊的独特领域,但这似乎太复杂了,因为 Scapy 已经知道一些层。那么有没有办法让Scapy识别到某一层呢?

Scapy 使用所谓的层绑定来指示何时应应用特定的数据包解析器。各层模块中scapy源码示例可见

例如如果您通过 TCP 端口 2222 使用您的协议,您可以将以下行添加到您的模块:

bind_layers( TCP, MyProtocol, dport=2222)

Scapy 将尝试使用 MyProtocol 将 TCP 负载分解为 MyProtocol。