2017-09-28 9 views
1

Ich muss Pakete aus einem pcap Dateien filtern und weiter verarbeiten. Die Dateien sind sehr groß, daher ist es nicht möglich, das ganze Ding gleichzeitig in den Speicher zu schreiben. Scapy scheint sehr anspruchsvoll zu sein, und ich konnte mitPython Scapy Filter pcap Datei

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

Leider war ich nicht in der Lage, einen Weg zu finden, einen Filter (zB BPF) weder die PcapReader so nur passenden Pakete wiederholt werden anzuwenden noch die pkt (die sollte scapy.packet sein!?).

Ich habe gesehen, dass es eine Funktion tdecode gibt, die ein Tshark-Decoder ist, der einen Filter als Argumente nimmt, aber es gibt keine Möglichkeit, die resultierenden Pakete in eine Variable zu speichern, sondern nur das Terminal mit allen Ergebnissen zu überfluten.

Gibt es eine Möglichkeit, Pakete aus einer .pcap-Datei mit scapy zu filtern und immer noch über die Ergebnisse zu iterieren?

+0

Kannst du nicht erster Filter mit tshark (was ziemlich schnell ist) und dann die neue pcap weiter mit scapy verarbeiten? Wenn deine Nachbearbeitung teuer ist, ist es wahrscheinlich besser, libpcap direkt zu benutzen. – pchaigno

Antwort

2

Scapy ist unglaublich langsam, bis zu dem Punkt, wo interaktive Nutzung die einzige Verwendung ist. Es erlaubt auch nicht das Filtern von Paketen vor vollständiger Dissektion (in Python), was das Problem verschlimmert.

Sie können libpcap verwenden, indem Sie entweder eine kleine C-Erweiterung selbst schreiben oder binding als Ersatz für PcapReader verwenden. libpcap können Sie einen Filter in BPF-syntax, die auf die eingehenden Pakete innerhalb der Bibliothek oder - beim Capture Live von einem Gerät - durch den Kernel selbst angewendet wird. Dies wird Ihre Leistung erheblich verbessern.

wäre die grundlegende Layout sein:

  • open_offline() a pcap-Datei
  • den BPF-Filter
  • vom Libpcap gelieferten Griff lesen eingestellt
  • die ankommenden Paketdaten an scapy passieren für weitere inspektion

Sie können quite sophisticated damit bekommen.

0

Sie können die Funktion tcpdump() verwenden, um einen BPF-Filter anzuwenden.

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

Wenn das für Sie von Interesse ist, vielleicht könnten Sie eine Feature-Anfrage einreichen, so dass PcapReader() einen nimmt filter Parameter (und verhält sich mehr oder weniger wie sniff() mit einem offline= Parameter.