SCAPY:在剖析数据包时如何跳过字节?

SCAPY: How to skip bytes when dissecting a packet?

我正在使用 SCAPY 来解析网络数据包。其中一些在字符串之间有很多随机填充。

有没有办法告诉 SCAPY 只“跳过此字段后的下 4 个字节”? 目前我正在为它们中的每一个使用一个 StrFixedLen 字段,它只会破坏输出并且非常 space 消耗,并且分散注意力...

我不能使用填充字段,因为我需要提供一个填充字节,但在我的例子中,填充由随机字节组成..

感谢任何建议!

编辑:这里是一个数据包的例子

x01x07x08x01
x13
ThisIsAString

x02x04x01x01
x10
AnotherOne

数据包是TLV排序的,所以4个字节是Tag,第5个是字符串的Legnth,然后是Value(string)。由于有很多标签,我现在无法区分所有标签,所以我只想提取数据包数据的长度和值(字符串)部分。所以我想忽略 4 字节的标签。目前我通过声明一个只读取 4 个字节的 StrLenField 来做到这一点。但这显然会显示在数据包的摘要中,因为它被解释为合法字段。但我只想忽略它,这样 SCAPY 在剖析时就跳过 TLV 字段的 4 个字节。

编辑 2:

这是我目前正在做的与我想做的事情的代码片段:

StrFixedLenField("Padding_1", None, length=4),
FieldLenField("Field_1_Length", None, length_of="Field_1"),
StrLenField("Field_1", "", length_from=lambda x: x.Field_1_Length),

StrFixedLenField("Padding_2", None, length=4),
FieldLenField("Field_2_Length", None, length_of="Field_2"),
StrLenField("Field_2", "", length_from=lambda x: x.Field_2_Length)

而不是 StrFixedLenField 我想要 skip_bytes(4) 这样的东西,这样 SCAPY 就会完全忽略这些字节。

this GitHub fork的基础上,作者在其中添加了一个与我搜索的有点相似的功能,我找到了解决方案。

我向 fields.py 添加了一个 class,它只是继承自我想隐藏的字段 class,在我的例子中是 StrFixedLenField:

class StrFixedLenFieldHidden(StrFixedLenField):
    pass

然后在 packet.py_show_or_dump(...) 的定义中 for 循环遍历数据包的字段,我添加了这个:

        for f in self.fields_desc:
            if isinstance(f, StrFixedLenFieldHidden):
                continue
            ...

通过这种方式,Scapy 在进行汇总时会忽略该字段。在我的例子中,隐藏 PDF 转储中的字段也很重要。这可以通过在 packet.py.

中的 do_ps_dump(...) 函数中的 for 循环中添加相同的行来完成

请记住,现在 运行 .show().show2() Scapy 将不再显示这些字段,尽管它们仍然存在,因此在发送时将正确组装数据包带有 sr(...) 或其他内容的数据包。