2012-01-13 44 views
9

Dpkt kullanarak ethernet üzerindeki paketleri yakalayan bir python betikleri var, ancak hangi paketlerin tcp olduğunu ve hangisinin ne için olduğunu nasıl ayırt ederim? udp.python/dpkt: Paketin bir tcp paketi veya bir udp paketi olup olmadığını öğrenin.

Sonunda, zaman aralığı boyunca kurulan her bir tcp bağlantısı için paketlerin bir listesini almak istiyorum.

benim kodudur:

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

Yanıtı buldum, bu yüzden burada başkaları için de yayınlayabilirim. Aşağıdaki kod işi yapar: ip = eth.data if (ip .__ dict) .has_key ('tcp'): bu bir tcp paket olduğunu #then ... – ConfusedAboutCPP

cevap

6

IP başlık alanı protokolünü içermektedir. dpkt bu değeri almanıza izin vermeli ve bunu kullanarak IP üzerinde ne olduğunu tahmin edebilirsiniz. Geçerli protokol numarası http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml'un bir listesi. TCP 6.

Düzenleme iken UDP 17 eşittir: Bu sorunu kontrol ettikten ve ben de belirtildiği gibi dpkg IP protokol alanını erişmek için p özellikleri sağlar. Böylece onu kontrol edebilirsin. Ancak, paket otomatik olarak ayrıştırılır ve UDP veya TCP gibi üst protokolü temsil eden sınıf örneğine data özelliği ayarlanır. Böylece data özelliğinin türünü kontrol edebilir ve bu protokolü tanırsınız.

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

dpkt kullanarak ethernet adaptörü eth0 üzerine paketleri yakalar ve IP ait UDP TCP ila paketleri ayıran bir python komut dosyası.

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()