python - Scapy 多线程扫描缓慢
问题描述
我正在使用scapy编写一个多线程端口扫描器,我创建一个使用scapy嗅探器的进程,并使用多线程发送syn数据包,但我发现扫描器的最大速度是每秒100次,太慢了。所以我使用其他方式:
response = sr(IP(dst=targetIP)/TCP(dport=port, flags='S', timeout=1))
我发现 sr 比使用 send 和 sniff 慢
我的主要代码如下:
def prn(self,pkt):
ip = pkt.sprintf('%IP.src%')
port = pkt.sprintf('%IP.sport%')
info = '{0}:{1}'.format(ip,port)
fileipinfo = '{0}:{1}\n'.format(ip,port)
if (int(port) in self.portlist) and (info not in self.result):
self.result.add(info)
lock.acquire()
FileHelper.append(self.savepath,fileipinfo)
model = dict(ip=ip,port=int(port),flag=self.data_flag,createdatetime= datetime.datetime.now())
SqlHelper.add(model)
lock.release()
def listen(self,portlist):
self.portlist = portlist
sniff(filter="tcp[13:1] & 18==18", prn=self.prn) #iface=self.ifacestr
def send(self,param):
ip = param['ip']
port = param['port']
send(IP(dst=ip) / TCP(dport=port, flags='S'), verbose=False)
self.sendcount = self.sendcount + 1
sys.stdout.write('\r' + 'Scanned:{0},Remaining{1}'.format(self.sendcount, self.taskcount - self.sendcount))
sys.stdout.flush()
def run(self):
time_start = time.time()
scannerparam = self.scannerparam
if scannerparam.save:
RESULT_PATH = scannerparam.save
params = []
iplist = IpHelper.get_ip_list(scannerparam)
portlist = PortHelper.get_port_list(scannerparam)
p_listen = Process(target=self.listen,args=(portlist,))
p_listen.start()
for ip in iplist:
for port in portlist:
params.append({'ip':ip,'port':port})
self.taskcount = len(params)
with futures.ThreadPoolExecutor(max_workers=scannerparam.threadnum) as executor:
param_left = len(params)
param_iter = iter(params)
jobs = {}
while(param_left):
for param in param_iter:
job = executor.submit(self.send,param)
jobs[job] = param
if len(jobs) > scannerparam.threadnum:
break
for job in futures.as_completed(jobs):
param_left -= 1
#result = job.result()
del jobs[job]
break
time_end = time.time()
time.sleep(20)
p_listen.terminate()
if scannerparam.validator:
self.validate(scannerparam)
def validate(self,scannerparam):
if 'proxy' in scannerparam.validator:
proxy_validator = ProxyValidator(self.data_flag)
p_proxy = Process(target=proxy_validator.run)
p_proxy.start()
p_proxy.join()
解决方案
推荐阅读
- python - python:过滤具有特定值中匹配字符串的字典
- python - 如何在 Python 3D 图中订购 ax.scatter 和 ax.quiver?
- python - 从另一个数据帧更新熊猫数据帧
- vue.js - 通过 Vue 进行轮播(如何使用过渡?)
- kubernetes - 如何在 Kubernetes 中重用卷?
- c - 使用 realloc() 改变 malloc() 大小输出垃圾值(C语言)
- javascript - Keycloak javascript适配器调用受保护的rest api
- java - java.security.InvalidKeyException:从 .CRT 文件读取时密钥格式无效
- android - 取消来自应用程序的 Firebase 通知
- bitcoin - 比特币区块链上的“非标准”输出