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处理圆角图片、圆形图片的例子
Apr 25 Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
python中对数据进行各种排序的方法
Jul 02 Python
对python中的装包与解包实例详解
Aug 24 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
如何使用repr调试python程序
Feb 28 Python
Python内置函数locals和globals对比
Apr 28 Python
python Django 反向访问器的外键冲突解决
May 20 Python
django rest framework 过滤时间操作
Jul 12 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之第二天
2006/10/09 PHP
php在字符串中查找另一个字符串
2008/11/19 PHP
深入密码加salt原理的分析
2013/06/06 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
2013/06/05 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
浅谈sass在vue注意的地方
2017/08/10 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
Python学习之用pygal画世界地图实例
2017/12/07 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
Python3实现mysql连接和数据框的形成(实例代码)
2020/01/17 Python
NumPy统计函数的实现方法
2020/01/21 Python
python怎么对数字进行过滤
2020/07/05 Python
Python项目打包成二进制的方法
2020/12/30 Python
高等教育专业自荐信范文
2014/03/26 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS