python 和 c++ 实现网络端口扫描器 含windows平台和Linux平台

网络端口扫描器 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)
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值