#!/usr/bin/python3
importthreadingimporttimeimportsocketdef 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()returnbannerexcept:pass
def checkbanner(banner):#检查banner信息
if ("2.3.4" inbanner):print ("banner信息:")print(banner)else:print ("banner信息无价值")
threadLock= threading.Lock() #锁对象:threading.Lock
threads = [] #线程列表
threads_num =0print("**************************************")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] =ielse:
exit()defThread_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)ifbanner1:
checkbanner(banner1)else:print(">>>线程: {} 记录任务结果:没有获得banner信息".format(Thread_name))exceptException as e:print (">>>线程: {} 扫描错误:{}".format(Thread_name,e))print ("--------------------开始扫描--------------------")if(select != 2):for n inrange(0,port_num):
q= (n % threads_num)+1Thread_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 inthreads:
t.join()print ("--------------------扫描完成--------------------")