手把手教你写一个图形化的端口扫描工具

news2024/9/24 5:27:29

前言

关于学习群

由于我使用masscan进行纯端口扫描的时候,遇到扫描不出结果的情况,我就考虑了自己写一个端口扫描脚本,还挺好用。

image-20240805144645079

库介绍

1、asyncio

asyncio 是 Python 的一个库,用于编写单线程并发代码。使用 asyncio,你可以使用异步函数 (async def) 来编写协程。协程可以被调度执行,执行过程中可以等待其他协程完成,而不必阻塞整个程序的运行。

2、ipaddress

ipaddress 是 Python 的一个标准库模块,主要用于检查和操作 IP 地址。该模块提供了创建、操作和表示 IPv4 和 IPv6 地址及网络的功能。

3、tkinter

Tkinter是Python标准库中的一个模块,专门用于创建图形用户界面(GUI)应用程序。

可以使用nmap扫描,也可以使用该脚本定制自己的图形界面,和其他功能,比如网站目录扫描,本代码仅供参考

import asyncio
import ipaddress


# 异步扫描指定IP和端口的函数
async def scan_port(ip, port, semaphore):
    async with semaphore:  # 使用信号量限制并发数量
        try:
            # 尝试连接到指定的IP和端口,设置超时为3秒
            reader, writer = await asyncio.wait_for(asyncio.open_connection(ip, port), timeout=3)
            print(f"端口 {port} 在 {ip} 开启")  # 如果连接成功,打印端口开启的信息
            writer.close()  # 关闭连接
        except (ConnectionRefusedError, OSError):
            # 如果连接被拒绝或发生其他OS错误,则不执行任何操作
            pass
        except asyncio.TimeoutError:
            # 如果连接超时,则不执行任何操作
            pass

        # 解析IP范围的函数


def parse_ip_range(ip_range):
    if '/' in ip_range:
        # 如果IP范围使用CIDR表示法
        return [str(ip) for ip in ipaddress.ip_network(ip_range).hosts()]  # 返回CIDR范围内的所有IP地址
    elif '-' in ip_range:
        # 如果IP范围使用起始-结束表示法
        start_ip, end_ip = ip_range.split('-')  # 分割起始和结束IP
        start_int = int(ipaddress.IPv4Address(start_ip))  # 将起始IP转换为整数
        end_int = int(ipaddress.IPv4Address(end_ip))  # 将结束IP转换为整数
        return [str(ipaddress.IPv4Address(i)) for i in range(start_int, end_int + 1)]  # 返回范围内的所有IP地址
    else:
        # 如果使用单个IP表示法
        return [ip_range]  # 返回单个IP地址的列表


# 主函数,用于执行端口扫描
async def main(ip_range, ports):
    ips = parse_ip_range(ip_range)  # 解析IP范围

    semaphore = asyncio.Semaphore(500)  # 创建一个信号量,限制并发连接的数量
    tasks = []  # 创建一个任务列表

    # 遍历IP范围和端口范围,为每个IP和端口创建一个扫描任务
    for ip in ips:
        for port in ports:
            task = asyncio.create_task(scan_port(ip, port, semaphore))  # 创建扫描任务
            tasks.append(task)  # 将任务添加到任务列表中

    # 等待所有任务完成,并捕获可能的异常
    try:
        await asyncio.wait(tasks)  # 等待所有任务完成
    except Exception as e:
        print(f"An error occurred: {e}")  # 如果发生错误,打印错误信息


# 程序入口点
if __name__ == "__main__":
    # 设置IP范围和要扫描的端口范围
    ip_range = "192.168.3.155"  # 指定单个IP或IP范围
    target_ports = range(80, 60000)  # 指定要扫描的端口范围
    # 运行主函数,开始端口扫描
    asyncio.run(main(ip_range, target_ports))

执行结果

image-20240805150702536

那么添加一个ui界面呢

image-20240805154953735

多个ip扫描

image-20240805155216447

代码如下:

import asyncio
import ipaddress
import tkinter as tk
from tkinter import scrolledtext


# 异步扫描指定IP和端口的函数
async def scan_port(ip, port, semaphore, result_queue):
    async with semaphore:
        try:
            reader, writer = await asyncio.wait_for(asyncio.open_connection(ip, port), timeout=3)
            await result_queue.put(f"端口 {port} 在 {ip} 开启")
            writer.close()
        except (ConnectionRefusedError, OSError, asyncio.TimeoutError):
            pass


def parse_ip_range(ip_range):
    if '/' in ip_range:
        return [str(ip) for ip in ipaddress.ip_network(ip_range).hosts()]
    elif '-' in ip_range:
        start_ip, end_ip = ip_range.split('-')
        start_int = int(ipaddress.IPv4Address(start_ip))
        end_int = int(ipaddress.IPv4Address(end_ip))
        return [str(ipaddress.IPv4Address(i)) for i in range(start_int, end_int + 1)]
    else:
        return [ip_range]


async def main(ip_range, ports, result_queue):
    ips = parse_ip_range(ip_range)
    semaphore = asyncio.Semaphore(500)
    tasks = []
    for ip in ips:
        for port in ports:
            task = asyncio.create_task(scan_port(ip, port, semaphore, result_queue))
            tasks.append(task)
    await asyncio.wait(tasks)


class PortScannerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("端口扫描器")

        self.ip_label = tk.Label(root, text="IP范围:")
        self.ip_label.grid(row=0, column=0)

        self.ip_entry = tk.Entry(root)
        self.ip_entry.grid(row=0, column=1)

        self.port_label = tk.Label(root, text="端口范围:")
        self.port_label.grid(row=1, column=0)

        self.port_entry = tk.Entry(root)
        self.port_entry.grid(row=1, column=1)

        self.start_button = tk.Button(root, text="开始扫描", command=self.start_scan)
        self.start_button.grid(row=2, column=0, columnspan=2)

        self.result_text = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=40, height=10)
        self.result_text.grid(row=3, column=0, columnspan=2)

        self.result_queue = asyncio.Queue()

    def start_scan(self):
        ip_range = self.ip_entry.get()
        port_range = self.port_entry.get()

        if '-' in port_range:
            start_port, end_port = map(int, port_range.split('-'))
            ports = range(start_port, end_port + 1)
        else:
            ports = [int(port_range)]

        asyncio.run(main(ip_range, ports, self.result_queue))
        self.process_results()

    def process_results(self):
        while not self.result_queue.empty():
            result = self.result_queue.get_nowait()
            self.result_text.insert(tk.END, result + "\n")
            self.result_text.yview(tk.END)


if __name__ == "__main__":
    root = tk.Tk()
    app = PortScannerApp(root)
    root.mainloop()

开始打包

pip install pyinstaller  
pyinstaller your_script.py

开始扫描

image-20240805160052094

当然使用nmap的-sS参数syn扫描,速度也比较快,但是也得指定端口,不指定端口的话呢就像这样,使用默认的1-10000范围内的端口号(大致范围)

image-20240805145421710

指定范围就可以使用了

image-20240805145530386

后期我会把他写成一个多功能的工具,大家敬请期待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MacBook2024非常出色的虚拟机软件Parallels Desktop19.3中文免费版本

最近我被问得最多的一个问题就是:能不能在一台设备上同时使用Windows系统和macOS系统?答案当然是肯定的,你只需要一款虚拟机软件就能轻松实现。今天,我就来为大家安利一款非常出色的虚拟机软件——Parallels Desktop19。 这款软件…

【C++】模拟实现queue

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 ​​ 一.了解项目功能 📌了解queue官方标准 在本次项目中我们的目标是模拟实现一个queue,先一起看一下C标准文档中queue的定义:cplusplus : C queue标准文档htt…

中英文字翻译,这几款软件值得收藏!

在这个全球化的时代,语言不再是沟通的障碍,而翻译软件则成为了我们跨越语言鸿沟的得力助手。今天,就让我们一起探索三款让英文翻译变得前所未有的简单与高效的神奇软件,无论是学习、工作还是旅行,它们都能成为你不可或…

kickstart无人值守以及pxe实现服务器自动部署

使用背景 在企业中安装多台操作系统时会面临的问题:当安装Linux操作系统时,安装过程会需要回答很多关于设定的问题 这些问题必须手动选择,否则无法进行安装 。当只安装1台Linux系统,手动选择设定工作量比较轻松 当安装多台Linux&a…

PSO_GA混合算法优化PID参数(附代码)

由于PSO算法本身的缺陷,其存在容易出现早熟收敛、后期迭代效率不高、搜索精度不高的问题,在线性递减惯性权重PSO算法的基础上,与GA遗传算法相结合,针对PSO易陷入局部最优,通过采用GA杂交变异的思想,增加了粒子的多样性,跳出局部最优,增强混合算法的全局搜索能力,提高搜…

完美解决pip命令版本冲突导致对应版本模块包无法安装的问题

解决步骤 使用pip更新/降低指定模块包命令格式降低pip自身至指定版本的命令再次换源安装指定模块包 在对 FasterNet 这篇论文源码复现过程中,我们首先需要安装相关依赖文件( path/to/your/requirements.txt) -extra-index-url https://down…

CentOS7 VMware虚拟机基于NAT配置网络IP

目录 前言 VMnet8 虚拟网络编辑 ens33 ping 防火墙 前言 平时学习时一直需要用到Linux服务器,一般都是在Windows上安装VMware来创建一个虚拟机。创建的虚拟机需要配置网络才能够访问外网,可以通过以下两种方式来配置虚拟机网络 桥接模式NAT模式&…

给儿童掏耳朵用什么工具好?TOP4机型实测数据大公开

作为一名专业的个护测评师,我深知宝宝掏耳朵是一件多难的事情,由于宝宝的耳朵属于盲区。在为他操作时,很容易伤及宝宝的耳膜。因此,帮宝宝掏耳朵时工具的选择非常的重要。然而市场上许多跨界大牌存在隐患。某些网红品牌&#xff0…

视频发光字体特效怎么做 会声会影字体怎么淡化退出 视频剪辑制作教程

视频字体样式在视频制作中起着重要的作用,它可以帮助传达信息、增强视觉吸引力、提供情感表达、强调关键信息和提供文化背景解读等。这篇文章以会声会影为例,来一起看看发光字体制作,字体怎么淡化退出等内容。 你可以在这里免费下载会声会影…

Spring-Kafka确认机制报错:No Acknowledgment available as an argument

问题出现 在spring boot集成kafka时报错,报错信息: No Acknowledgment available as an argument, the listener container must have a MANUAL AckMode to populate the Acknowledgment.翻译: Acknowledgment 参数不可用,监听…

thingsboard-3.6.4 源码编译运行

1.首先我们要检查我们所需要的环境是否全部安装,还有对应的版本,一定要按照项目要求的版本来,要不然你会给自己挖很多坑。 我们使用的是3.6.4的版本,下面的版本全是基于这个版本的。需要安装好已经配置环境变量。 这部分大家就自…

adaboost提升方法

集成学习:串联(提升方法),并联(随机森林) Adaboost:分类加法模型(更新样本权值,投票权值-由权值误差率决定) 提升树:回归加法模型 (…

Linux驱动开发—平台总线模型详解

文章目录 1.平台总线介绍1.1平台总线模型的组成部分1.2平台总线模型的优势 2.使用平台总线模型开发驱动2.1注册platform设备2.2注册platform驱动2.3效果演示 1.平台总线介绍 Linux 平台总线模型(Platform Bus Model)是一种设备驱动框架,用于…

软件测试老兵的十条生存法则

在当下的数字化时代,软件测试行业正经历快速的变革和发展。自动化测试、持续集成和持续交付(CI/CD)、人工智能(AI)和机器学习(ML)、云计算和DevOps等技术正在重塑软件测试的各个方面。这些变化不…

全国产Gpixel图像传感器+FPGA+AI高帧率机器视觉工业相机解决方案

近些年来,机器视觉广泛应用于智能制造、自动化等设备中,用来保证产品质量,控制生产流程,感知环境等。面对不同的应用场景,检测系统需要满足不同的技术指标。其中图像传感器的分辨率和帧率是两个极为重要的指标&#xf…

2023级JavaScript与jQuery

第一课:JavaScript概述 一.预习笔记 1.认识JavaScript 1-1:1995年,NetScape公司与Sun公司联合开发出JavaScript脚本语言 1-2:JavaScript的作用 1)客户端表单验证 2)页面动态效果 3)动态改…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-03 IP_ARP层程序设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

基于Golang实现Kubernetes边车模式

本文介绍了如何基于 Go 语言实现 Kubernetes Sidecar 模式,并通过实际示例演示创建 Golang 实现的微服务服务、Docker 容器化以及在 Kubernetes 上的部署和管理。原文: Sidecar Pattern with Kubernetes and Go[1] 在这篇文章中,我们会介绍 Sidecar 模式…

【分享】2022年291个城市的人均GDP数据,附带数据获取方式

2022年291个城市的人均GDP数据涉及全国地级及以上城市的经济发展水平。在这份详尽的数据中,包括了众多城市的经济表现,并依据国际标准对它们的经济状况进行了分类。具体如下: 人均GDP高值城市 鄂尔多斯:鄂尔多斯市位于内蒙古自治区…

单位企业邮箱有什么优势

单位企业邮箱成为了企业内外沟通的重要工具。单位企业邮箱的优势有什么呢?一、统一专业形象;二、高效沟通;三、安全保障;四、便捷管理;五、定制服务等。本文将深入探讨单位企业邮箱的独特优势,帮助您了解为…