2017-02-06 8 views
0

네트워크에서 패킷을 캡처하고 패킷 파일을 내 파이썬 코드로 파싱하려고했습니다. 코드는 다음 위의 내가 그것을 내 패킷 길이에 맞게 '압축'의 값을 변경하려면 어떻게해야"struct.error : unpack에 길이가 14 인 문자열 인수가 필요합니다."

error in the line : " l2data=unpack("!6s6sH", l2hdr) "

를 언급했다, 캡쳐 된 패킷 목록의 첫 번째 몇 패킷을 완벽하게 실행?

내 코드 :

#!usr/bin/python 

import pcapy 

from struct import* 

pcap_file=pcapy.open_offline("single.pcap") 

count=1 

while count: 
    print("Packet #:",count) 

    count=count+1 
    (header,payload)=pcap_file.next() 

    l2hdr=payload[:14] 
    l2data=unpack("!6s6sH",l2hdr) 

    srcmac="%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:" %(ord(l2hdr[0]),ord(l2hdr[1]),ord(l2hdr[2]),ord(l2hdr[3]),ord(l2hdr[4]),ord(l2hdr[5])) 
    dstmac="%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:" %(ord(l2hdr[6]),ord(l2hdr[7]),ord(l2hdr[8]),ord(l2hdr[9]),ord(l2hdr[10]),ord(l2hdr[11])) 

    print("source MAC:",srcmac,"Destination MAC:",dstmac) 

    ipheader=unpack('!BBHHHBBH4s4s',payload[14:34]) 
    timetolive=ipheader[5] 
    protocol=ipheader[6] 

    print("Protocol:",str(protocol)],"Time to live:",str(timetolive)) 
+1

데이터의 길이를 사용할 수 있습니다 (예 : 'unpack ("% ss"% len (l2hdr), l2hdr)와 같은 것 ' – yedpodtrzitko

+0

'Wireshark'를 사용하여 그 파일을 열 수 있고 패킷에 문제가있는 것을 볼 수 있습니까? – Fejs

+0

@yedpodtrzitko 몇 패킷 만 실행되었지만 "IndexError : String index out of range"... "srcmac ="%. 2x : %. 2x : %. 2x : %. 2x : (2hdr [1]), ord (l2hdr [2]), ord (12hdr [3]), ord (12hdr [4]), ord (l2hdr [5])) " –

답변

0
#!/usr/bin/python 

import pcapy 
from struct import * 

cap = pcapy.open_live("en0", 65536, 1, 0) 

while 1: 
    (header,payload) = cap.next() 
    l2hdr = payload[:14] 
    l2data = unpack("!6s6sH", l2hdr) 
    srcmac = "{0:02x}:{1:02x}:{2:02x}:{3:02x}:{4:02x}:{5:02x}".format(l2hdr[0],l2hdr[1],l2hdr[2],l2hdr[3],l2hdr[4],l2hdr[5]) 
    dstmac = "{0:02x}:{1:02x}:{2:02x}:{3:02x}:{4:02x}:{5:02x}".format(l2hdr[6], l2hdr[7], l2hdr[8], l2hdr[9], l2hdr[10],l2hdr[11]) 
    print("Source MAC: ", srcmac, " Destination MAC: ", dstmac) 

    ipheader = unpack('!BBHHHBBH4s4s' , payload[14:34]) 
    timetolive = ipheader[5] 
    protocol = ipheader[6] 
    print("Protocol ", str(protocol), " Time To Live: ", str(timetolive)) 

나는 당신의 문제는 파일과 관련이 있음을 확신합니다. 그러나 언팩 기능에 대해 더 자세히 이해하려면 https://docs.micropython.org/en/latest/pyboard/library/struct.html을 제공하는 것이 좋습니다.