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 模拟购物车的实例讲解
Sep 11 Python
Python使用PIL模块生成随机验证码
Nov 21 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
Python使用pyserial进行串口通信的实例
Jul 02 Python
Python实现滑动平均(Moving Average)的例子
Aug 24 Python
Python 实现自动导入缺失的库
Oct 29 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
Pyspark读取parquet数据过程解析
Mar 27 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 Python
bat批处理之字符串操作的实现
Mar 16 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根据图片色界在不同位置加水印的方法
2015/07/01 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
php实现简易计算器
2020/08/28 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
快速入门Vue
2016/12/19 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
python实现获取Ip归属地等信息
2016/08/27 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
Python实现搜索算法的实例代码
2020/01/02 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
Android面试宝典
2013/08/06 面试题
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
生物科学专业个人求职信范文
2013/12/05 职场文书
高中自我鉴定
2013/12/20 职场文书
暑期社会实践方案
2014/02/05 职场文书
维修工先进事迹
2014/05/29 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
超级礼物观后感
2015/06/15 职场文书
2015党建工作简报
2015/07/21 职场文书