2012-02-23 282 views
0

我正在ScaPy中编写一些协议,但我很难理解len字段如何工作。在阅读http://trac.secdev.org/scapy/wiki/LengthFields后,我不会轻视。显然,我们有他们所说的'lenfield'(保存字段的长度)和'varfield'(包含实际的可变长度字段)。但是,似乎可以是varfield的唯一字段是PacketLenField,StrFixedLenField和StrLenField。剩下的领域在哪里?为什么你不能有一个可变长度的BitField或XBitField?在ScaPy中使用LenFields

例如我已经得到:

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

这正确返回8的长度(我想在这种情况下,该字段为长8个八位字节/ 4个十六进制对)。迄今为止都很好。然而,当我尝试并获得那场,好像我唯一的选择是返回像“A \ X81 \ X11 \ x11P 3”的东西

所以一个StrLenField,我的问题是:如何获得那场回作为数据包中的实际十六进制?我是否在内置字段中丢失了某些内容,或者是否必须创建类似XBitLenField的内容?

感谢您的帮助。

回答

0

可以改写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:

XStrLenField("rand", "", length_from=lambda x: x.len) 
1

这个答案是关于Scapy 2.2.0的。

LenFields通常两人一组如下所示:

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

注意如何length_of和length_from链接这两个字段一起。 length_of告诉Scapy当发送数据包时,如何计算“len”字段(注意缺省值为None,表示它应该自动计算)。 length_from的值告诉Scapy在解析数据包时要输入到“data”字段中的字节数为

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

LenField("len", None) 

现在,长度字段已经出台,你可以使用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