python实现多线程端口扫描


Posted in Python onAugust 31, 2019

一个简易的TCP端口扫描器,使用python3实现。

需求:扫描目标网站开放哪些端口号,将所有开放的端口号输出。

分析:使用socket连接,如果连接成功,认为端口开放,如果连接失败,认为端口关闭(有可能端口开放但连接失败,这里简单认为端口不开放)

使用到的库:socket, threading

过程:

先定义一个函数,对给定的(ip, port)进行扫描,看其是否能连接成功。

def tcpPortScan(ip, port, openPort):
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字
 sock.settimeout(0.1)   # 设置延时时间
 try:
  result = sock.connect_ex((ip, port))
  if result == 0:    # 如果连接成功,返回值为0
   openPort.append(port) # 如果端口开放,就把端口port赋给openPort
 except:
  pass
 sock.close()     # 关闭套接字

当需要扫描目标地址的多个端口时,循环使用上述函数的话,扫描速度会极其慢,因为考虑使用多线程。

再定义一个函数,实现多线程扫描。

def threadingPortScan(host, portList, openPorts = []):
 
 hostIP = socket.gethostbyname(host) # 获取域名对应的IP地址
 nloops = range(len(portList))
 threads = []
 
 for i in nloops:
  t = threading.Thread(target=tcpPortScan, args=(hostIP, portList[i], openPorts))
  threads.append(t)
 
 for i in nloops:
  threads[i].start()
 
 for i in nloops:
  threads[i].join()
 return openPorts  # 返回值为该域名下开放的端口列表

完整代码如下:

# -*- coding:utf-8 -*-
'''
使用多线程,检测一个目标地址的端口开放情况,目标地址由用户输入,端口暂时定义为0~1024,
检测TCP连接是否成功,如果连接成功,则端口开放,不成功则端口关闭
'''
 
import socket
import threading
 
def main():
 host = input('please input domain:')
 portList = range(0, 1025)
 openPorts = threadingPortScan(host, portList)
 print(host,'open ports:', openPorts)
 
# 对给定的(ip, port)进行TCP连接扫描
def tcpPortScan(ip, port, openPort):
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字
 sock.settimeout(0.1)   # 设置延时时间
 try:
  result = sock.connect_ex((ip, port))
  if result == 0:
   openPort.append(port) # 如果端口开放,就把端口port赋给openPort
 except:
  pass
 sock.close()     # 关闭套接字
 
 
def threadingPortScan(host, portList, openPorts = []):
 
 hostIP = socket.gethostbyname(host) # 获取域名对应的IP地址
 nloops = range(len(portList))
 threads = []
 
 for i in nloops:
  t = threading.Thread(target=tcpPortScan, args=(hostIP, portList[i], openPorts))
  threads.append(t)
 
 for i in nloops:
  threads[i].start()
 
 for i in nloops:
  threads[i].join()
 return openPorts  # 返回值为该域名下开放的端口列表
 
if __name__ == '__main__':
 main()

使用www.qq.com做一个测试,测试结果如下:

>>>please input domain: www.qq.com
www.qq.com open ports: [80, 843]

总结:这个小程序仅适用于新手练习,不适合真正应用。该简易端口扫描器仅能扫描出一部分端口,有些端口可能因为防火墙拦截导致扫描失败。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 Python
windows上安装Anaconda和python的教程详解
Mar 28 Python
python+os根据文件名自动生成文本
Mar 21 Python
pandas DataFrame索引行列的实现
Jun 04 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
python构造函数init实例方法解析
Jan 19 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
Python 使用双重循环打印图形菱形操作
Aug 09 Python
Python 高效编程技巧分享
Sep 10 Python
Python MNIST手写体识别详解与试练
Nov 07 Python
python实现复制大量文件功能
Aug 31 #Python
django 做 migrate 时 表已存在的处理方法
Aug 31 #Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 #Python
解决Django migrate不能发现app.models的表问题
Aug 31 #Python
python django生成迁移文件的实例
Aug 31 #Python
python实现递归查找某个路径下所有文件中的中文字符
Aug 31 #Python
python+django+rest框架配置创建方法
Aug 31 #Python
You might like
php Ubb代码编辑器函数代码
2012/07/05 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
jQuery 浮动广告实现代码
2008/12/25 Javascript
判断用户是否在线的代码
2011/03/05 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
jQuery返回定位插件详解
2017/05/15 jQuery
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
python事件驱动event实现详解
2018/11/21 Python
python实现控制台打印的方法
2019/01/12 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
django 实现简单的插入视频
2020/04/07 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
冰淇淋店的创业计划书
2014/02/07 职场文书
超市重阳节活动方案
2014/02/10 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
教育教学工作反思
2016/02/24 职场文书
Java Spring读取和存储详细操作
2022/08/05 Java/Android