2016-06-04 18 views
1

Ich möchte einen Paket-Sniffer in Python 3.5, die UDP, TCP und ICMP erfasst. Dies ist ein kurzes Beispiel dafür:Paket-Sniffer in Python

import socket 
import struct 

# the public network interface 
HOST = socket.gethostbyname(socket.gethostname()) 
# create a raw socket and bind it to the public interface 
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 

s.bind((HOST,0)) 

# Include IP headers 
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) 

# receive all packages 
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) 

# receive a package 
n=1 
while(n<=400): 
    print('Number ', n) 
    data=s.recvfrom(65565) 
    packet=data[0] 
    address= data[1] 
    header=struct.unpack('!BBHHHBBHBBBBBBBB', packet[:20]) 
    if(header[6]==6): #header[6] is the field of the Protocol 
     print("Protocol = TCP") 
    elif(header[6]==17): 
     print("Protocol = UDP") 
    elif(header[5]==1): 
     print("Protocol = ICMP") 
    n=n+1 

Das Problem ist, dass es erfasst nur UDP-Pakete :( Ausgang:

Number 1 Protocol = UDP Number 2 Protocol = UDP Number 3 Protocol = UDP Number 4 Protocol = UDP Number 5 Protocol = UDP Number 6 Protocol = UDP Number 7 

Es sind 2 Optionen sind:

  • Der Sniffer erfassen nur UDP-Pakete
  • Ich empfange nur UDP-Pakete

Ich denke, dass die logischste Antwort ist mein Sniffer funktioniert nicht richtig und es ist nur UDP erfassen. Irgendeine Idee?

+1

ich wette scapy für diesen Job ist besser als das Buchsenmodul. Es ist viel bequemer, Pakete zu schnüffeln. –

+0

Welche Plattform benutzen Sie? Unter Unix/Linux müssen Sie normalerweise root sein, um jedes Paket zu erfassen. –

+0

@HughFisher Ich bin auf Windows 7, mit PyDev und Eclipse. Ich führe Eclipse als Administrator aus. –

Antwort

1

Ich bin selbst in der Phase der Erstellung eines Python-Paket Parser/Sniffer und in meiner Forschung fand ich, dass alle eingehenden Pakete wie TCP, ICMP, UDP, ARP .. usw. zu parsen, müssen Sie nicht verwenden Sie die unten Buchse weil socket.IPPROTO_IP nur IP-Pakete gibt und ist ein Dummy-Protokoll

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 

eher Sie diese verwenden müssen, und funktioniert am besten mit Linux-Systemen

s = socket.socket(socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003)) 
+0

@E. Williams könnte ein wenig banal eine Korrektur sein, aber ich denke, Sie sollten PF_PACKET (Protokollfamilie) anstelle von AF_PACKET (Adressfamilie) verwenden, weil Sie versuchen, den Socket zu steuern, nicht den Adresstyp. Dies könnte auch Probleme beim Erstellen von Paketen für alternative Betriebssysteme reduzieren. Nur ein Vorschlag. – NationWidePants