python實現多執行緒埠掃描
阿新 • • 發佈:2020-01-09
一個簡易的TCP埠掃描器,使用python3實現。
需求:掃描目標網站開放哪些埠號,將所有開放的埠號輸出。
分析:使用socket連線,如果連線成功,認為埠開放,如果連線失敗,認為埠關閉(有可能埠開放但連線失敗,這裡簡單認為埠不開放)
使用到的庫:socket,threading
過程:
先定義一個函式,對給定的(ip,port)進行掃描,看其是否能連線成功。
def tcpPortScan(ip,port,openPort): sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 建立套接字 sock.settimeout(0.1) # 設定延時時間 try: result = sock.connect_ex((ip,port)) if result == 0: # 如果連線成功,返回值為0 openPort.append(port) # 如果埠開放,就把埠port賦給openPort except: pass sock.close() # 關閉套接字
當需要掃描目標地址的多個埠時,迴圈使用上述函式的話,掃描速度會極其慢,因為考慮使用多執行緒。
再定義一個函式,實現多執行緒掃描。
def threadingPortScan(host,portList,openPorts = []): hostIP = socket.gethostbyname(host) # 獲取域名對應的IP地址 nloops = range(len(portList)) threads = [] for i in nloops: t = threading.Thread(target=tcpPortScan,args=(hostIP,portList[i],openPorts)) threads.append(t) for i in nloops: threads[i].start() for i in nloops: threads[i].join() return openPorts # 返回值為該域名下開放的埠列表
完整程式碼如下:
# -*- coding:utf-8 -*- ''' 使用多執行緒,檢測一個目標地址的埠開放情況,目標地址由使用者輸入,埠暫時定義為0~1024,檢測TCP連線是否成功,如果連線成功,則埠開放,不成功則埠關閉 ''' import socket import threading def main(): host = input('please input domain:') portList = range(0,1025) openPorts = threadingPortScan(host,portList) print(host,'open ports:',openPorts) # 對給定的(ip,port)進行TCP連線掃描 def tcpPortScan(ip,port)) if result == 0: openPort.append(port) # 如果埠開放,就把埠port賦給openPort except: pass sock.close() # 關閉套接字 def threadingPortScan(host,openPorts)) threads.append(t) for i in nloops: threads[i].start() for i in nloops: threads[i].join() return openPorts # 返回值為該域名下開放的埠列表 if __name__ == '__main__': main()
使用www.qq.com做一個測試,測試結果如下:
>>>please input domain: www.qq.com www.qq.com open ports: [80,843]
總結:這個小程式僅適用於新手練習,不適合真正應用。該簡易埠掃描器僅能掃描出一部分埠,有些埠可能因為防火牆攔截導致掃描失敗。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。