实例探究Python以并发方式编写高性能端口扫描器的方法
来源:http://www.jb51.net/article/86615.htm
关于端口扫描器
端口扫描工具(Port Scanner)指用于探测服务器或主机开放端口情况的工具。常被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务。
端口扫描定义是客户端向一定范围的服务器端口发送对应请求,以此确认可使用的端口。虽然其本身并不是恶意的网络活动,但也是网络攻击者探测目标主机服务,以利用该服务的已知漏洞的重要手段。端口扫描的主要用途仍然只是确认远程机器某个服务的可用性。
扫描多个主机以获取特定的某个端口被称为端口清扫(Portsweep),以此获取特定的服务。例如,基于SQL服务的计算机蠕虫就会清扫大量主机的同一端口以在 1433 端口上建立TCP连接。
Python实现
端口扫描器原理很简单,无非就是操作socket,能connect就认定这个端口开放着。
import socket
def scan(port): s = socket.socket() if s.connect_ex(('localhost', port)) == 0: print port, 'open's.close()
if __name__ == '__main__': map(scan,range(1,65536))
这样一个最简单的端口扫描器出来了。
等等喂,半天都没反应,那是因为socket是阻塞的,每次连接要等很久才超时。
我们自己给它加上的超时。
s.settimeout(0.1)
再跑一遍,感觉快多了。
多线程版本
import socket
import threading
def scan(port): s = socket.socket() s.settimeout(0.1) if s.connect_ex(('localhost', port)) == 0: print port, 'open's.close() if __name__ == '__main__': threads = [threading.Thread(target=scan, args=(i,)) for i in xrange(1,65536)] map(lambda x:x.start(),threads)
运行一下,哇,好快,快到抛出错误了。thread.error: can't start new thread。
想一下,这个进程开启了65535个线程,有两种可能,一种是超过最大线程数了,一种是超过最大socket句柄数了。在linux可以通过ulimit来修改。
如果不修改最大限制,怎么用多线程不报错呢?
加个queue,变成生产者-消费者模式,开固定线程。
多线程+队列版本
import socket
import threading
from Queue import Queue
def scan(port): s = socket.socket() s.settimeout(0.1) if s.connect_ex(('localhost', port)) == 0: print port, 'open's.close() def worker(): while not q.empty(): port = q.get() try: scan(port) finally: q.task_done() if __name__ == '__main__': q = Queue() map(q.put,xrange(1,65535)) threads = [threading.Thread(target=worker) for i in xrange(500)] map(lambda x:x.start(),threads) q.join()
这里开500个线程,不停的从队列取任务来做。
multiprocessing+队列版本
总不能开65535个进程吧?还是用生产者消费者模式
import multiprocessing
def scan(port): s = socket.socket() s.settimeout(0.1) if s.connect_ex(('localhost', port)) == 0: print port, 'open's.close() def worker(q): while not q.empty(): port = q.get() try: scan(port) finally: q.task_done() if __name__ == '__main__': q = multiprocessing.JoinableQueue() map(q.put,xrange(1,65535)) jobs = [multiprocessing.Process(target=worker, args=(q,)) for i in xrange(100)] map(lambda x:x.start(),jobs)
注意这里把队列作为一个参数传入到worker中去,因为是process safe的queue,不然会报错。
还有用的是JoinableQueue(),顾名思义就是可以join()的。
gevent的spawn版本
from gevent import monkey; monkey.patch_all();
import gevent
import socket
...
if __name__ == '__main__': threads = [gevent.spawn(scan, i) for i in xrange(1,65536)] gevent.joinall(threads)
注意monkey patch必须在被patch的东西之前import,不然会Exception KeyError.比如不能先import threading,再monkey patch.
gevent的Pool版本
from gevent import monkey; monkey.patch_all();
import socket
from gevent.pool import Pool
...
if __name__ == '__main__': pool = Pool(500) pool.map(scan,xrange(1,65536)) pool.join()
concurrent.futures版本
import socket
from Queue import Queue
from concurrent.futures import ThreadPoolExecutor
...
if __name__ == '__main__': q = Queue() map(q.put,xrange(1,65536)) with ThreadPoolExecutor(max_workers=500) as executor: for i in range(500): executor.submit(worker,q)
实例探究Python以并发方式编写高性能端口扫描器的方法相关推荐
- python编写一个端口扫描器
可以使用 Python 来编写一个端口扫描器.下面是一个简单的端口扫描器的代码示例: import socketdef port_scanner(host, port):try:sock = sock ...
- python代码扫描工具_用Python编写一个高效的端口扫描器的方法
PyPortScanner python多线程端口扫描器. 输出示例: Github 背景 有时候,在进行网络相关的研究的时候,我们需要执行一些有目的的参数测量.而端口扫描就是其中比较普遍也比较重要的 ...
- 【Python黑帽子】——搭建TCP端口扫描器
作者名:Demo不是emo 主页面链接:主页传送门 创作初心:一切为了她 座右铭:不要让时代的悲哀成为你的悲哀 专研方向:网络安全,数据结构 每日emo:唯有信仰与日月亘古不变 经过一段时间pyth ...
- python编程计算器_Python3-用Python编写计算器的3种方法
用python实现简单的计算器功能,有很多思路,这里介绍三种方法,并分析各自的优缺点.下图是一个真是的计算器,由StellrWeb摄于Unsplash: 众所周知,根据Tao of Python的规定 ...
- Python以特定方式对字符串进行分割的方法
在Python语言中,对于一个给定的字符串,要求处理后得到的一个新字符串满足以下两个条件: l 字符串中包含的字母全部转换为大写字母 l 每2个字符之间以空格进行分割 在Python语言中应怎样代码实 ...
- java编写一个端口扫描器
好久没写java了,学的时候,也没学习网络编程这一块,无意中看到了一本书,于是小小复习一下java,写个端口扫描器,玩玩吧,网上这种小公具有的是,就是自己无聊写着玩玩. 源代码如下: 共两个类,比较简 ...
- python 编写端口扫描器
编写一个端口扫描器(TCP全连接扫描) 借鉴于:<python绝技:运用python成为顶级黑客> 需要用到的模块: socket optparse(感觉这个不用也可以,但可以学习一下这个 ...
- 如何用Python一门语言通吃高性能并发、GPU计算和深度学习
[CTO讲堂]如何用Python一门语言通吃高性能并发.GPU计算和深度学习 发表于2016-01-04 15:11| 4374次阅读| 来源CSDN| 4 条评论| 作者蒲婧 CTO俱乐部CTOCT ...
- python支持的几种并发方式进行简单的总结
本文对python支持的几种并发方式进行简单的总结. Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及).概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作 ...
最新文章
- (Android Studio)ActionBar's Theme/Style [ActionBar主题风格修改]
- 【Python】100行Python代码轻松开发个人博客
- [Nodejs原理] 核心库Libuv入门(Hello World篇)
- 【每日一题】7月10日精讲—矩阵取数游戏
- beta版本项目冲刺
- 此变量非彼变量(python变量)
- adb shell操作文件
- 腾讯云一站式物联PaaS平台IOT Suite助力行业加速“物联网+”
- K8S学习之helm
- Ubuntu18.04安装PX4并与ROS联合实验
- QT学习笔记(十五):QLabel的点击事件(clicked)添加
- 向量法计算体积的思路(没有代码了)
- 记录帖-电脑版微信多开
- 阴阳师双拉条怎么不被超车
- STM32F105双CAN双FIFO通讯心得体会
- 订单增2倍?如何利用促销手段瞄准圣诞季高意向顾客?
- JVM之垃圾收集算法
- 内核启动分析(三)——zImage 解压缩阶段
- 为偏执的你准备的5款安卓加密工具
- Oracle特殊字符转义
热门文章
- 论文浅尝 | SPARQL 语言的 ASK 查询表达性研究进展
- 论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成
- A Comprehensive Survey on Graph Neural Networks
- php 流(Stream)
- Chapter 3.GDI/DirectDraw Internal Data Structures
- 解决i9001WiFi频繁断线
- 分享-利用VPC防止病毒软件的进入你的windows电脑
- linux网络编程——boa移植
- 【计算机网络复习 数据链路层】3.6.2 以太网
- Jupyter notebook 导入和卸载 conda 虚拟环境