精华内容
下载资源
问答
  • 多线程端口扫描器实现计算机的端口的扫描,只要在在前台设置好所要扫描的IP、起始端口、结束端口以及所要用到的线程数,点击扫描,就可以扫描到所输入IP地址主机的开放端口,并显示在主窗体中;点击退出,则可以...
  • 多线程端口扫描器V1.0 版本1.0 后期会不断更新版本 完善更多性能 同步扫描1-65535端口 由于扫描全端口 时间消耗比较久 采用了防IP检测技术 不会被封IP 支持多开!!! 扫描后的结果会以扫描的ip地址为名字 保存在c...
  • 多线程 端口扫描器 可导出扫描记录 自定义线程数 自己写的
  • 一、项目创建以及页面设计 (一)项目新建 1.选择Windows窗体项目应用(.Net Framework)->下一步: 2.项目命名以及合适的存储位置,选择创建 (二)页面设计 1.点开工具箱,需要4个Label,一个Button,一个...

    一、项目创建以及页面设计

    (一)项目新建

    1.选择Windows窗体项目应用(.Net Framework)->下一步
    在这里插入图片描述

    2.项目命名以及合适的存储位置,选择创建

    在这里插入图片描述

    (二)页面设计

    1.点开工具箱,需要4个Label,一个Button,一个Progress,4个TextBox
    在这里插入图片描述

    2.横向拉伸TextBox
    (1)点击三角形
    在这里插入图片描述
    (2)勾选Multiline后拉伸
    在这里插入图片描述
    (3)设置控件的名称和唯一标志
    设置唯一标志
    在这里插入图片描述
    修改显示名称

    在这里插入图片描述
    (4)页面设计如下
    在这里插入图片描述

    (5)设置消息显示界面的 TextBox 不可编辑:找到 Enabled 属性,参数设为 False 。

    在这里插入图片描述

    二、单线程实现端口扫描

    (一)代码实现

    1.双击按钮btnShow
    在这里插入图片描述

    2.编写代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace cqjtuWindowsFormsApp
    {
        public partial class Form1 : Form
        {
    
                private string hostAddress;
                //起始端口
                private int start;
                //终止端口
                private int end;
                //端口号
                private int port;
                //定义线程对象
                private Thread scanThread;
                public Form1()
                {
                    InitializeComponent();
                }
    
                private void label1_Click(object sender, EventArgs e)
                {
    
                }
    
                private void label2_Click(object sender, EventArgs e)
                {
    
                }
    
                private void label4_Click(object sender, EventArgs e)
                {
    
                }
    
                private void button1_Click(object sender, EventArgs e)
                {
                    try
                    {
                        //初始化
                        tbShow.Clear();
                        lb.Text = "0%";
    
                        //获取ip地址和始末端口号
                        hostAddress = tbHost.Text;
                        start = Int32.Parse(tbSPort.Text);
                        end = Int32.Parse(tbEPort.Text);
    
                        if (decideAddress()) // 端口合理
                        {
                            //让输入的textbox只读,无法改变
                            tbHost.ReadOnly = true;
                            tbSPort.ReadOnly = true;
                            tbEPort.ReadOnly = true;
                            //设置进度条的范围
                            pb.Minimum = start;
                            pb.Maximum = end;
    
                            //显示框显示
                            tbShow.AppendText("端口扫描器 v1.0.0" + Environment.NewLine + Environment.NewLine);
                            //调用端口扫描函数
                            PortScan();
                        }
                        else
                        {
                            //若端口号不合理,弹窗报错
                            MessageBox.Show("输入错误,端口范围为[0-65536]!");
                        }
                    }
                    catch
                    {
                        //若输入的端口号为非整型,则弹窗报错
                        MessageBox.Show("输入错误,端口范围为[0-65536]!");
                    }
                }
                /// <summary>
                /// 判断端口是否合理
                /// </summary>
                /// <returns></returns>
                private bool decideAddress()
                {
                    //判断端口号是否合理
                    if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end))
                        return true;
                    else
                        return false;
                }
                private void PortScan()
                {
                    double x;
                    string xian;
                    //显示扫描状态
                    tbShow.AppendText("开始扫描...(可能需要请您等待几分钟)" + Environment.NewLine + Environment.NewLine);
                    //循环抛出线程扫描端口
                    for (int i = start; i <= end; i++)
                    {
                        x = (double)(i - start + 1) / (end - start + 1);
                        xian = x.ToString("0%");
                        port = i;
                        //调用端口i的扫描操作
                        Scan();
                        //进度条值改变
                        lb.Text = xian;
                        lb.Refresh();
                        pb.Value = i;
                    }
                    tbShow.AppendText(Environment.NewLine + "扫描结束!" + Environment.NewLine);
                    //输入框textbox只读属性取消
                    tbHost.ReadOnly = false;
                    tbSPort.ReadOnly = false;
                    tbEPort.ReadOnly = false;
                }
    
                /// <summary>
                /// 扫描某个端口
                /// </summary>
                private void Scan()
                {
                    int portnow = port;
                    //创建TcpClient对象,TcpClient用于为TCP网络服务提供客户端连接
                    TcpClient objTCP = null;
                    try
                    {
                        //用于TcpClient对象扫描端口
                        objTCP = new TcpClient(hostAddress, portnow);
                        //扫描到则显示到显示框
                        tbShow.AppendText("端口 " + port + " 开放!" + Environment.NewLine);
                    }
                    catch
                    {
                        //未扫描到,则会抛出错误
                    }
                }
    
            }
        }
    
    

    (二)运行结果

    1.启动项目
    在这里插入图片描述

    2.输入相关信息
    在这里插入图片描述
    3.扫描结果
    在这里插入图片描述

    三、多线程实现端口扫描

    (一)程序实现

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace cqjtuWindowsFormsApp
    {
        public partial class Form1 : Form
        {
    
                private string hostAddress;
                //起始端口
                private int start;
                //终止端口
                private int end;
                //端口号
                private int port;
                //定义线程对象
                private Thread scanThread;
               //定义端口状态数据(开放则为true,否则为false)
               private bool[] done = new bool[65526];
               private bool OK;
            public Form1()
                {
                    InitializeComponent();
                //不进行跨线程检查
                CheckForIllegalCrossThreadCalls = false;
            }
    
                private void label1_Click(object sender, EventArgs e)
                {
    
                }
    
                private void label2_Click(object sender, EventArgs e)
                {
    
                }
    
                private void label4_Click(object sender, EventArgs e)
                {
    
                }
    
                private void button1_Click(object sender, EventArgs e)
                {
                try
                {
                    //初始化
                    tbShow.Clear();
                    lb.Text = "0%";
    
                    //获取ip地址和始末端口号
                    hostAddress = tbHost.Text;
                    start = Int32.Parse(tbSPort.Text);
                    end = Int32.Parse(tbEPort.Text);
    
                    if (decideAddress()) // 端口合理
                    {
                        //让输入的textbox只读,无法改变
                        tbHost.ReadOnly = true;
                        tbSPort.ReadOnly = true;
                        tbEPort.ReadOnly = true;
                        //创建线程,并创建ThreadStart委托对象
                        Thread process = new Thread(new ThreadStart(PortScan));
                        process.Start();
                        //设置进度条的范围
                        pb.Minimum = start;
                        pb.Maximum = end;
    
                        //显示框显示
                        tbShow.AppendText("端口扫描器 v1.0.0" + Environment.NewLine + Environment.NewLine);
                    }
                    else
                    {
                        //若端口号不合理,弹窗报错
                        MessageBox.Show("输入错误,端口范围为[0-65536]!");
                    }
    
                }
                catch
                {
                    //若输入的端口号为非整型,则弹窗报错
                    MessageBox.Show("输入错误,端口范围为[0-65536]!");
                }
    
                }
                /// <summary>
                /// 判断端口是否合理
                /// </summary>
                /// <returns></returns>
                private bool decideAddress()
                {
                    //判断端口号是否合理
                    if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end))
                        return true;
                    else
                        return false;
                }
                private void PortScan()
                {
                double x;
                string xian;
                //显示扫描状态
                tbShow.AppendText("开始扫描...(可能需要请您等待几分钟)" + Environment.NewLine + Environment.NewLine);
                //循环抛出线程扫描端口
                for (int i = start; i <= end; i++)
                {
                    x = (double)(i - start + 1) / (end - start + 1);
                    xian = x.ToString("0%");
                    port = i;
                    //使用该端口的扫描线程
                    scanThread = new Thread(new ThreadStart(Scan));
                    scanThread.Start();
                    //使线程睡眠
                    System.Threading.Thread.Sleep(100);
                    //进度条值改变
                    lb.Text = xian;
                    pb.Value = i;
                }
                while (!OK)
                {
                    OK = true;
                    for (int i = start; i <= end; i++)
                    {
                        if (!done[i])
                        {
                            OK = false;
                            break;
                        }
                    }
                    System.Threading.Thread.Sleep(1000);
                }
                tbShow.AppendText(Environment.NewLine + "扫描结束!" + Environment.NewLine);
                //输入框textbox只读属性取消
                tbHost.ReadOnly = false;
                tbSPort.ReadOnly = false;
                tbEPort.ReadOnly = false;
                }
    
                /// <summary>
                /// 扫描某个端口
                /// </summary>
                private void Scan()
                {
                    int portnow = port;
                //创建线程变量
                Thread Threadnow = scanThread;
                //扫描端口,成功则写入信息
                done[portnow] = true;
                //创建TcpClient对象,TcpClient用于为TCP网络服务提供客户端连接
                TcpClient objTCP = null;
                try
                {
                    //用于TcpClient对象扫描端口
                    objTCP = new TcpClient(hostAddress, portnow);
                    //扫描到则显示到显示框
                    tbShow.AppendText("端口 " + port + " 开放!" + Environment.NewLine);
                }
                catch
                {
                    //未扫描到,则会抛出错误
                }
                }
    
            }
        }
    
    

    (二)运行结果

    1.启动项目
    在这里插入图片描述

    2.输入相关信息
    在这里插入图片描述
    3.扫描结果

    在这里插入图片描述
    可以发现多线程扫描只需要十几秒,而单线程需要几分钟,明显多线程比单线程更快些

    四、总结

    可以发现多线程能够有更好的CPU使用率,可以使程序设计更简单,明显可以看见多线程拥有更快的程序响应速度。

    五、参考资料

    C#实现端口扫描器

    展开全文
  • 项目实习(四)多线程端口扫描器

    千次阅读 2019-09-16 13:11:27
    这次是大学期间第四次项目实习,主要是利用C#技术设计一个简单的多线程端口扫描器,能够扫描网段内的各端口信息。 设计任务及目标 本次项目实习的任务是设计实现一个简单的端口扫描器,它通过与目标主机 TCP/IP...

    这次是大学期间第四次项目实习,主要是利用C#技术设计一个简单的多线程端口扫描器,能够扫描网段内的各端口信息。

    设计任务及目标

    本次项目实习的任务是设计并实现一个简单的端口扫描器,它通过与目标主机 TCP/IP端口建立连接并请求某些服务,记录目标主机的应答,分析目标主机相关信息,从而发现目标主机某些内在的安全弱点。即实现一个端口扫描程序,判断指定的主机有哪些端口可以提供服务, 并把扫描得知的结果记录下来并显示出来。

    需求分析

    二十一世纪是信息化、网络化的世纪,信息是社会发展的重要资源。信息安全保障能力是一个国家综合国力、经济竞争实力和生存能力的重要组成部分,是世界各国在奋力攀登的制高点。国际标准化组织(ISO)对计算机系统安全的定义是:为数据处理系统建立和采用的技术和管理的安全保护,保护计算机硬件,软件和数据不因偶然和恶意的原因遭到破坏,更改和泄露。由此可以将计算机网络的安全理解为:通过采用各种技术和管理措施,使网络系统正常运行,从而确保网络数据的可用性、完整性和保密性。所以,建立网络安全保护措施的目的是确保经过网络传输和交换的数据不会发生增加、修改、丢失和泄露等。网络安全包括技术领域和非技术领域两大部分:非技术领域包括一些制度,政策,管理,安全意识,实体安全等方面的内容;技术领域包括隐患扫描,防火墙,入侵检测,访问控制,虚拟专用网,CA认证,操作系统等方面的内容。这些技术的目标是保证信息的可控性,可用性,保密性,完整性,和不可抵赖性。其中端口扫描属于安全探测技术范畴,对应于网络攻击技术中的网络信息收集技术。

    基本介绍

    1. 端口定义
      首先先明确端口的定义。端口是由计算通信协议TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,它代表TCP链接的一个连接端,一般称为socket,具体来说,就是用[ip:端口]来定位一台主机中的进程。可以做这样的比喻,端口相当于两台计算机进程间的大门,可随便定义,其目的只是为了让两台计算机能找到对方的进程。计算机就想一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。我们这里所说的端口,不是计算机硬件的 i/o端口,而是软件形式上的概念。服务器可以向外提供多种服务,比如,一台服务器可以同时是 web服务器,也可以是 ftp服务器,同时,它也可以是邮件服务器。为什么一台服务器可以同时提供那么多的服务呢?其中一个很主要的方面,就是各种服务采用不同的端口分别提供不同的服务。根据提供服务类型的不同,端口分为两种,一种是 tcp端口,一种是 udp端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后, 可以确认信息是否到达,也就是有应答的方式,这种方式大多采用tcp 协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用 udp协议。对应这两种协议的服务提供的端口,也就分为 tcp端口和 udp端口。这样,入侵者可以通过扫描器对目标主机的端口进行扫描,即可确定哪些端口是开放的,包括网络协议和各种应用监听的窗口。从开放的端口,入侵者可以知道目标主机大致提供了哪些服务,进而猜测可能存在的漏洞,进而进行攻击。
    2. 常见端口介绍
      端口:21。服务:FTP
      说明:FTP服务器所开放的端口,用于上传,下载。最常见的攻击者用于寻找打开 anonymous的FTP 服务器的方法。这些服务器带有可读写的目录。
      端口:23。服务:Telnet
      说明:远程登录,入侵者在搜索远程登录 UNIX 的服务。大多数情况下扫描这一端口是为了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。
      端口:25。服务:SMTP
      说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找 SMTP 服务器是为了传递他们的 SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的 E-MAIL 服务器上,将简单的信息传递到不同的地址。
      端口:53。服务:DNS
      说明:DNS服务器所开放的端口,入侵者可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。
      端口:80。服务:HTTP
      说明:用于网页浏览。
      端口:110。服务:POP3
      说明:POP3 用于客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交换缓冲区溢出的弱点至少 有20个(这意味着Hacker可以在真正登陆前进入系统)。成功登陆后还有其它缓冲区溢出错误。
      端口:443。服务:HTTPS
      说明:443端口即网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。在一些对安全性要求较高的网站,比如银行、证券、购物等,都采用HTTPS服务,这样在这些网站上的交换信息其他人都无法看到,保证了交易的安全性。
    3. 扫描技术
      随着 Internet 的不断发展,信息技术已成为促进经济发展,社会进步的巨大推动力。端口扫描技术是网络安全扫描技术一个重要的网络安全技术。与防火墙,入侵检测系统互相配合,能够有效提高网络的安全性。通过扫描能自动检测远端或本地主机系统信息,包括主机的基本信息(如计算机名、域名、组名、操作系统型等),服务信息,用户信息以及漏洞信息,它的重要性在于能够对网络进行安全评估,及时发现安全隐患,防患于未然。网络的安全状况取决于网络中最薄弱的环节,任何疏忽都有可能引入不安全的因素,最有效的方法是定期对网络系统进行安全分析,及时发现并修正存在的脆弱,保证系统安全。国内的扫描技术是在国外的扫描器基础上发展起来的。其中有一些专门从事安全技术的公司。这些公司的扫描器以硬件为主,其特点是执行速度快,不像软件一样受到安装主机系统的限制。然而对于更多的基于主机的端口扫描而言,简单,实用,可靠才是它们的长处。扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可以不留痕迹的发现远程服务器的各种 TCP 端口的分配。这就能让我们间接的或直观的了解到远程主机所存在的安全问题。为了保证网络中计算机的安全性,必须采取主动策略,快速,及时,准确,安全的检测出网络中计算机及防火墙开放的和未开放的端口。计算机端口扫描技术就是这种主动防御策略实现的重要技术手段。扫描器采用模拟攻击的形式对目标可能存在的已知安全漏洞进行逐项检查。目标可以是工作站、服务器、交换机、数据库应用等各种对象。然后根据扫描结果向系统管理员提供周密可靠的安全性分析报告,为提高网络安全整体水平产生重要依据。在网络安全体系的建设中,安全扫描工具花费低、效果好、见效快、与网络的运行相对对立、安装运行简单,可以大规模减少安全管理员的手工劳动,有利于保持全网安全政策的统一和稳定。
    4. 扫描原理
      端口扫描的原理也不复杂,简单来说,就是通过向目的端口发送探测数据包,根据收到的响应来判断端口的状态。
    5. 扫描类型
      端口扫描的类型也有很多,常见的就有TCP SYN扫描,TCP connect扫描,秘密扫描,其他扫描。此次我选择的是第二种扫描方式:TCP connect扫描。我们可以利用系统提供的connect()用来与每一个目标计算机的端口进行连接。该扫描的优点:实现简单,对操作者的权限没有严格要求。另一优点是扫描速度快。如果对每个目标端口以线性的方式,使用单独的connect()调用,可以通过同时打开多个套接字,从而加速扫描。缺点就是会在目标主机的日志记录中留下痕迹,易被发现,并且数据包会被过滤掉。目标主机的logs文件会显示一连串的连接和连接出错的服务信息,并且能很快地使它关闭。
    6. 多线程技术
      每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

    系统分析

    本次课设设计的是一个简单的端口扫描器,该扫描器应具备的基本功能有:
    (1)支持多线程模式扫描端口;
    (2)能对单个指定主机进行扫描或扫描指定网段内的主机;
    (3)能扫描特定的部分端口或对指定的端口段内的端口进行逐个扫描;
    (4)能够显示所开放端口的服务名称。所使用的扫描方法为TCP connect扫描,该扫描的具体实现过程为:TCP connect端口扫描服务端与客户端建立连接成功(目标端口开放)的过程如下: ① Client端发送SYN;② Server端返回SYN/ACK,表明端口开放;③ Client端返回ACK,表明连接已建立;④ Client端主动断开连接。
    该扫描器工作流程为:
    (1)先确定扫描范围。即扫描目的主机的IP地址和需要扫描的端口范围;
    (2)确定好后给扫描器分配好线程数;
    (3)开始扫描端口,结束后将扫描结果显示出来,包括开放和未开放的端口,若端口开放则还可显示该端口提供的服务。
    (4)扫描结束。

    总体设计

    1. 主界面设计
      该端口扫描器是在VS2015环境下开发的,并使用C#创建主要界面和编写主要功能函数。
      端口扫描器主界面如下:
      主界面设计
      主界面布局主要有:IP地址设置,端口范围选择,线程数设置(默认20),扫描进度条,扫描过程显示以及扫描结果显示,底部的当前扫描时间显示,还有开始扫描按钮和停止扫描按钮。此外还有三个重要选项框,分别是单主机扫描模式选择,单端口扫描模式选择,只显示开放端口选择。
      当选中单主机扫描模式时,IP地址设置的第二个编辑框消失:
      单主机扫描
      当选中单端口扫描模式时,端口范围设置的第二个编辑框消失:
      单端口扫描
    2. 扫描器工作流程图
      流程图
      说明:该扫描器可以对单个主机单个端口进行扫描也可以对网段内主机和范围内端口进行逐个扫描,确定扫描IP和扫描端口后点击开始扫描按钮即可对相应IP下的端口进行侦听,并返回端口状态,如果端口开放则同时返回端口服务,扫描结束后线程停止。

    详细设计

    1. 主要数据结构
    private string ipStart; //起始IP地址
    private string ipEnd; //结束IP地址
    private int portStart; //开始端口
    private int portEnd; //结束端口
    private int numThread=20; //分配线程数,默认为20
    private int overtime=20; //超时限制20ms
    private Thread t; //定义一个线程
    rivate Thread scanthread; //端口扫描线程
    private bool[] done = new bool[65536];  
    List<string> str; //扫描结果集
    
    1. 主要函数说明
    private void Form1_Load(object sender, EventArgs e)//主界面加载函数
    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    //单主机扫描模式选择函数
    private void checkBox2_CheckedChanged(object sender, EventArgs e)
    //单端口扫描模式选择函数
    private void button1_Click(object sender, EventArgs e)
    //开始扫描按钮函数
    private void button2_Click(object sender, EventArgs e)
    //停止扫描按钮函数
    public void wait()//扫描IP地址函数
    public string State(int i)//判断端口状态函数
    public string Service(int i)//返回开放端口服务函数
    public void Scan(object Point)//扫描端口函数
    
    1. 扫描IP函数
      利用PingReply对象试探目标主机,如果超时则表示不可达,否则连通
    //利用PingReply对象试探目标主机
                    Ping ping = new Ping();  //初始化一个Ping类实例
                    PingReply reply = ping.Send(IPAddress.Parse(ip + q), overTime);  //调用同步Send方法发送消息,将返回结果保存至PingReply实例
                    if (reply.Status == IPStatus.Success)  //如果能够Ping通,则说明远端主机开放
                    {
                        richTextBox1.Text += "   IP地址: " + ip + q + "\n";   
                        IPHostEntry host = Dns.GetHostEntry(ip + q);  //取得该IP主机信息
                        richTextBox1.Text += "   主机名: "+ host.HostName + "\n";
                    }
                    else
                    {
                        listBox1.Items.Add(ip + q + "          " + "-" + "       " + "-" + "   " + "              - \n");
                        richTextBox1.Text += ip + q + "   不可达\n";
                        continue;
                    }
    //Ping结束
    
    1. 扫描端口函数
      利用系统提供的connect()函数用来与每一个目标计算机的端口进行连接。
    public void Scan(object Point)
            {
                IPEndPoint IPPoint = (IPEndPoint)Point; //使用IPEndPoint类对象获取终结点的IP地址和端口号
                try
                {
                    TcpClient tcp = new TcpClient(); //创建一个TcpClient类
                    tcp.Connect(IPPoint); //调用Connect方法,使用指定的IP地址将客户端连接到TCP主机上
                    if (tcp.Connected)  //如果连接上,证明此端口为开放状态
                        str.Add(Convert.ToString(IPPoint.Port));
                }
                catch
                {
                    ;
                }
            }
    
    1. 多线程函数
    //IP存在,则开子线程开始端口扫描,端口数由textbox1,textbox2的差值决定
                    Thread[] tharr;  //创建多线程
                    if (numThread < (portEnd - portStart + 1))
                    {
                        tharr = new Thread[portEnd - portStart + 1];
                    }
                    else
                    {
                        tharr = new Thread[numThread];
                    }
    bool iscon = true;  //第一个线程等待时间
                    for (int i = 0; i < tharr.Length; i++)
                    {
                        if (tharr[i] == null)  //如果端口扫不到,说明未开放,跳过继续
                            continue;
                        while (tharr[i].IsAlive && iscon)  //端口存在,对端口超时设置时间(目前200毫秒),一直等待此ip所有线程执行完毕才扫描下个ip
                        {
                            Thread.Sleep(200);
                            iscon = false;  //第一个线程给200ms等待时间,其他线程由于同步执行的,所以没等待时间了,如果线程还没执行完,说明此端口不可达
                        }
                    }
    

    使用说明

    运行程序启动端口扫描器,进入扫描器主界面:
    主界面
    (1)IP段端口扫描
    当需要扫描的是IP地址段时,按界面提示输入IP地址段范围以及需要扫描的端口范围,然后可以选择只显示开放端口,完成后点击开始扫描按钮,测试结果如下:
    扫描成功
    测试的IP段为10.21.123.226-10.21.123.228,扫描的端口范围是0-300号端口,分配线程数为20,点击开始扫描按钮后等待数秒扫描完成。可以看到扫描各IP地址的端口的具体过程,以及扫描结果显示的端口状态和它们提供的服务。

    (2)单主机单端口扫描模式
    当需要扫描的是单主机时,选择单主机模式选项,端口范围也选择单端口模式,完成后点击开始扫描按钮,测试结果如下:
    扫描成功
    测试的IP地址为10.21.123.226,端口选择139端口,分配线程数为20.点击开始扫描按钮后等待数秒扫描完成。可以看到扫描结果为139端口状态为open,该端口提供的是NetBIOS/SMB服务。

    (3)只显示开放端口
    该扫描器还可以只显示开放端口以及它们所提供的服务,测试结果如下:
    扫描成功
    可以看到10.21.123.226的0-300端口中开放的只有80,135,139端口,提供的服务分别是HTTP协议代理服务,RPC(远程过程调用)服务,NetBIOS/SMB服务。

    (4)错误提示
    当不按照要求输入相应的IP地址和端口范围时,扫描器将出现错误提示,如下所示:

    扫描失败

    总结

    1. 任务完成情况
      本次设计任务的基本要求已经完成,即实现了一个简单的端口扫描器,能对单IP地址或IP地址段的单端口或端口范围进行扫描,并对开放端口显示它们所提供的服务。
    2. 特色与不足
      该端口扫描器具有以下几个特色:
      (1)扫描器底部有当前的扫描时间;
      (2)可以切换单主机扫描模式和单端口扫描模式;
      (3)可以设置只显示开放端口;
      (4)有扫描进度条较为直观的展示当前的扫描进度;
      (5)有错误提示。
      不足的地方也有不少,比如界面有点简单,可以说是简陋,没有太多自己的设计。还有由于采用的是TCP connect扫描方式,所以不可避免的有它自身带有的缺陷,即容易被防火墙过滤掉。
    3. 所遇到的问题
      本次课程设计中自己也遇到了不少问题,比如一开始只是设想采用TCP connect这种扫描方式,但具体代码方面如何实现却是没有头绪。还比如多线程的实现又是具体怎么操作。等等这些,自己只能通过网上跟参考书上的资料一点一点摸索。

    参考文献

    [1] 谢希仁.《计算机网络》[M].电子工业出版社,2013.6第6版
    [2] 明日科技.《C#从入门到精通》[M].清华大学出版社,2012.9第3版
    [3] 邓宇军.《C# 2.0程序设计教程》[M].清华大学出版社,2005.12第3版
    [4] 肖微.《端口扫描技术的原理》[J].网络安全技术及应用,2006,(7):32-41

    展开全文
  • 简单实现C多线程端口扫描核心代码(2008-11-21 23:05:00)标签:c端口扫描最近想写一个自己的端口扫描器,主要为了方便扫描“自定义”端口,上网找了一下没找到现成的代码,自己就写了个测试代码。主要实现了:对指定...

    a4c26d1e5885305701be709a3d33442f.png

    简单实现C多线程端口扫描核心代码

    (2008-11-21 23:05:00)

    标签:

    c

    端口

    扫描

    最近想写一个自己的端口扫描器,主要为了方便扫描“自定义”端口,上网找了一下没找到现成的代码,自己就写了个测试代码。主要实现了:对指定IP进行扫描,自定义线程数,设置扫描端口的范围。以下程序没有多余的代码只是用来做功能测试。

    #include

    #include

    #pragma comment(lib,"Ws2_32.lib")

    WSADATA wsaData;

    SOCKADDR_IN sockaddr;

    int curport;

    void scan(int i)

    {

    SOCKET Socket;

    int e;

    Socket=socket(AF_INET,SOCK_STREAM,0);

    sockaddr.sin_port=htons(i);

    printf("Connecting %d port.\r",i);

    e=connect(Socket,(LPSOCKADDR)&sockaddr,sizeof(SOCKADDR_IN));

    if (e==SOCKET_ERROR)

    {

    closesocket(Socket);

    return;

    }

    printf("Found port >%d<

    open!\n",i);

    closesocket(Socket);

    }

    DWORD WINAPI ThreadFunc( LPVOID lpParam )

    {

    scan((int)lpParam);

    return 0;

    }

    int main(int argc, char *argv[])

    {

    DWORD dwThreadId;

    WORD wVersionRequest=MAKEWORD(2,2);

    WSAStartup(wVersionRequest,&wsaData);

    sockaddr.sin_family=AF_INET;

    sockaddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.18");

    //要扫描的IP

    int bport,eport,curip,threads,tport,intp,modp;

    threads=200; //线程数

    bport=1; //起始端口

    eport=10000; //结束端口

    curport=bport;

    tport=eport-bport;

    intp=tport / threads;

    modp=tport % threads;

    if(tport

    threads=tport;

    for(int j=0;j

    {

    if (j==intp)

    {

    threads=modp+1;

    }

    for(int i=0;i

    {

    CreateThread(NULL,0,ThreadFunc,(LPVOID)curport,0,&dwThreadId);

    Sleep(5);

    }

    }

    WSACleanup();

    return 0;

    }

    VS2005下编译成功!

    分享:

    a4c26d1e5885305701be709a3d33442f.png喜欢

    0

    a4c26d1e5885305701be709a3d33442f.png赠金笔

    加载中,请稍候......

    评论加载中,请稍候...

    发评论

    登录名: 密码: 找回密码 注册记住登录状态

    昵   称:

    评论并转载此博文

    a4c26d1e5885305701be709a3d33442f.png

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    展开全文
  • ##PortScanner项目(C#实现多线程端口扫描器)说明 ###1. 概述 文件结构 ####1.1 课程设计目的 加深TCP/IP协议的理解,掌握TCP四次握手机制,同时熟悉socket编程。 ####1.2 课程设计内容 实现一个端口扫描器: 支持多...
  • 多线程TCP端口扫描器源码

    热门讨论 2012-09-13 09:19:57
    多线程TCP端口扫描器源码,win32程序。
  • Delphi编写的多线程端口扫描工具及Delphi源代码 Ver 2018-08 可对IP范围进行排除及追加,最高999线程。
  • 前言:这里只给出命令行版的扫描工具,后续可能是写一个独立的界面,或者是集成到其他工具上去。一 扫描原理其实原理非常简单,就是使用Socket去...(2)仅扫描一个指定的端口集合二 使用多线程扫描目标主机一个段的端...

    前言:这里只给出命令行版的扫描工具,后续可能是写一个独立的界面,或者是集成到其他工具上去。

    9a4b19b2bbfa1e14b9f2135af79269b5.gif

    一 扫描原理

    其实原理非常简单,就是使用Socket去连接目标IP或者域名的指定端口,如果能够连上则说明该端口是打开的。反之,要是在连接超时之前都没有连上,则将该端口判断为关闭状态。下面我将分别说明两种基本的扫描方式:(1)扫描一个连续的端口段;(2)仅扫描一个指定的端口集合

    二 使用多线程扫描目标主机一个段的端口开放情况

    /**

    * 多线程扫描目标主机一个段的端口开放情况

    *

    * @param ip

    * 待扫描IP或域名,eg:180.97.161.184 www.zifangsky.cn

    * @param startPort

    * 起始端口

    * @param endPort

    * 结束端口

    * @param threadNumber

    * 线程数

    * @param timeout

    * 连接超时时间

    * */

    public void scanLargePorts(String ip, int startPort, int endPort,

    int threadNumber, int timeout) {

    ExecutorService threadPool = Executors.newCachedThreadPool();

    for (int i = 0; i < threadNumber; i++) {

    ScanMethod1 scanMethod1 = new ScanMethod1(ip, startPort, endPort,

    threadNumber, i, timeout);

    threadPool.execute(scanMethod1);

    }

    threadPool.shutdown();

    // 每秒中查看一次是否已经扫描结束

    while (true) {

    if (threadPool.isTerminated()) {

    System.out.println("扫描结束");

    break;

    }

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36/**

    * 多线程扫描目标主机一个段的端口开放情况

    *

    * @param ip

    *            待扫描IP或域名,eg:180.97.161.184 www.zifangsky.cn

    * @param startPort

    *            起始端口

    * @param endPort

    *            结束端口

    * @param threadNumber

    *            线程数

    * @param timeout

    *            连接超时时间

    * */

    publicvoidscanLargePorts(Stringip,intstartPort,intendPort,

    intthreadNumber,inttimeout){

    ExecutorServicethreadPool=Executors.newCachedThreadPool();

    for(inti=0;i

    ScanMethod1scanMethod1=newScanMethod1(ip,startPort,endPort,

    threadNumber,i,timeout);

    threadPool.execute(scanMethod1);

    }

    threadPool.shutdown();

    // 每秒中查看一次是否已经扫描结束

    while(true){

    if(threadPool.isTerminated()){

    System.out.println("扫描结束");

    break;

    }

    try{

    Thread.sleep(1000);

    }catch(InterruptedExceptione){

    e.printStackTrace();

    }

    }

    }

    然后是一个内部类ScanMethod1实现了Runnable接口:

    /**

    * 扫描方式一:针对起始结束端口,进行逐个扫描

    *

    * */

    class ScanMethod1 implements Runnable {

    private String ip; // 目标IP

    private int startPort, endPort, threadNumber, serial, timeout; // 起始和结束端口,线程数,这是第几个线程,超时时间

    /**

    * 初始化

    *

    * @param ip

    * 待扫描IP或域名

    * @param startPort

    * 起始端口

    * @param endPort

    * 结束端口

    * @param threadNumber

    * 线程数

    * @param serial

    * 标记是第几个线程

    * @param timeout

    * 连接超时时间

    * */

    public ScanMethod1(String ip, int startPort, int endPort,

    int threadNumber, int serial, int timeout) {

    this.ip = ip;

    this.startPort = startPort;

    this.endPort = endPort;

    this.threadNumber = threadNumber;

    this.serial = serial;

    this.timeout = timeout;

    }

    public void run() {

    int port = 0;

    try {

    InetAddress address = InetAddress.getByName(ip);

    Socket socket;

    SocketAddress socketAddress;

    for (port = startPort + serial; port <= endPort; port += threadNumber) {

    socket = new Socket();

    socketAddress = new InetSocketAddress(address, port);

    try {

    socket.connect(socketAddress, timeout); // 超时时间

    socket.close();

    System.out.println("端口 " + port + " :开放");

    } catch (IOException e) {

    // System.out.println("端口 " + port + " :关闭");

    }

    }

    } catch (UnknownHostException e) {

    e.printStackTrace();

    }

    }

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57/**

    * 扫描方式一:针对起始结束端口,进行逐个扫描

    *

    * */

    classScanMethod1implementsRunnable{

    privateStringip;// 目标IP

    privateintstartPort,endPort,threadNumber,serial,timeout;// 起始和结束端口,线程数,这是第几个线程,超时时间

    /**

    * 初始化

    *

    * @param ip

    *            待扫描IP或域名

    * @param startPort

    *            起始端口

    * @param endPort

    *            结束端口

    * @param threadNumber

    *            线程数

    * @param serial

    *            标记是第几个线程

    * @param timeout

    *            连接超时时间

    * */

    publicScanMethod1(Stringip,intstartPort,intendPort,

    intthreadNumber,intserial,inttimeout){

    this.ip=ip;

    this.startPort=startPort;

    this.endPort=endPort;

    this.threadNumber=threadNumber;

    this.serial=serial;

    this.timeout=timeout;

    }

    publicvoidrun(){

    intport=0;

    try{

    InetAddressaddress=InetAddress.getByName(ip);

    Socketsocket;

    SocketAddresssocketAddress;

    for(port=startPort+serial;port<=endPort;port+=threadNumber){

    socket=newSocket();

    socketAddress=newInetSocketAddress(address,port);

    try{

    socket.connect(socketAddress,timeout);// 超时时间

    socket.close();

    System.out.println("端口 "+port+" :开放");

    }catch(IOExceptione){

    // System.out.println("端口 " + port + " :关闭");

    }

    }

    }catch(UnknownHostExceptione){

    e.printStackTrace();

    }

    }

    }

    三 使用多线程扫描目标主机指定Set端口集合的开放情况

    /**

    * 多线程扫描目标主机指定Set端口集合的开放情况

    *

    * @param ip

    * 待扫描IP或域名,eg:180.97.161.184 www.zifangsky.cn

    * @param portSet

    * 待扫描的端口的Set集合

    * @param threadNumber

    * 线程数

    * @param timeout

    * 连接超时时间

    * */

    public void scanLargePorts(String ip, Set portSet,

    int threadNumber, int timeout) {

    ExecutorService threadPool = Executors.newCachedThreadPool();

    for (int i = 0; i < threadNumber; i++) {

    ScanMethod2 scanMethod2 = new ScanMethod2(ip, portSet,

    threadNumber, i, timeout);

    threadPool.execute(scanMethod2);

    }

    threadPool.shutdown();

    while (true) {

    if (threadPool.isTerminated()) {

    System.out.println("扫描结束");

    break;

    }

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33/**

    * 多线程扫描目标主机指定Set端口集合的开放情况

    *

    * @param ip

    *            待扫描IP或域名,eg:180.97.161.184 www.zifangsky.cn

    * @param portSet

    *            待扫描的端口的Set集合

    * @param threadNumber

    *            线程数

    * @param timeout

    *            连接超时时间

    * */

    publicvoidscanLargePorts(Stringip,SetportSet,

    intthreadNumber,inttimeout){

    ExecutorServicethreadPool=Executors.newCachedThreadPool();

    for(inti=0;i

    ScanMethod2scanMethod2=newScanMethod2(ip,portSet,

    threadNumber,i,timeout);

    threadPool.execute(scanMethod2);

    }

    threadPool.shutdown();

    while(true){

    if(threadPool.isTerminated()){

    System.out.println("扫描结束");

    break;

    }

    try{

    Thread.sleep(1000);

    }catch(InterruptedExceptione){

    e.printStackTrace();

    }

    }

    }

    具体的线程内部类跟上面类似,代码如下:

    /**

    * 扫描方式二:针对一个待扫描的端口的Set集合进行扫描

    *

    * */

    private class ScanMethod2 implements Runnable {

    private String ip; // 目标IP

    private Set portSet; // 待扫描的端口的Set集合

    private int threadNumber, serial, timeout; // 线程数,这是第几个线程,超时时间

    public ScanMethod2(String ip, Set portSet, int threadNumber,

    int serial, int timeout) {

    this.ip = ip;

    this.portSet = portSet;

    this.threadNumber = threadNumber;

    this.serial = serial;

    this.timeout = timeout;

    }

    public void run() {

    int port = 0;

    Integer[] ports = portSet.toArray(new Integer[portSet.size()]); // Set转数组

    try {

    InetAddress address = InetAddress.getByName(ip);

    Socket socket;

    SocketAddress socketAddress;

    if (ports.length < 1)

    return;

    for (port = 0 + serial; port <= ports.length - 1; port += threadNumber) {

    socket = new Socket();

    socketAddress = new InetSocketAddress(address, ports[port]);

    try {

    socket.connect(socketAddress, timeout);

    socket.close();

    System.out.println("端口 " + ports[port] + " :开放");

    } catch (IOException e) {

    // System.out.println("端口 " + ports[port] + " :关闭");

    }

    }

    } catch (UnknownHostException e) {

    e.printStackTrace();

    }

    }

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45/**

    * 扫描方式二:针对一个待扫描的端口的Set集合进行扫描

    *

    * */

    privateclassScanMethod2implementsRunnable{

    privateStringip;// 目标IP

    privateSetportSet;// 待扫描的端口的Set集合

    privateintthreadNumber,serial,timeout;// 线程数,这是第几个线程,超时时间

    publicScanMethod2(Stringip,SetportSet,intthreadNumber,

    intserial,inttimeout){

    this.ip=ip;

    this.portSet=portSet;

    this.threadNumber=threadNumber;

    this.serial=serial;

    this.timeout=timeout;

    }

    publicvoidrun(){

    intport=0;

    Integer[]ports=portSet.toArray(newInteger[portSet.size()]);// Set转数组

    try{

    InetAddressaddress=InetAddress.getByName(ip);

    Socketsocket;

    SocketAddresssocketAddress;

    if(ports.length<1)

    return;

    for(port=0+serial;port<=ports.length-1;port+=threadNumber){

    socket=newSocket();

    socketAddress=newInetSocketAddress(address,ports[port]);

    try{

    socket.connect(socketAddress,timeout);

    socket.close();

    System.out.println("端口 "+ports[port]+" :开放");

    }catch(IOExceptione){

    // System.out.println("端口 " + ports[port] + " :关闭");

    }

    }

    }catch(UnknownHostExceptione){

    e.printStackTrace();

    }

    }

    }

    四两种扫描方式的测试用例

    public static void main(String[] args) {

    PortScanDemo portScanDemo = new PortScanDemo();

    //方式1

    // portScanDemo.scanLargePorts("ultra-book.co", 20, 10000, 5,800);

    // portScanDemo.scanLargePorts("180.97.161.184", 1, 100, 5);

    //方式2

    Set portSet = new LinkedHashSet();

    Integer[] ports = new Integer[] { 21, 22, 23, 25, 26, 69, 80, 110, 143,

    443, 465, 995, 1080, 1158, 1433, 1521, 2100, 3128, 3306, 3389,

    7001, 8080, 8081, 9080, 9090,43958};

    portSet.addAll(Arrays.asList(ports));

    portScanDemo.scanLargePorts("ultra-book.co", portSet, 5, 800);

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15publicstaticvoidmain(String[]args){

    PortScanDemoportScanDemo=newPortScanDemo();

    //方式1

    // portScanDemo.scanLargePorts("ultra-book.co", 20, 10000, 5,800);

    // portScanDemo.scanLargePorts("180.97.161.184", 1, 100, 5);

    //方式2

    SetportSet=newLinkedHashSet();

    Integer[]ports=newInteger[]{21,22,23,25,26,69,80,110,143,

    443,465,995,1080,1158,1433,1521,2100,3128,3306,3389,

    7001,8080,8081,9080,9090,43958};

    portSet.addAll(Arrays.asList(ports));

    portScanDemo.scanLargePorts("ultra-book.co",portSet,5,800);

    }

    五测试结果

    9a4b19b2bbfa1e14b9f2135af79269b5.gif

    9a4b19b2bbfa1e14b9f2135af79269b5.gif

    注:1 超时时间是以毫秒为单位,其中要是扫描国内的IP可以把这个时间适当设置低一点,200~500左右。相反,要是扫描国外IP就需要把这个时间适当设置大一点,不然有可能把本来打开的端口也漏掉了

    展开全文
  • 自己制作的JAVA制作的多线程的可用端口扫描。运用了java的swing组件,利用多线程加快扫描速度。功能:获得本地IP,扫描可用端口。 含有两个文件,(main)主类文件,线程类文件。
  • Java多线程编写高效端口扫描器

    千次阅读 热门讨论 2017-10-12 23:22:48
    期末课程设计时想了很久也没有想到要编写个什么,刚好那段时间比特币病毒爆发,很高校的毕业生的毕业设计,毕业论文等不幸丢失,这时很多人认识到了电脑端口的重要性,于是我也有了想法,想要编写一个端口扫描器。...
  • 多线程端口扫描实现(C语言)源码:#include #include #include #include #include #pragma comment(lib,"WS2_32.lib")DWORD WINAPI ScanThread (LPVOID port);int main (int argc, char* argv[]){WSADATA wsd;int ...
  • 河马多线程扫描器,非常好用的端口扫描器
  • C# 多线程 端口 扫描器 使用VS2008编写的,简易的端口扫描器 可以对某个IP扫描指定范围的端口
  • 文章目录一、单线程与多线程的区别二、端口扫描程序设计1. 创建项目2. 界面设计3. 单线程代码4. 多线程代码三、端口扫描程序运行效果1. 单线程2. 多线程四、参考 一、单线程与多线程的区别 单线程: 每个正在运行的...
  • 用python实现多线程端口扫描

    千次阅读 2018-03-29 19:26:47
    一个简易的TCP端口扫描器,使用python3实现。需求:扫描目标网站开放哪些端口号,将所有开放的端口号输出。分析:使用socket连接,如果连接成功,认为端口开放,如果连接失败,认为端口关闭(有可能端口开放但连接...
  • 基于java的多线程端口扫描器,该扫描器实现了按不同的方式进行端口扫描,同时支持端口范围和线程数的手动设定,并实现了扫描结构的保存功能
  • Windows下实现简单的多线程端口扫描

    千次阅读 2018-11-16 10:24:55
    Windows下C语言实现简单的多线程端口扫描 自己的另外一个blog,懒得再写一遍了!
  • 文章目录程序适应环境与基本介绍 程序适应环境与基本介绍 情况:开2000个线程,扫描主机上开启的端口扫描时间40秒左右。...多线程中临界区资源要加锁。 编程环境:vs2008(c98) 代码如下: #i...
  • 多线程端口扫描器源代码
  • Java实现端口扫描器

    千次阅读 2021-11-09 08:52:48
    通过Java实现一个端口扫描器 原理介绍 端口扫描顾名思义,就是扫描目的资源的端口,来发现目的资源是否对外开放某个端口,提供了某种网络服务。 在安全攻防领域经常通过端口扫描技术来发现关键资产对外提供服务的...
  • 多线程端口扫描程序设计,现在网络安全,端口扫描器实现很普遍了,今天晒晒自己写的扫描器,多多提意见、
  • 本文实例为大家分享了python实现端口扫描的具体代码,供大家参考,具体内容如下今天老师上课说的内容,使用多线程+socket写一个端口扫描器写的些许潦草,也没注释,不过问题不大,应该都能看懂多线程+queue真的nice...
  • 设计通过端口扫描器的研究来提高对计算机安全的认识。利用TCPconnect扫描原理,扫描主机通过TCP/IP协议的三次握手与目标主机的指定端口建立一次完整的连接,如果目标主机该端口有回复,则说明该端口开放。利用...
  • 端口扫描器

    2019-04-29 23:40:40
    多线程端口扫描器,多线程软件,扫描速度极快。。
  • 端口扫描器能够准确扫描出存活主机的开放端口,并且还能够扫描指定的常见几个端口,该软件采用了多线程技术,从而能够更加快速的扫描出存活主机的开放端口
  • 声明:本脚本仅用于学习交流,请勿用于非法途径,造成的任何后果与本人无关使用三方库.../usr/bin/python# -*- coding: UTF-8 -*-'''多线程目录扫描器作者:木尤声明:本脚本仅用于学习交流,请勿用于非法途径,造成...
  • PAGE主机端口扫描程序设计摘 要计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。...
  • 最近想写一个自己的端口扫描器,主要为了方便扫描“自定义”端口,上网找了一下没找到现成的代码,自己就写了个测试代码。主要实现了:对指定IP进行扫描,自定义线程数,设置扫描端口的范围。以下程序没有多余的代码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,622
精华内容 11,048
关键字:

多线程端口扫描器的实现设计