1. 程式人生 > 程式設計 >python實現多執行緒埠掃描

python實現多執行緒埠掃描

一個簡易的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]

總結:這個小程式僅適用於新手練習,不適合真正應用。該簡易埠掃描器僅能掃描出一部分埠,有些埠可能因為防火牆攔截導致掃描失敗。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。