如何为自定义 scapy 数据包中的多个字段添加填充?

问题描述 投票:0回答:1

我正在为 scapy 创建自定义数据包格式,并满足以下简化要求:
添加两个字符串字段和填充以获得固定大小的 X 层,其中 X 是硬编码常量。

我有以下代码:

class Custom(Packet):
    fields_desc = [        
        FieldLenField("field1_len", None, fmt="B", length_of="field1"),
        StrLenField("field1", None, length_from=lambda pkt: pkt.field1_len),
        FieldLenField("field2_len", None, fmt="B", length_of="field2"),
        StrLenField("field2", None, length_from=lambda pkt: pkt.field2_len
    ]

packet = Ether() / Custom(field1="abcd", field2="efg")

在这种情况下,X=10,我希望将字节“abcdefg000”添加到数据包中,其中附加 3 个字节的填充以达到 10 个字节的长度。在我的例子中,其他字段将在填充之后添加,因此这不是数据包填充的末尾。

我知道

PadField
对象,但它仅适用于一个字段。我尝试修改它以接受字段列表,尝试了许多其他可能的方法,但没有任何效果。看起来很容易做到的事情,但我找不到好的解决方案。

python networking scapy packet
1个回答
0
投票

使用

post_build
挂钩:

class Custom(Packet):
    fields_desc = [        
        FieldLenField("field1_len", None, fmt="B", length_of="field1"),
        StrLenField("field1", None, length_from=lambda pkt: pkt.field1_len),
        FieldLenField("field2_len", None, fmt="B", length_of="field2"),
        StrLenField("field2", None, length_from=lambda pkt: pkt.field2_len
    ]

    def post_build(self, pkt, pay):
        pkt += b"\x00" * ((-len(pkt)) % 10)
        return pkt + pay
© www.soinside.com 2019 - 2024. All rights reserved.