利用多執行緒實現埠掃描
阿新 • • 發佈:2022-04-20
實現步驟:
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()