用Python编写的网络端口扫描器(可运行),注释易慬。

#!/usr/bin/python3
import threading
import time
import socket

def getbanner(IP,port): #获得banner信息
    socket.setdefaulttimeout(2)
    s=socket.socket()
    try:
        s.connect((IP,port))
        threadLock.acquire()
        banner=s.recv(1024)
        threadLock.release()
        s.close()
        return banner
    except:
        pass

def checkbanner(banner):#检查banner信息
    if ("2.3.4" in banner):
        print (" banner信息:")
        print (banner)
    else:
        print ("banner信息无价值")

threadLock = threading.Lock() #锁对象:threading.Lock
threads = [] #线程列表
threads_num = 0

print("**************************************")
print("*        欢迎使用网络端口扫描器      *")
print("*           1.特定端口扫描           *")
print("*           2.全端口扫描             *")
print("*           0.退出                   *") 
print("**************************************")
select = float(input("请选择功能:"))


if select == 1:
    threads_num = int(input("请输入你要创建线程的数量:")) #线程数
    port_num = int(input("请输入要扫描的端口数量:")) #端口数
    threads_ip = input("要扫描端口号所对应的ip(格式:'ip'):")#目标Ip ip='127.0.0.1'
    port_nums = [0 for i in range(port_num + 1)] #一个用来放端口号的数组
    for i in range(port_num): #循环放入端口号
        port_nums[i + 1] = input("请输入要扫描的端口号:")

elif select == 2:
    threads_num = 76 #线程数
    port_num = 76*880 #端口数
    threads_ip = input("要扫描端口号所对应的ip(格式:'ip'):")#目标Ip ip='127.0.0.1'
    port_nums = [0 for i in range(port_num + 1)] #一个用来放端口号的数组
    for i in range(port_num): #循环放入端口号
        port_nums[i] = i
else:
    exit() 

def Thread_function(Thread_name,i):
    if (i <= port_num): 
        port =  port_nums[ i ]    #输入连接端口号
    print(">>>线程: %s 开始执行 记录时间:%s" % (Thread_name, time.ctime(time.time()))) #输出线程信息
    try: 
        print(">>>线程: {} 记录任务:正在扫描的端口号:{},端口号所对应的ip:{}".format(Thread_name,int(port) ,threads_ip)) 
        IP = threads_ip
        banner1=getbanner(IP,port)
        if banner1:
            checkbanner(banner1)
        else:
            print(">>>线程: {} 记录任务结果:没有获得banner信息".format(Thread_name))
    except Exception as e: 
        print (">>>线程: {} 扫描错误:{}".format(Thread_name,e))

print ("--------------------开始扫描--------------------")

if(select != 2):
    for n in range(0,port_num):
        q = (n % threads_num)+1   
        Thread_name = "Thread-"+str(q)
        port = port_nums[n + 1] 
        thread_x = threading.Thread(target = Thread_function,args = (Thread_name,n+1)) # 创建新线程
        threads.append(thread_x) # 添加 线程 到 线程列表
        thread_x.start() # 开启新线程,开始运行threading.Thread.run方法
else:
    for n in range(1,threads_num):
        Thread_name = "Thread-"+str(n)
        for p in range((n-1)*880,n*880): # 全端口扫描
            thread_x = threading.Thread(target = Thread_function,args = (Thread_name,p)) # 创建新线程
            threads.append(thread_x) # 添加 线程 到 线程列表
            thread_x.start() # 开启新线程,开始运行threading.Thread.run方法

# 等待所有线程完成
for t in threads:
    t.join() 

print ("--------------------扫描完成--------------------")

 

posted @ 2020-07-17 19:04  id17  阅读(114)  评论(0)    收藏  举报