我正在用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的东西?在
谢谢你的帮助。在
您可以重写Fields对象,例如StrLenField:
在您可以在field_desc[]中使用XStrLenField之后:
^{pr2}$这个答案是关于Scapy 2.2.0的。在
LenField
s通常成对工作,如下所示:请注意
length_of
和length_from
如何将这两个字段链接在一起。length_of
值告诉Scapy在发送包时如何计算"len"
字段(注意,默认值是None
,表示应该自动计算)。当有一个名为
^{pr2}$LenField
的特殊字段,它可以自己使用。再次注意,默认值是None
,这意味着它应该自动计算。当发送时,Scapy将简单地计算"len"
作为当前层之后的字节数。在既然已经引入了长度字段,就可以使用Python将
StrLenField
的输出编码为十六进制。在相关问题 更多 >
编程相关推荐