【问题标题】:Set size of FieldLenField设置 FieldLenField 的大小
【发布时间】:2020-04-23 04:20:44
【问题描述】:

我想要一个 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)
    ]

感谢您的帮助。

【问题讨论】:

  • 为什么不在构建/读取此数据包时添加超过 255 个项目的检查?如果有意外数量的项目,您可能会引发错误。请记住,当 Wireshark 在意外位置看到字节(或将其标记为“格式错误的响应”)时,它也会引发错误。
  • @RossJacobs 这将有助于控制 varfield pld 的长度,但不能控制 lenfield len 的大小,所以它并不能真正解决我的问题。如果我最多有 255 个值,我不想要 2 个字节的 lenfield,因为只有 1 个字节就足够了。

标签: python scapy network-protocols


【解决方案1】:

将 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,超出区间 [0, 255],则会出现错误:

pkt.len = 300
bytes(pkt)

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

【讨论】:

  • 谢谢。是否可以有任何所需的长度,或者只是一个字节一个字节?
  • fmt var 必须是有效的结构格式字符
  • 如果这不能回答您的评论问题,您可能需要将其作为问题提出,以便提供更多详细信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 2013-08-06
  • 2018-06-27
  • 2011-02-11
相关资源
最近更新 更多