主机系统扫描程序设计

1、相关原理、技术分析

    1.1、网络端口扫描的定义
       网络端口扫描是一种探测远程或本地主机安全弱点的方法。使用网络端口扫描,可以对目标主机的端口进行扫描,探察到各个端口的服务信息以及各个端口所具有的版本号等,进而间接或直观的了解到目标主机所存在的安全问题。
    1.2、端口扫描技术的原理
      1、向目标主机的TCP/IP服务端口发送探测数据包,记录目标主机的响应。
      2、分析响应,判断服务端口是打开还是关闭,得知端口提供的服务或信息。
    端口扫描也可以通过捕获本地主机或服务器的流入流出IP数据包对本地主机的运行情况进行监视,查找内在弱点。
    1.3、端口扫描技术的发展
       如今各种端口扫描的软件层出不穷,大多利用向规定范围内的常用端口逐个发送并返还数据包的方式对端口进行探测,进而发现端口的运行状态,然后根据扫描结果对网络的数据进行分析,来获得目标机器的很多有用信息,有效的理解和使用端口扫描的原理和技术,能够为网络环境带来重要的防御作用。

2、设计思路、算法描述

    编写一个主机系统扫描程序,可以获取主机的网络信息,系统信息,端口信息。
    创建一个新线程,用socket网络编程连接目标主机,判断服务器端口是否打开,如果服务端口打开,输出端口号,否则不输出,因为它端口未开放,打印出来没有意义。

主机扫码程序的流程图

       进入扫描端口程序,第一步输入主机的IP地址,第二步输入所要扫描端口的范围,点击开始扫描,下面就会出现开放的端口号,点击暂停扫描就会停止,你再点击开始扫描会继续扫描,直到把这个范围内的所有端口扫描完成。

3、详细实现(代码稍加改动)

from tkinter import *
import socket, re
import threading
import time
import queue
import tkinter.messagebox as msgbox
from tkinter.filedialog import askopenfilename
 
class MyGui():
    #初始化参数
    def __init__(self, init_window_name):
        self.init_window_name = init_window_name
 
    def set_init_window(self):
        self.k = 0
        #初始化窗口
        self.init_window_name.title("主机端口扫描器")
        self.window_center(400, 520)
         #固定窗口,禁止放大缩小
        self.init_window_name.resizable(0,0)   
        
        # 定义区域,把全局分为上中下部分
        self.frame_top = Frame(self.init_window_name, width=400, height=200)
        self.frame_center = Frame(self.init_window_name, width=400, height=300)
        self.frame_foot = Frame(self.init_window_name, width=400, height=10)
        self.frame_top.grid(row=0, column=0)
        self.frame_center.grid(row=1, column=0)
        self.frame_foot.grid(row=2, column=0, pady="20")
 
        # 上部分布局
        self.ip_lb_top = Label(self.frame_top, text="IP地址", font="楷体")
        self.port_lb_top = Label(self.frame_top, text="端口范围", font="楷体")
        #将要输入的ip和端口范围存入
        self.ip_input = StringVar()
        self.port_input = StringVar()
        self.ip_input.set('例如:127.0.0.1')
        self.port_input.set('例如:1-65535')
        self.ip_content = Entry(self.frame_top, textvariable=self.ip_input, font="楷体")
        self.port_content = Entry(self.frame_top, textvariable=self.port_input, font="楷体")
        self.PortScan = Button(self.frame_top, text="开始扫描", command=self.runing, font="楷体")
        self.StopScan = Button(self.frame_top, text="停止扫描", command=self.stop, font="楷体",fg='red')
 
        #用坐标定位,设置布局
        self.ip_lb_top.place(x=30, y=20)
        self.ip_content.place(x=105, y=20)
        self.port_lb_top.place(x=13, y=60)
        self.port_content.place(x=105, y=60)
        self.PortScan.place(x=32, y=110)
        self.StopScan.place(x=190, y=110)
 
        # 中间部分布局
        self.porttext = Text(self.frame_center, width=41, height=18,font="楷体",fg='blue')
        self.scroll = Scrollbar(self.frame_center)
        self.scroll.pack(side=RIGHT, fill=Y)
        self.porttext.pack(side=RIGHT, fill=Y)
        self.scroll.config(command=self.porttext.yview)
        self.porttext.config(yscrollcommand=self.scroll.set)
 
        # 下部分布局
 
    # 窗口居中
    def window_center(self, width, height):
        screenwidth = self.init_window_name.winfo_screenwidth()
        screenheight = self.init_window_name.winfo_screenheight()
        size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
        self.init_window_name.geometry(size)
 
    # 获取当前时间
    def get_current_time(self):
        current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
        return current_time

    #进程对象
    class MyThread(threading.Thread):
        def __init__(self, func, *args):
            super().__init__()
 
            self.func = func
            self.args = args
 
            self.setDaemon(True)
            self.start()  # 在这里开始
 
        def run(self):
            self.func(*self.args)
 
    def intofile(self):
        filenameReading = askopenfilename()
        infile = open(filenameReading, 'r')
        self.porttext.delete(1.0, END)
        self.porttext.insert(END, infile.read())
        infile.close()
 
    def stop(self):
 
            if self.k == 0:
                msgbox.showinfo(title='提示', message='扫描未开始 或 已停止')
 
            else:
                self.k = 0
                self.porttext.insert(END, '\n' + '扫描已暂停......')

    #错误提示
    def runing(self):
        self.k = 1
        self.porttext.delete(1.0, END)
 
        if re.match(r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", self.ip_content.get()):
            self.ip = self.ip_content.get()
        else:
            msgbox.showerror(title="Error", message="ip格式错误或不合法,请重新输入")
            return
 
        if re.match(r"^(?:[0-9]{1,5}-){1}[0-9]{1,5}$", self.port_content.get()):
            ports = self.port_content.get()
        else:
            msgbox.showerror(title="Error", message="端口范围·格式错误,格式为:xxx-xxx")
            return
 
        ports = ports.split('-')
        startport = ports[0]
        endport = ports[1]
        p=0
 
        #打印当前时间,扫描的主机ip和端口范围
        self.porttext.insert(END, "当前时间为: "+self.get_current_time()+"\nIP地址:"+self.ip+"\n端口范围:"+self.port_content.get()+"\n\n扫描结果\n\n")
        self.portslist = list(range(int(startport), int(endport) + 1))
        port_queue = queue.Queue()
        for port in self.portslist:
            port_queue.put(port)
            p+=1
 
        for i in range(0, 3000):
            self.MyThread(self.scan, port_queue)
        if p==int(endport):
            self.porttext.insert(END, '耗时:'+'\n')
 
    def scan(self, port_queue):
        while self.k == 1:
            if port_queue.empty():
                break
 
            port = port_queue.get()
            timeout = 3
            s = socket.socket()
            s.settimeout(timeout)
            #打印开放的端口号
            try:
                s.connect((self.ip, port))
                string = " 开放的端口:" + str(port) + "\n"
                self.porttext.insert(END, string)
                self.porttext.see(END)
            except Exception as e:
                pass
            finally:
                #关闭套接字
                s.close()
 
 
 
if __name__ == "__main__":
    pygui=Tk()
    init_window = MyGui(pygui)
    init_window.set_init_window()
    pygui.mainloop()

4、程序测试、结果分析 

运行程序,点击运行,会进入主机端口扫描器的主界面

 输入要扫码的IP地址和端口范围

本次扫码是我的本机,端口范围:1-4000,结果如下:

      其中第一个开放的端口:135,开放服务为用于远程的打开对方的telnet服务 ,用于启动与远程计算机的 RPC 连接。

     第二个开放的端口:443,开放的服务为HTTPS,提供加密和通过安全端口传输的另一种HTTP。

     第三个开放的端口:445,开放的服务为TCP端口,主要提供局域网中的文件或打印机共享服务。

     最后一个开放端口:3306,开放的服务为MySql数据库系统服务。

 5、总结

     1、该程序扫描结束,没有一个提示,不知道具体什么时间结束,但可以通过扫描出的端口号的大小来判断大概位置。

    2、本机开放端口:135,很容易被人入侵电脑,带来损失。

    3、像20,21,80,443,3306这样常用的开放端口。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 系统端口扫描网络安全相关领域内的一个比较重要的技术,其作用是对计算机系统进行全面的检测,从而发现系统中可能存在的漏洞或安全隐患。本文将介绍我所设计的一款系统端口扫描程序,它是基于Java语言开发的,具有高效、可靠的特点。 首先,我的程序可以快速、准确地扫描指定IP地址的端口,并生成端口号和端口状态的报告。程序的主要功能包括三个方面:扫描单个端口、扫描一段端口范围、扫描所有端口。用户可以根据自己的需要来选择相应的功能。同时,程序支持多线程的方式进行扫描,从而提高了扫描效率。 其次,我的程序针对常见的网络攻击方式进行了优化,比如SYN Flood等攻击方式。程序能够自动识别这些攻击方式并及时报警,从而避免了系统遭受攻击。 最后,我的程序考虑到了用户友好性的因素,采用了简洁明了的界面,同时提供了详细的用户帮助文档,从而方便了用户的操作。 总之,我的系统端口扫描程序设计了一套完备的解决方案,具有高效、可靠、安全、易用等多方面的优点,适用于各种规模的网络系统,可以为用户提供全面的安全保障。 ### 回答2: 系统端口扫描课程设计 Java 系统端口扫描是计算机网络中重要的操作,也是网络安全领域中的必备技能之一。本文将介绍如何使用 Java 编程语言来实现一个简单的系统端口扫描程序。 简介 端口是计算机系统网络通讯中最基本的单位,它负责建立网络连接、传输数据等功能。常用的计算机端口有 0~65535 个,其中 1~1023 个是被默认分配为标准端口使用。通过扫描端口,我们可以了解到目标主机上运行着哪些服务,从而更有针对性的进行安全检查。 实现步骤 1. 定义端口列表 首先我们需要定义一张端口列表,包含了我们要扫描的所有端口。可以使用 Java 中的数组来实现,示例代码如下: ```java int[] portList = {21, 22, 23, 25, 53, 80, 110, 143, 443, 3306}; ``` 2. 遍历端口列表 定义好端口列表之后,我们需要遍历列表中的所有端口,并检查这些端口是否处于开放状态。可以使用 Java 中的 for 循环来遍历端口列表,代码示例如下: ```java for (int port : portList) { //检查端口状态 } ``` 3. 检查端口状态 在遍历端口列表的同时,我们需要检查每个端口的开放状态。可以使用 Java 的 Socket 类来实现。代码示例如下: ```java Socket socket = null; try { socket = new Socket(host, port); //端口开放 } catch (IOException e) { //端口关闭 } finally { if (socket != null) { try { socket.close(); } catch (IOException e) {} } } ``` 在代码中,我们首先尝试连接目标主机的指定端口,如果连接成功,则说明该端口处于开放状态;如果连接失败,则说明该端口处于关闭状态。 4. 整合代码 将以上三步操作整合起来,即可实现一个简单的系统端口扫描程序。代码示例如下: ```java import java.io.IOException; import java.net.Socket; public class PortScanner { public static void main(String[] args) { //目标主机 IP String host = "localhost"; //端口列表 int[] portList = {21, 22, 23, 25, 53, 80, 110, 143, 443, 3306}; //遍历端口列表,检查端口状态 for (int port : portList) { Socket socket = null; try { socket = new Socket(host, port); //端口开放 System.out.println(port + " open"); } catch (IOException e) { //端口关闭 System.out.println(port + " closed"); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) {} } } } } } ``` 总结 通过以上简单的代码实现,我们可以自己编写一个系统端口扫描程序。当然,在实际的安全检查中,通常需要更加完善和专业的工具来完成复杂的操作。希望读者在学习完本文之后,能够对系统端口扫描有更加深入的了解。 ### 回答3: 系统端口扫描网络安全领域非常重要的一个主题,它能够帮助我们发现网络系统是否存在安全漏洞,进而采取相应措施进行加固。为了学习和深入理解系统端口扫描的原理和过程,我进行了一个课程设计,使用Java语言进行编写。 首先,我定义了一个TCP端口扫描的接口,里面包括了一些方法,例如设置扫描主机IP地址、定义扫描的端口范围、启动扫描等。然后使用Java的多线程机制,实现了并发的端口扫描,加快了扫描的速度。 在代码的实现过程中,定义了一个Socket对象,用于与主机建立连接,通过检测是否抛出异常来判断是否开放了该端口。同时,为了提高扫描的效率,设置了超时时间,当连接的时间超过超时时间时,会自动断开连接。 除此之外,还实现了一个简单的用户界面,让用户可以进行设置扫描的目标主机和端口范围,同时还能够实时显示扫描的进度和结果。为了方便用户对扫描结果的分析,还将结果以表格形式进行展示,包括IP地址、开放的端口号等信息。 综上所述,我的系统端口扫描课程设计使用了Java语言进行编写,实现了TCP端口的扫描,并通过多线程和超时机制提高了扫描的效率。同时,用户界面设计也使得用户可以方便地进行操作和分析结果。这个课程设计的编写过程不仅增强了我的Java编程能力,也提高了我的网络和安全方面的知识水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值