设置FieldLenField的大小

2024-04-26 17:17:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个1字节的FieldLenField在对应的FieldListField中只允许256个项目,我该怎么做

from scapy import *

class Foo(Packet):
    name = "Foo"
    fields_desc = [
        ShortField("id", random.getrandbits(16)),
        FieldLenField("len", None, count_of="pld"),
        FieldListField("pld", None, IPField("", "0.0.0.0"), count_from=lambda pkt: pkt.len)
    ]

谢谢你的帮助


Tags: 项目fromimportnonelen字节foopacket
1条回答
网友
1楼 · 发布于 2024-04-26 17:17:57

将FieldLenField设置为1字节

您需要覆盖FieldLenField的默认长度,当前为HH是Python结构库中的一个format character,它是一个无符号的2字节(0-65535)。要强制一个字节无符号,请改用B

from scapy import *

class Foo(Packet):
    name = "Foo"
    fields_desc = [
        ShortField("id", random.getrandbits(16)),
        FieldLenField("len", 0, fmt="B", count_of="pld"),
        FieldListField("pld", None, IPField("", "0.0.0.0"), 
                       count_from=lambda pkt: pkt.len)
    ]

pkt = Foo()
print(bytes(pkt))

运行此命令,我们将得到2个随机字节作为ID,1个字节作为len,如下所示:

b'\x21\xea\x00'

其中最后一个字节是我们设置的默认0

验证

相反,如果我们尝试将len的值设置为300,这超出了区间[0255],我们将得到一个错误:

pkt.len = 300
bytes(pkt)

...<traceback>
error: ubyte format requires 0 <= number <= 255

相关问题 更多 >