[英]Scapy: TypeError when adding new protocol/ layer
我正在嘗試在Scapy中構建新的層/協議。 我嘗試發送/顯示2時看到此錯誤。
我已經設置了斷點以查看發生了什么,但是在某種程度上內部將str轉換為Tuple。 我不確定我缺少什么。 有人可以幫我確定這個問題嗎?
>>> p1=PCEPOPEN()
>>> p1.show2()
> /usr/local/lib64/python2.6/site-packages/scapy/fields.py(71)addfield()
-> return s+struct.pack(self.fmt, self.i2m(pkt,val))
(Pdb) val
1
(Pdb) p s
''
(Pdb) c
> /usr/local/lib64/python2.6/site-packages/scapy/fields.py(71)addfield()
-> return s+struct.pack(self.fmt, self.i2m(pkt,val))
(Pdb) p s
'\x01\x10'
(Pdb) val
4
(Pdb) p s
'\x01\x10'
(Pdb) c
> /usr/local/lib64/python2.6/site-packages/scapy/fields.py(71)addfield()
-> return s+struct.pack(self.fmt, self.i2m(pkt,val))
(Pdb) val
10
(Pdb) p s
('\x01\x10\x00\x04', 3, 1L)
(Pdb) c
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 831, in show2
self.__class__(str(self)).show()
File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 262, in __str__
return self.build()
File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 321, in build
p = self.do_build()
File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 309, in do_build
pkt = self.self_build()
File "/usr/local/lib64/python2.6/site-packages/scapy/packet.py", line 300, in self_build
p = f.addfield(self, p, val)
File "/usr/local/lib64/python2.6/site-packages/scapy/fields.py", line 71, in addfield
return s+struct.pack(self.fmt, self.i2m(pkt,val))
TypeError: can only concatenate tuple (not "str") to tuple
>>> p1.show()
###[ OPEN Object for Open message ]###
oclass= OPEN
oType= 1
resflags=
pflag=
iflag=
obLength= 4
ver= 1
kalive= 10
dead= 40
sid= 1
>>>
class PCEPOPEN(Packet):
"""OPEN message to establish a PCEP session"""
name="OPEN Object for Open message"
fields_desc = [ByteEnumField("oclass",1,_object_class),
BitField("oType",1,4),
BitField("resflags", 0, 2),
FlagsField("pflag", 0x0, 1, "P"),
FlagsField("iflag", 0x0, 1, "I"),
ShortField("obLength", 4),
BitField("ver",1,3),
ByteField("kalive",10),
ByteField("dead",40),
ByteField("sid",1)]
def post_build(self, pkt, pay):
if self.obLength is 4:
olen = len(pkt) + len(pay)
pkt = pkt[:2]+struct.pack("!h", olen)
return pkt+pay
好像我不小心刪除了導致問題的字段。 我使用了BitField並添加了3位,但是我刪除了包含BitField並增加5位的行。 由於數據包是字節對齊的,因此,scapy抱怨。 很高興得知:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.