2012-02-17 4 views
2

패킷 캡처에서 데이터를 간단하게 구문 분석하려고합니다. 나는 컴파일 할 수 있는지, 오류로 끝나는지를보기 위해 예제를 취했다. 아래는 코드입니다.파이썬 2.6에서 PCAP 구문 분석

import dpkt 
import sys 

f = open('test.pcap') 
pcap = dpkt.pcap.Reader(f) 

for ts, buf in pcap: 
    eth = dpkt.ethernet.Ethernet(buf) 
    ip = eth.data 
    tcp = ip.data 


f.close() 

내가 오류는 다음과 같습니다 : TCP에 파일 "inspection.py", 라인 (15) = ip.data

AttributeError : 'STR'개체가없는 속성 '데이터'

도움이 될 것입니다.

+0

'eth.data'는 문자열입니다. 문자열에'data' 속성이 없습니다. 'print'ing'ip'를 시도하면 – tMC

+1

'scapy'가'dpkt'보다 더 좋은 옵션입니다. –

답변

3

이더넷 클래스가 buf을 풀 수 없으므로 dpkt.ethernet.Ethernet(buf)을 호출하면 문자열이 반환됩니다. 이것의 가능한 원인은 pcap 파일이 이더넷을 레이어 2 프로토콜로 가지지 않는다는 것입니다. 이것을 확인하기 위해 pcap을 Wireshark에로드 할 수 있습니다. 나는이 문제를 해결하기 위해 무슨 짓을

import dpkt 
import sys 

f = open('test.pcap') 
pcap = dpkt.pcap.Reader(f) 

for ts, buf in pcap: 
    if pcap.datalink() == dpkt.pcap.DLT_LINUX_SLL: 
     l2 = dpkt.sll.SLL(raw_pkt) 
    else: 
     l2 = dpkt.ethernet.Ethernet(buf) 
    ip = l2.data 
    tcp = ip.data 
+0

'pcp.datalink()'가'dpkt.pcap.DLT_EN10MB'를 돌려주는 경우에만'dpkt.ethernet.Ethernet'을 호출해야합니다. 가능한 링크 레이어 헤더 유형 [a * lot *] (http://www.tcpdump.org/linktypes.html)이 있으며 지원하는 모든 유형을 확인하고 그 유형이 다음 중 하나가 아닌 경우 실패해야합니다. 그. –

0

했다 :

 if ip.p == 6: 
      tcp = dpkt.tcp.TCP(ip.data) 

다음 스크립트는 프레임을 디코딩하는 PCAP 파일의 데이터 링크 필드를 확인하고 적절한 레이어 2 dpkt 클래스를 사용하려고 시도합니다

+0

스택 오버플로에 오신 것을 환영합니다! 여러 질문에 동일한 답변을 게시하지 마십시오. 하나의 좋은 답변을 게시 한 다음/vote를 사용하여 다른 질문을 중복으로 종료하십시오. 질문이 중복이 아닌 경우 * 질문에 대한 답변을 작성하십시오. * 중복 대답이 표시됩니다 (여기) (// stackoverflow.com/a/39583474/2747593). –

관련 문제