gpt4 book ai didi

python - Scapy sniff() 在一个子类 threading.Thread() 的类中

转载 作者:行者123 更新时间:2023-12-01 05:08:23 25 4
gpt4 key购买 nike

我在使用 Scapy sniff() 函数时遇到了一个奇怪的问题。

这就是我的类(class)的样子:

    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'

看了这篇文章后,我添加了 sleep 功能:Scapy fails to sniff

但是,当我将嗅探调用移至 __init__() 时函数,它可以工作,但是由于 packet_sniffer 类无限地卡在 __init__() 中,因此无法调用后续线程。功能。

当谈到Python时,我是一个相当新的程序员(总体上不是一个新程序员,我有很多经验),所以我可能做了一些非常基本的错误。

TIA

詹姆斯。

最佳答案

似乎只需重新排列类,使 run 方法位于 __init__() 方法下方即可解决该问题。我还停止使用线程类并使用多进程类,它构建在 Thread 类之上,但允许更大的并发性。

最终的类(class)如下所示:

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

我不完全确定为什么方法的安排在这种情况下会产生影响。

关于python - Scapy sniff() 在一个子类 threading.Thread() 的类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24658775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com