python学习----端口扫描器(GUI多线程)续。。。

转载:Python Tkinter学习之端口扫描器的编写_A_dmin的博客-CSDN博客Python Tkinter学习这其实是个作业,要求我们使用python GUI界面做一个端口扫描不过tk之前一直没有接触过,所以记录一下!图形化界面编写先把图形化界面编写完成:from tkinter import *import socketimport threadingimport timeimport queueimport tkinter.messagebox as msgboxclass MyGui(): def __init__(self, init_windhttps://blog.csdn.net/qq_42967398/article/details/106637924?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~default-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~default-3.no_search_link

在原作者之上做了一点修改

代码:

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("端口扫描器 v1.1  Change By Lan")
        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="楷体")
        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.importfile = Button(self.frame_top, text="批量导入", command=self.intofile, font="楷体",fg='blue')

        self.ip_lb_top.place(x=30, y=20)
        self.ip_content.place(x=105, y=20)
        self.port_lb_top.place(x=30, 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.importfile.place(x=285, y=18)


        # 中间部分布局
        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):
        msgbox.showinfo(title='提示', message='作者很懒,还没开发好!')
        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


        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 = "Port " + str(port) + " is OPEN\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()

成品:

最后附上安全渗透扫描  专用的端口扫描工具:

御剑高速端口扫描工具betahttps://www.aliyundrive.com/s/fXSkSMGLgQg

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值