2017-09-28 8 views
1

나는 pcap 파일에서 패킷을 필터링하고 더 처리해야합니다. 파일이 매우 크기 때문에 전체 내용을 한 번에 읽을 수 없습니다. Scapy는 매우 정교한 것으로 보인다 나는 불행하게도 나는 필터 (예 : BPF)를 PcapReader 그렇게 만 일치하는 패킷이 반복되지 않습니다 둘을 적용 할 수있는 방법을 찾을 수 없습니다python scapy filter pcap 파일

with PcapReader(pcap) as pcap_reader: 
    for pkt in pcap_reader: 
     ... 

로 패킷을 반복 할 수 있었다 pkt (scapy.packet !?)이어야합니다.

나는 필터를 인수로 취하는 tshark 디코더 인 함수 tdecode이 있다는 것을 알았지 만 결과 패킷을 변수에 저장하는 대신 터미널에 모든 결과를 넘겨주는 방법이 없습니다.

.pcap 파일의 패킷을 scapy으로 필터링하고 결과를 반복하는 방법이 있습니까?

+0

을 당신이 할 수없는 첫 번째 필터는 tshark (꽤 빠름)로 필터링 한 다음 scapy로 새로운 pcap을 추가로 처리한다. 후 처리가 비싸다면 libpcap을 직접 사용하는 것이 더 나을 것이다. – pchaigno

답변

2

Scapy는 믿을 수 없을 정도로 느려서 대화 형 사용이 유일한 용도입니다. 또한 전체 (파이썬에서) 해부 전에 패킷을 필터링 할 수 없으므로 문제가 악화됩니다.

libpcapPcapReader 대신에 작은 C 확장을 직접 쓰거나 binding을 사용하여 사용할 수 있습니다. libpcapBPF-syntax에 필터를 지정할 수 있습니다.이 필터는 라이브러리 내의 수신 패킷에 적용되거나 - 장치에서 실시간 캡처 할 때 커널 자체에서 적용됩니다. 그러면 성능이 크게 향상됩니다.

  • open_offline()는 PCAP 파일
  • 가 scapy 들어오는 패킷 데이터를 전달하는 libpcap의 제공 핸들로부터 판독 BPF 필터 설정 님

    기본 레이아웃 될 추가 검사를 위해

당신은 그걸로 quite sophisticated을 얻을 수 있습니다.

0

tcpdump() 함수를 사용하여 BPF 필터를 적용 할 수 있습니다. 그런 당신을 위해 몇 가지 관심 있다면 PcapReader()filter 매개 변수를 받아들 (그리고 offline= 매개 변수를 사용하여 더 많거나 적은 sniff()처럼 동작하도록

with PcapReader(tcpdump("myfile.cap", args=["-w", "-", "my BPF filter"], 
         getfd=True)) as pcap_reader: 
    for pkt in pcap_reader: 
     print pkt.summary() 

, 어쩌면 당신은, 기능 요청을 제출할 수 있습니다.