• Python端口扫描器


    import sys
    import re
    import socket
    import time
    import inspect
    import ctypes
    import threading
    from PyQt4 import QtCore,QtGui,uic
    from PyQt4.QtCore import QObject
    from PyQt4.QtCore import pyqtSignal
    from PyQt4.QtCore import pyqtSlot
    from PyQt4.QtGui import QTableView
    from PyQt4.QtGui import QStandardItemModel
    from PyQt4.QtGui import QStandardItem
    
    qtCreatorFile="MainForm.ui"
    Ui_MainWindow,QtBaseClass=uic.loadUiType(qtCreatorFile)
    
    portLock=threading.Lock()
    ipLock=threading.Lock()
    flagLock=threading.Lock()
    tableViewLock=threading.Lock()
    mutex=threading.Lock()
    now_Port= 0
    nowip=0# thread scan now ip
    row=0
    sta_Ip=""
    end_Ip=""
    Changeip=False
    sta_Port=0
    end_Port=0
    threadNum=0
    threads=[]
    ipr=[]#have three params,staipnum,endidnum,iprange
    processbar=QtGui.QProgressBar
    model=QStandardItemModel()
    
    
    class Scanner:
        def __init__(self):
            pass
        def scanPort(self):
            pass
    
    
    class MyApp(QtGui.QMainWindow,Ui_MainWindow):
        def __init__(self):
            QtGui.QMainWindow.__init__(self)
            Ui_MainWindow.__init__(self)
            self.setupUi(self)
            self.pauBtn.setVisible(False)
            global model,processbar
            processbar=self.progressBar
            self.result.setModel(model);
            self.staBtn.clicked.connect(self.ThreadScan)
            self.staIp.textChanged.connect(self.setEndIp)
            self.pauBtn.clicked.connect(self.changeState)
            self.stopBtn.clicked.connect(self.stopThread)
    
        @pyqtSlot(int)
        def setprocessbar(self,percent):
            self.progressBar.setValue(percent)
        @pyqtSlot(str)
        def nowip(self,ip):
            self.curip.setText(ip)
        def changeState(self):
            if self.pauBtn.text()=="PAUSE":
                mutex.acquire()
                self.pauBtn.setText("RESUME")
                return 0
            if self.pauBtn.text()=="RESUME":
                mutex.release()
                self.pauBtn.setText("PAUSE")
                return 0
        def stopThread(self):
            if len(threads)>0:
                for thread in threads:
                    thread.stop()
                try:
                    del threads[:]
                except :
                    print "unknow error!"
            try:
                global end_Port
                processbar.setValue(end_Port)
            except:
                pass
            self.pauBtn.setVisible(False)
        def getContext(self):
            global sta_Ip,end_Ip,sta_Port,end_Port,threadNum,processbar
            sta_Ip=self.staIp.text()
            end_Ip=self.endIp.text()
            sta_Port=self.staPort.value()
            end_Port=self.endPort.value()
            threadNum=self.threadNum.value()
            processbar.setRange(sta_Port,end_Port)
            processbar.setValue(sta_Port)
    
        def setEndIp(self):
            self.endIp.setText(self.staIp.text())
        def checkip(self):
            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.staIp.text()) and 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.endIp.text()):
                print "IP vaild"
                return True
            else:
                print "IP invaild"
                self.staIp.setText("IP invaild,please check it")
                return False
        def beforstart(self):
            global sta_Ip, end_Ip, ipr, row
            self.ipcheck = self.checkip()
            if not self.ipcheck:
                return 0
            self.getContext()
            # get the iprange,save in ipr
            ipr = iprange(sta_Ip, end_Ip)
            # print len(ipr),ipr
            # return
            row = 0
            model.clear()
            model.setItem(row, 0, QStandardItem("now scan ip:"))
            model.setItem(row, 1, QStandardItem(sta_Ip))
            row = row + 1
            self.pauBtn.setVisible(True)
            if len(threads):
                del threads[:]
            global now_Port, sta_Port, threadNum, nowip, Changeip
            now_Port = sta_Port
            nowip = ipr[0]
            self.curip.setText(sta_Ip)
        def ThreadScan(self):
            self.beforstart()
            for i in range(0,threadNum,1):
                tmp_scan=myThread()
                tmp_scan.setBar.connect(self.setprocessbar)
                tmp_scan.setIp.connect(self.nowip)
                tmp_scan.setDaemon(True)
                threads.append(tmp_scan)
            print len(threads)
            for thread in threads:
                thread.start()
    class myThread (threading.Thread,QObject):
    
        setBar=pyqtSignal(int)
        setIp=pyqtSignal(str)
        def __init__(self):
            threading.Thread.__init__(self)
            QObject.__init__(self)
            self.tmpPort=0
            self.stopped=False
        def run(self):
            #print "run"
            global now_Port,end_Port,sta_Port,row,sta_Ip,processbar,nowip,Changeip
            while(not self.stopped):
                mutex.acquire()
                self.tmpPort = now_Port
                self.setBar.emit(self.tmpPort)
                now_Port = now_Port + 1
                print nowip, "---", now_Port
    
                if now_Port > end_Port or nowip>ipr[1]:
                    if nowip>ipr[1]:
                        #tableViewLock.acquire()
                        self.setBar.emit(end_Port)
                        mutex.release()
    
                        #tableViewLock.release()
                        break
                    else:
                        #ipLock.acquire()
                        nowip=nowip+1
                        sta_Ip=num2ip(nowip)
                        self.setIp.emit(sta_Ip)
                        #tableViewLock.acquire()
                        model.setItem(row,0,QStandardItem("now scan ip:"))
                        model.setItem(row,1,QStandardItem(sta_Ip))
                        row=row+1
                        #time.sleep(0.2)
                        #portLock.acquire()
                        now_Port=sta_Port
                        print sta_Ip,"<--->",now_Port
                        #portLock.release()
                        #tableViewLock.release()
                        #ipLock.release()
                mutex.release()
    
                try:
                    s = socket.socket()
                    s.settimeout(0.1)
                    s.connect((sta_Ip, self.tmpPort))
                    tableViewLock.acquire()
                    # print self.tmpPort,"open
    "
                    model.setItem(row, 0, QStandardItem(str(self.tmpPort)))
                    model.setItem(row, 1, QStandardItem("opened"))
                    row += 1
                    tableViewLock.release()
                except socket.error, e:
                    tableViewLock.acquire()
                    print self.tmpPort,"was not opened
    "
                    tableViewLock.release()
                    # pass
    
            self.stopped=False
        def stop(self):
            self.stopped=True
    
    
    def ip2num(ip):#ip to int num
        lp = [int(x) for x in ip.split('.')]
        return lp[0] << 24 | lp[1] << 16 | lp[2] << 8 | lp[3]
    
    
    def num2ip(num):# int num to ip
        ip = ['', '', '', '']
        ip[3] = (num & 0xff)
        ip[2] = (num & 0xff00) >> 8
        ip[1] = (num & 0xff0000) >> 16
        ip[0] = (num & 0xff000000) >> 24
        return '%s.%s.%s.%s' % (ip[0], ip[1], ip[2], ip[3])
    
    
    def iprange(ip1,ip2):
        # print ip1,ip2
        # return ip1, ip2, 3
        num1 = ip2num(ip1)
        num2 = ip2num(ip2)
    
        tmp = num2 - num1
        if tmp < 0:
            return None
        else:
            return num1, num2, tmp
    
    
    if "__main__" == __name__:
        app=QtGui.QApplication(sys.argv)
        window=MyApp()
        window.show()
    
    
        sys.exit(app.exec_())
    View Code

    字面意思,用python实现一个端口扫描器。

    画重点了:

    1 使用 pycharm+pyqt制作可视化的应用软件

    配置方法见:大神博客

    2 使用方法:

      用pyqtDesigner做好界面,使用如下代码进行调用。

      

    import sys
    from PyQt4 import QtGui
    
    from PyQt4 import uic
    
    qtCreatorFile="MainForm.ui"
    Ui_MainWindow,QtBaseClass=uic.loadUiType(qtCreatorFile)
    
    class MyApp(QtGui.QMainWindow,Ui_MainWindow):
        def __init__(self):
            QtGui.QMainWindow.__init__(self)
            Ui_MainWindow.__init__(self)
            self.setupUi(self)
    if "__main__" == __name__:
        app=QtGui.QApplication(sys.argv)
        window=MyApp()
        window.show()
    
    
        sys.exit(app.exec_())

    这是套路。暂时我还不知道界面切换等高级的使用方法。后期有机会在更新。

    补充一下:8012年了,突然要用pyqt做个界面,翻出这个博客,遇到一个新的问题:pip 安装的pyqt5没有下载qt的工具,也就是找不到designer.exe .解决方法:

      安装缺少的PyQt5 tools,可使用以下源:
    pip install PyQt5-tools -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com
      安装完成后,在./Python/Lib/site-packages/pyqt5-tools目录下可找到designer.exe,此后可在PyCharm中找到并添加designer.exe
    
    ---------------------
    
    本文来自 sinat_21427221 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/sinat_21427221/article/details/77448857?utm_source=copy 
  • 相关阅读:
    curl获取HTTP返回状态码
    存储过程中如何实现从数组获取数据
    ElasticsearchParseException: malformed, expected settings to start with 'object', instead was [VALUE_STRING]
    【并发编程】如果让你用三个线程循环打印ABC,你有几种写法?
    【基础】IdentityHashMap
    【基础】ThreadPoolExecutor
    【算法】快速排序
    【Java8新特性Stream】list转map
    【算法】华为南研所-括号匹配
    windows sourceTree 密码错误
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/6506023.html
Copyright © 2020-2023  润新知