2014-07-09 2 views
1

Scapy sniff() 함수에 이상한 문제가 있습니다.스레딩을 하위 클래스로 만드는 스니핑 스 니프()

편집 : 그것을하지 않습니다 내가 말할 때이 코드는 내 스레드 관리자 클래스에서 호출 할 때 작동하지 않습니다

from scapy.all import * 
import sys 
import datetime 
import Queue 
from threading import Thread 

class packet_sniffer(Thread): 
    def __init__(self,pass_queue): 
    super(packet_sniffer,self).__init__() 
    print 'Packet sniffer started' 
    self.queue=pass_queue 
    self.device_dict={} 
    self.not_an_ap={} 


    def PacketHandler(self,pkt): 
    if pkt.haslayer(Dot11): 
     sig_str = -(256-ord(pkt.notdecoded[-4:-3])) 
     mac_addr="" 
     ssid="" 
     try: 
     mac_addr=pkt.addr2 
     ssid=pkt.info 
     except: 
     return 
     if self.device_dict.has_key(pkt.addr2) and pkt.info!=self.device_dict[pkt.addr2]: 
     output= "DIS MAC:%s RSSI:%s " %(pkt.addr2,sig_str) 
     print output 
     self.device_dict.pop(pkt.addr2) 
     self.not_an_ap[pkt.addr2]=pkt.info 
     self.queue.put(output) 
     elif pkt.info=="" or pkt.info=="Broadcast": 
     output= "DIS MAC:%s RSSI:%s " %(pkt.addr2,sig_str) 
     print output 
     self.queue.put(output) 
     else: 
     pot_mac=self.not_an_ap.get(pkt.addr2) 
     if pot_mac == None: 
      self.device_dict[pkt.addr2]=pkt.info 

    def run(self): 
     sniff(iface="mon.wlan0",prn=self.PacketHandler) 

:

이는 내 수업이 찾고 어떻게 작동, 나는 스 니프가 작동하지 않거나 PacketHandler를 호출하지 않는다는 것을 의미합니다. 오류 메시지가 출력되지 않으며, 프로그램의 나머지 부분은 내가이 게시물보고 후 절전 기능을 포함

currentQueue=Queue() 

#object setup 
print'Initialising sniffer' 
packet_sniffer_instance=packet_sniffer(currentQueue) 
packet_sniffer_instance.daemon=True 
packet_sniffer_instance.start() 
time.sleep(1) 

print'Finished initialising sniffer' 

정상적으로 계속 : 그러나 Scapy fails to sniff

, 나는 __init__() 기능에 내 냄새 통화를 이동할 때 작동하지만, __init__() 함수에 무한정 붙어있는 packet_sniffer 클래스로 인해 이후의 스레드를 호출 할 수 없습니다.

파이썬 (전반적으로 새로운 프로그래머는 아니지만 많은 경험이 있음)은 상당히 새로운 프로그래머입니다. 따라서 나는 정말 잘못된 것을하고있을 것입니다.

TIA

제임스.

+0

"작동하지 않음"이란 무엇을 의미합니까? – dano

+0

@dano 내가 명확히하겠습니다. 내가 작동하지 않는다고 말하면, 스 니프가 작동하지 않거나 PacketHandler를 호출하지 않는다는 뜻입니다. 오류 메시지가 출력되지 않으며 나머지 프로그램은 정상적으로 계속됩니다. – James

+1

'run'이 호출되고 있는지 확인할 수 있습니까? (단지 거기에'print' 문을 던지십시오). 'PacketHandler'의 맨 위에 인쇄하십시오. 흐름을 추적하기 위해'print'를 사용하여 어떤 일이 막히거나 실패하는지 파악할 수 있어야합니다. – dano

답변

2

간단하게 run 메서드가 __init__() 메서드 아래에 오도록 클래스를 재정렬하면 문제가 해결 된 것처럼 보입니다. 또한 스레드 클래스 사용을 중단하고 스레드 클래스에서 빌드하지만 더 큰 동시성을 허용하는 다중 프로세스 클래스를 사용했습니다.

마지막 클래스는 다음과 같습니다

from scapy.all import * 
import sys 
import datetime 
import Queue 
from multiprocessing import Process 

class packet_sniffer(Process): 
    def __init__(self,pass_queue): 
    super(packet_sniffer,self).__init__() 
    print 'Packet sniffer started' 
    #self.target=self.monitor() 
    self.queue=pass_queue 
    self.device_dict={} 
    self.not_an_ap={} 
    print 'END' 

    def run(self): 
    sniff(iface="en1",prn=self.PacketHandler) 

    def PacketHandler(self,pkt): 
    if(pkt.haslayer(ARP)): 
     print pkt.src 
    if pkt.haslayer(Dot11): 
     sig_str = -(256-ord(pkt.notdecoded[-4:-3])) 
     mac_addr="" 
     ssid="" 
     try: 
     mac_addr=pkt.addr2 
     ssid=pkt.info 
     except: 
     return 
     if self.device_dict.has_key(pkt.addr2) and pkt.info!=self.device_dict[pkt.addr2]: 
     output= "DIS MAC:%s RSSI:%s " %(pkt.addr2,sig_str) 
     print output 
     self.device_dict.pop(pkt.addr2) 
     self.not_an_ap[pkt.addr2]=pkt.info 
     self.queue.put(output) 
     elif pkt.info=="" or pkt.info=="Broadcast": 
     output= "DIS MAC:%s RSSI:%s " %(pkt.addr2,sig_str) 
     print output 
     self.queue.put(output) 
     else: 
     pot_mac=self.not_an_ap.get(pkt.addr2) 
     if pot_mac == None: 
      self.device_dict[pkt.addr2]=pkt.info 

나는 방법의 배열이 인스턴스의 차이를 만드는 이유를 완전히 확실하지 않다.

관련 문제