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

问题描述

我正在与SCAPY一起解剖网络数据包。其中一些在字符串之间有很多随机填充。

是否有一种方法可以告诉SCAPY“跳过此字段后的下4个字节”? 目前,我为每个人都使用一个StrFixedLen字段,它只会炸毁输出,非常耗费空间,并且会分散注意力……

我不能使用填充字段,因为我需要提供一个填充字节,但是在我的情况下,填充由随机字节组成。.

感谢您的任何建议!

编辑:这里是数据包的示例

x01x07x08x01
x13
ThisIsAString

x02x04x01x01
x10
Anotherone

数据包是TLV排序的,因此4个字节是标签,第5个字节是字符串的Legnth,然后是值(字符串)。由于标签很多,我不能也不能够完全区分它们,所以我只想提取数据包数据的长度和值(字符串)部分。所以我想忽略4字节标签。目前,我通过声明一个StrLenField来读取4个字节来完成此操作。但这显然会在数据包摘要显示,因为它被解释为合法字段。但是我只想忽略它,以便SCAPY在解剖时仅跳过TLV字段的4个字节。

编辑2:

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

StrFixedLenField("Padding_1",None,length=4),FieldLenField("Field_1_Length",length_of="Field_1"),StrLenField("Field_1","",length_from=lambda x: x.Field_1_Length),StrFixedLenField("Padding_2",FieldLenField("Field_2_Length",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添加了一个类,该类仅继承自要隐藏的字段类,在我的情况下为StrFixedLenField

class StrFixedLenFieldHidden(StrFixedLenField):
    pass

然后在packet.py循环中_show_or_dump(...)的{​​{1}}的定义中循环访问数据包的字段,我添加了以下内容:

for

通过这种方式,Scapy在执行摘要时只会忽略该字段。就我而言,隐藏PDF转储中的字段也很重要。可以通过在 for f in self.fields_desc: if isinstance(f,StrFixedLenFieldHidden): continue ... 的{​​{1}}函数的for循环中添加相同的行来完成。

请记住,现在,当运行do_ps_dump(...)packet.py时,Scapy将不再显示这些字段,尽管它们仍然存在,所以当使用{{1 }}。