2014-10-17 2 views
0

Scapy에서 새 레이어/프로토콜을 빌드하려고합니다. 내가/show2 그것을 보내려고 할 때 나는이 오류를 참조하십시오.Scapy : 새 프로토콜/레이어를 추가 할 때 TypeError가 발생했습니다.

나는 무슨 일이 일어나고 있는지보기 위해 중단 점을 넣었지만 어떻게 든 내부적으로 str은 터플로 변환되고있다. 나는 내가 무엇을 놓치고 있는지 확신하지 못한다. 누군가 문제를 해결할 수 있습니까?

>>> 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 

답변

1

나는 실수로이 문제를 일으킨 입력란을 삭제 한 것 같습니다. 나는 BitField를 사용했고 3 비트를 추가했지만 5 비트가 더 많은 BitField가 포함 된 라인을 삭제했습니다. 패킷이 Byte 정렬 된 scapy이므로 불평했습니다. 그 것을 배우는 것이 좋았습니다 :)

관련 문제