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