2012-02-23 49 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