2015-04-27 6 views
3

Я программирую на python, и у меня есть проблема, действительно, когда я бросаю свой скрипт, он заканчивается через несколько секунд после обнаружения пакета IP6. По-видимому, мне приходится фильтровать пакеты и принимать только пакет IP4, чтобы избежать этой проблемы, и я хотел бы знать, как я могу использовать его с библиотекой dpkt, если это возможно, когда я начал. я пытался что-то, но я новичок, и это не работает, как вы можете видеть в этой строке:Исключение IP6 не имеет атрибута

#Select Ipv4 packets because of problem with the .p in Ipv6 
      if ip.p == dpkt.ip6: 
       return` 

ошибка встречается сказать: «AttributeError: объект„ip6“не имеет атрибута„р“» , Это отслеживающий: traceback

Это мой код, если вы хотите взглянуть :) Спасибо за ваше время :)

import pcapy 
import dpkt 
from threading import Thread 
import re 
import binascii 

liste=[] 
listip=[] 
piece_request_handshake = re.compile('13426974546f7272656e742070726f746f636f6c(?P<reserved>\w{8})(?P<info_hash>\w{20})(?P<peer_id>\w{20})') 
piece_request_tcpclose = re.compile('(?P<start>\w{12})5011') 


class PieceRequestSniffer(Thread): 
    def __init__(self, dev='eth0'): 
     Thread.__init__(self) 

     self.expr = 'udp or tcp' 

     self.maxlen = 65535 # max size of packet to capture 
     self.promiscuous = 1 # promiscuous mode? 
     self.read_timeout = 100 # in milliseconds 
     self.max_pkts = -1 # number of packets to capture; -1 => no limit 

     self.active = True 
     self.p = pcapy.open_live(dev, self.maxlen, self.promiscuous, self.read_timeout) 
     self.p.setfilter(self.expr) 

    @staticmethod 
    def cb(hdr, data): 

     eth = dpkt.ethernet.Ethernet(str(data)) 
     ip = eth.data 

     #Select only TCP protocols 
     if ip.p == dpkt.ip.IP_PROTO_TCP: 
      tcp = ip.data 

      #Select Ipv4 packets because of problem with the .p in Ipv6 
      if ip.p == dpkt.ip6: 
       return 
      else: 
       try: 
        #Return hexadecimal representation 
        hex_data = binascii.hexlify(tcp.data) 
       except: 
        return     

       handshake = piece_request_handshake.findall(hex_data) 
       if handshake: 
        print "-----------handsheck filtered-------------" 
        liste.append(handshake) 
        print "\n" 
        #for element in zip(liste,"123456789abcdefghijklmnopqrstuvwxyz"): 
        # print(element) 



    def stop(self): 
     self.active = False 

    def run(self): 
     while self.active: 
      self.p.dispatch(0, PieceRequestSniffer.cb) 


sniffer = PieceRequestSniffer() 
sniffer.start() 
+0

Также пл легкость после полной трассировки вызова – cmidi

+0

Хотел, но я не смог до 10 очков репутации, что довольно глупо ... – Bouh10

+0

Кажется странным. В случае IP6 Вы пытались использовать поле IP6.nxt вместо поля IP6.p только для теста, если это работает. Вы можете проверить версию ip из заголовка ethernet, чтобы сделать коммутатор – cmidi

ответ

2

Наконец я нашел хороший способ сделать это, линия нет:

if ip.p == dpkt.ip6: 
       return 

Но:

if eth.type == dpkt.ethernet.ETH_TYPE_IP6: 
        return 

 Смежные вопросы

  • Нет связанных вопросов^_^