设置 FieldLenField 的大小
Set size of FieldLenField
我想要一个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)
]
感谢您的帮助。
将 FieldLenField 设置为 1 个字节
您需要覆盖 FieldLenField
的默认长度,目前为 H
。 H
是来自 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,这在区间 [0, 255] 之外,我们将得到一个错误:
pkt.len = 300
bytes(pkt)
...<traceback>
error: ubyte format requires 0 <= number <= 255
我想要一个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)
]
感谢您的帮助。
将 FieldLenField 设置为 1 个字节
您需要覆盖 FieldLenField
的默认长度,目前为 H
。 H
是来自 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,这在区间 [0, 255] 之外,我们将得到一个错误:
pkt.len = 300
bytes(pkt)
...<traceback>
error: ubyte format requires 0 <= number <= 255