网络端口扫描器 python && c++
介绍:输入端口号进行扫描,支持多线程,支持特定端口扫描或全端口扫描。
分别采用了 python和c++进行编写。
<1>#python Windows平台
#!/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 ("--------------------扫描完成--------------------")
<2>#c++ Windows平台
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Winsock.h>
#pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll
char Thread_name[8]="Thread-";
int yes;
FILE *tp;
struct RECVPAPAM{
int port_num;
char *S_addr;
int i;
};
HANDLE hMutex; //互斥对象的句柄
RECVPAPAM *pRecvParam = new RECVPAPAM;
CRITICAL_SECTION g_cs; //定义一个关键区域结构体指针
DWORD WINAPI FunxProc(LPVOID ipParameter){
//线程数,端口,ip,某一个单线程的工作。
// AF_INET:地址族 , SOCK_STREAM:套接字类型 , 0 传输协议
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); //创建用于监听的套接字
int i = pRecvParam->i;
int port_num = pRecvParam->port_num;
SOCKADDR_IN addrSrv;
memset(&addrSrv, 0, sizeof(addrSrv)); //每个字节都用0填充
addrSrv.sin_family = AF_INET; //使用IPv4地址
addrSrv.sin_addr.S_un.S_addr = inet_addr(pRecvParam->S_addr); //具体的IP地址
addrSrv.sin_port = htons(port_num); //端口
EnterCriticalSection(&g_cs); //关键代码段
Sleep(1); //关键代码段&&互斥对象
printf(">>>---------------线程:%s%d开始扫描----------------------------\n",Thread_name,i+1);
printf(">>>线程:%s%d执行:记录开始任务:正在扫描端口号:%d\n",Thread_name,i+1,port_num);
if(connect(sockClient,(SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == SOCKET_ERROR){
printf(">>>连接失败,结束此次连接\n");
printf(" 记录结束任务:扫描端口号:%d失败\n",port_num);
printf(">>>--------------------结束扫描----------------------------\n");
closesocket(sockClient); //关闭套接字
WSACleanup();
return 0;
}
else{
printf(">>>连接成功正在获取信息\n");
char recvBuf[100]; //用于存放数据
recv(sockClient,recvBuf, 100, 0); // 接受数据
printf("扫描端口号:%d,获得信息:%s\n",port_num,recvBuf); //输出接收的数据
printf(" 记录结束任务:己扫描端口号:%d\n",port_num);
printf(">>>--------------线程:%s结束扫描----------------------------\n",Thread_name);
closesocket(sockClient); //关闭套接字
WSACleanup(); //终止 DLL 的使用
// ReleaseMutex(hMutex); //互斥对象
LeaveCriticalSection(&g_cs); //关键代码段
if(yes == 'y' || yes == 'Y'){
for(i=0;recvBuf[i] != 0;i++) {
fseek(tp,i*sizeof(recvBuf[i]),0);
fread(&recvBuf[i],sizeof(recvBuf[i]),1,tp)