2012-01-13 30 views
9

Mam skrypty Pythona, które przechwytują pakiety w sieci Ethernet za pomocą dpkt, ale jak odróżnić, które pakiety są tcp i które są dla udp.python/dpkt: Sprawdź, czy pakiet jest pakietem tcp lub pakietem udp,

Ostatecznie chciałbym mieć listę pakietów dla każdego połączenia TCP ustanowionego w przedziale czasowym.

mojego kodu jest:

import dpkt 
import pcapy 
cap=pcap.open_live('eth0',100000,1,0) 
(header,payload)=cap.next() 
while header: 
    eth=dpkt.ethernet.Ethernet(str(payload)) 
    ip=eth.data 
    tcp=ip.data 
    # i need to know whether it is a tcp or a udp packet here!!! 
    (header,payload)=cap.next() 
+0

Znalazłem odpowiedź, więc równie dobrze mogę opublikować ją tutaj dla innych. Poniższy kod spełnia swoje zadanie: ip = eth.data if (Ip .__ dict) .has_key ('tcp'): #then to pakiet tcp ... – ConfusedAboutCPP

Odpowiedz

6

nagłówek IP zawiera protokół pola. dpkt powinien pozwolić ci uzyskać tę wartość i używając jej możesz odgadnąć, co jest na górze IP. Oto lista poprawnych numerów protokołów http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml. UDP jest równa 17 natomiast TCP 6.

Edit: Sprawdziłem ten problem i jak wspomniałem dpkg zapewnić p właściwości dostępu do pola protokołu IP. Więc możesz sprawdzić, czy nie. Ale automatycznie analizuje również pakiet i ustawia właściwość data na instancję klasy reprezentującą wyższy protokół, taki jak UDP lub TCP. Możesz więc sprawdzić typ właściwości data i rozpoznajesz ten protokół.

from dpkt.ip import IP, IP_PROTO_UDP 
from dpkt.udp import UDP 
ip = IP('E\x00\x00"\x00\x00\x00\[email protected]\x11r\xc0\x01\x02\x03\x04\x01\x02\x03\x04\x00o\x00\xde\x00\x0e\xbf5foobar') 
#if ip.p == IP_PROTO_UDP: # checking for protocol field in ip header 
if type(ip.data) == UDP : # checking of type of data that was recognized by dpkg 
    udp = ip.data 
    print udp.sport 
else: 
    print "Not UDP" 
6

skrypt Pythona, który przechwytuje pakiety na Ethernet Adapter eth0 wykorzystaniem dpkt i różnicuje między TCP i pakiety UDP z OD.

import dpkt 
import pcapy 

cap=pcapy.open_live('eth0',100000,1,0) 
(header,payload)=cap.next() 

while header: 
    eth=dpkt.ethernet.Ethernet(str(payload)) 

    # Check whether IP packets: to consider only IP packets 
    if eth.type!=dpkt.ethernet.ETH_TYPE_IP: 
      continue 
      # Skip if it is not an IP packet 
    ip=eth.data 
    if ip.p==dpkt.ip.IP_PROTO_TCP: # Check for TCP packets 
      TCP=ip.data 
      # ADD TCP packets Analysis code here 
    elif ip.p==dpkt.ip.IP_PROTO_UDP: # Check for UDP packets 
      UDP=ip.data 
      # UDP packets Analysis code here 

    (header,payload)=cap.next()