1. 程式人生 > 其它 >利用多執行緒實現埠掃描

利用多執行緒實現埠掃描

  實現步驟:

    1. 列印程式版本資訊

    2. 解析輸入引數,並對引數進行合法性判斷,包括有無正常輸入,以及輸入的字串是否為IP地址(利用ipaddress第三方模組)

    3. 例項化PortScanner類,並執行其scan方法,在方法中運用了多執行緒以及queue模組,用於實現不同執行緒之間的變數傳遞

import sys
import socket
import threading
import queue
import optparse
import ipaddress


"""
    Step 1 Banner
    Step 2 Get parameters
    Step 3 Initialize instance of PortScanner Class
    Step 4 Execute function of scan
"""

def banner():
    banner = """
        ******************************************************************
        ******************************************************************
                           PortScanner by Jason Wong V1.0
        ******************************************************************
        ******************************************************************
    """
    print(banner)

def judge_validity_ip(ip):
    try:
        ipaddress.ip_address(ip)
        return True

    except:
        return False

def get_target_info():
    parser = optparse.OptionParser('Usage: <Program> -H <target host>')
    parser.add_option('-H','--host',dest='host', type='string', help='Specify IP address of target')
    options, args = parser.parse_args()
    if options.host is None:
        print(parser.usage)
        sys.exit(0)
    host = options.host
    if not judge_validity_ip(host):
        print("Enter right IP address!")
        sys.exit(0)
    return host

class PortScanner:
    def __init__(self, target):
        self.target = target
        self.q = queue.Queue()
    
    def scanner(self, port):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        socket.setdefaulttimeout(1)
        try:
            s.connect((self.target, port))
            res = s.recv(1024).decode('utf-8')
            
            self.q.put((port,res))
        except:
            pass


    
    def scan(self):
        print("Scanned results for the target %s \n" % self.target)
        for port in range(1,65535):
            t = threading.Thread(target=self.scanner, args=(port,))
            t.start()
        while not self.q.empty():
            port, res = self.q.get()
            print("Port is open %d %s" %(port, res))

if __name__ == "__main__":
    banner()
    target_ip = get_target_info()
    portscanner = PortScanner(target_ip)
    portscanner.scan()