在斯卡比和伦菲尔德一起工作

2024-09-29 03:24:45 发布

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

我正在用ScaPy编写一些协议,但是很难理解len字段是如何工作的。读了http://trac.secdev.org/scapy/wiki/LengthFields后,我的觉悟还是一样。在

显然,我们有他们所说的“lenfield”(包含字段的长度)和“varfield”(包含实际的可变长度字段)。但是,似乎只有PacketLenField、StrFixedLenField和StrLenField可以是varfield。剩下的田地呢?为什么你不能有一个可变长度的位域,或者XBitField?在

例如,我有:

BitFieldLenField('lenfield', None, 8, length_of='varfield')

这将正确地返回长度8(在本例中,我想要的字段是8个八位字节/4个十六进制对长)。到目前为止一切都很好。但是,当我尝试获取该字段时,似乎我唯一的选择是StrLenField,它返回类似“a\x81\x11\x11P 3”的内容

所以,我的问题是:如何将字段作为数据包中实际的十六进制数返回?我是在内置字段中遗漏了什么,还是必须创建类似XBitLenField的东西?在

谢谢你的帮助。在


Tags: orghttp协议lenwikitracscapysecdev
2条回答

您可以重写Fields对象,例如StrLenField:

# String to hex split by space
def str2hex(string):
    return ' '.join('%02x' % ord(b) for b in string)


class XStrLenField(scapy.fields.StrLenField):

    def i2repr(self, pkt, x):
        return str2hex(scapy.fields.StrLenField.i2m(self, pkt, x))

在您可以在field_desc[]中使用XStrLenField之后:

^{pr2}$

这个答案是关于Scapy 2.2.0的。在

LenFields通常成对工作,如下所示:

FieldLenField("len", None, length_of="data")
StrLenField("data", "", length_from=lambda pkt:pkt.len)

请注意length_oflength_from如何将这两个字段链接在一起。length_of值告诉Scapy在发送包时如何计算"len"字段(注意,默认值是None,表示应该自动计算)。当

有一个名为LenField的特殊字段,它可以自己使用。再次注意,默认值是None,这意味着它应该自动计算。当发送时,Scapy将简单地计算"len"作为当前层之后的字节数。在

^{pr2}$

既然已经引入了长度字段,就可以使用Python将StrLenField的输出编码为十六进制。在

# In layer definition
BitFieldLenField("lenfield", None, 8, length_of="varfield")
StrLenField("varfield", "", length_from=lambda pkt:pkt.lenfield)

# In main script
print(pck[mylayer].varfield.encode("hex"))    # Replace "mylayer" with the name of your new layer

相关问题 更多 >