#!/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 ("--------------------扫描完成--------------------")