精华内容
下载资源
问答
  • c++ 多线程(2000个)端口扫描(附源码)
    更多相关内容
  • 多线程端口扫描源程序,带进度条,清晰易懂
  • 多线程 端口扫描器 可导出扫描记录 自定义线程数 自己写的
  • 简单实现C多线程端口扫描核心代码(2008-11-21 23:05:00)标签:c端口扫描最近想写一个自己的端口扫描器,主要为了方便扫描“自定义”端口,上网找了一下没找到现成的代码,自己就写了个测试代码。主要实现了:对指定...

    a4c26d1e5885305701be709a3d33442f.png

    简单实现C多线程端口扫描核心代码

    (2008-11-21 23:05:00)

    标签:

    c

    端口

    扫描

    最近想写一个自己的端口扫描器,主要为了方便扫描“自定义”端口,上网找了一下没找到现成的代码,自己就写了个测试代码。主要实现了:对指定IP进行扫描,自定义线程数,设置扫描端口的范围。以下程序没有多余的代码只是用来做功能测试。

    #include

    #include

    #pragma comment(lib,"Ws2_32.lib")

    WSADATA wsaData;

    SOCKADDR_IN sockaddr;

    int curport;

    void scan(int i)

    {

    SOCKET Socket;

    int e;

    Socket=socket(AF_INET,SOCK_STREAM,0);

    sockaddr.sin_port=htons(i);

    printf("Connecting %d port.\r",i);

    e=connect(Socket,(LPSOCKADDR)&sockaddr,sizeof(SOCKADDR_IN));

    if (e==SOCKET_ERROR)

    {

    closesocket(Socket);

    return;

    }

    printf("Found port >%d<

    open!\n",i);

    closesocket(Socket);

    }

    DWORD WINAPI ThreadFunc( LPVOID lpParam )

    {

    scan((int)lpParam);

    return 0;

    }

    int main(int argc, char *argv[])

    {

    DWORD dwThreadId;

    WORD wVersionRequest=MAKEWORD(2,2);

    WSAStartup(wVersionRequest,&wsaData);

    sockaddr.sin_family=AF_INET;

    sockaddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.18");

    //要扫描的IP

    int bport,eport,curip,threads,tport,intp,modp;

    threads=200; //线程数

    bport=1; //起始端口

    eport=10000; //结束端口

    curport=bport;

    tport=eport-bport;

    intp=tport / threads;

    modp=tport % threads;

    if(tport

    threads=tport;

    for(int j=0;j

    {

    if (j==intp)

    {

    threads=modp+1;

    }

    for(int i=0;i

    {

    CreateThread(NULL,0,ThreadFunc,(LPVOID)curport,0,&dwThreadId);

    Sleep(5);

    }

    }

    WSACleanup();

    return 0;

    }

    VS2005下编译成功!

    分享:

    a4c26d1e5885305701be709a3d33442f.png喜欢

    0

    a4c26d1e5885305701be709a3d33442f.png赠金笔

    加载中,请稍候......

    评论加载中,请稍候...

    发评论

    登录名: 密码: 找回密码 注册记住登录状态

    昵   称:

    评论并转载此博文

    a4c26d1e5885305701be709a3d33442f.png

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    展开全文
  • C++实现端口扫描器

    千次阅读 2022-04-06 16:25:37
    单个端口信息抓取 通过判断连接返回的套接字信息来判断端口是否开放,然后抓取端口对应的信息。 #include <stdio.h> #include <string.h> #include <iostream> #include <sys/socket.h> #...

    单个端口信息抓取

    通过判断连接返回的套接字信息来判断端口是否开放,然后抓取端口对应的信息。

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    using namespace std;
    
    void port_open(char *, int);
    
    int main(int argc, char *argv[])
    {
        port_open("192.168.3.132", atoi(argv[1]));
        return 0;
    }
    
    void port_open(char * addr, int port){
        
        int socketClient;
        socketClient = socket(AF_INET, SOCK_STREAM, 0);
    
        struct sockaddr_in addrSrv;
        memset(&addrSrv, 0 , sizeof(addrSrv));
        addrSrv.sin_family = AF_INET;
        addrSrv.sin_addr.s_addr = inet_addr(addr);
        addrSrv.sin_port = htons(port);
    
        cout << "-----scaning---port: " << port << endl;
        if(connect(socketClient, (struct sockaddr*) & addrSrv, sizeof(addrSrv)) == -1){
            cout << "[-] " << port << " closed!" << endl;
        }
        else{
            cout << "[+] " << port << " open!" << endl;
            int end_index;
            char message[65536];
            
            end_index = recv(socketClient, message, 65536, 0);
            cout << end_index << endl;
            if(end_index == -1)
                cout << "read failed!" << endl;
            else{
                message[end_index] = '\0';
                cout << message << endl;
            }
        }
        close(socketClient);
    }
    

    多个端口单线程扫描

    • 通过getopt和switch来解析命令行参数,此处提供了三个参数,分别时主机地址、开始端口、结束端口。开始端口和结束端口都有对应的默认值。
    • 考虑了一下异常的影响。
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <exception>
    
    using namespace std;
    
    char addr[30];
    
    void port_scan(int);
    void order_port_scan(int, int);
    
    int main(int argc, char **argv){
        int start_port=1, end_port=1000;
        int opt;
        const char *optstring = "a:s:e:";
    
        while((opt = getopt(argc, argv, optstring)) != -1){
            switch(opt){
                case 'a':
                    strcpy(addr, argv[optind-1]);
                    break;
                case 's':
                    start_port = atoi(argv[optind-1]);
                    break;
                case 'e':
                    end_port = atoi(argv[optind-1]);
                    break;
                default:
                    cout << "parameter error" << endl;
                    exit(0);
            }
        }
    
        if(addr == nullptr)
            cout << "address is not supplyed!" << endl;
        cout << "*********** Scanning " << addr << " from port " << start_port << " to port " << end_port << " *************************"<<endl;
        order_port_scan(start_port, end_port);
        return 0;
    }
    
    
    void order_port_scan(int start_port, int end_port){ 
        for(int port=start_port; port <= end_port; port++)
            port_scan(port);
    }
    void port_scan(int port){
    
        int socketClient;
        struct sockaddr_in addrSrv;
        try{
            socketClient = socket(AF_INET, SOCK_STREAM, 0);
            memset(&addrSrv, 0, sizeof(addrSrv));
            addrSrv.sin_family = AF_INET;
            addrSrv.sin_addr.s_addr = inet_addr(addr);
            addrSrv.sin_port = htons(port);
            if(connect(socketClient, (struct sockaddr*) &addrSrv, sizeof(addrSrv)) >= 0){
                cout << "[+] " << port << " open! " << endl; 
            }else{
                cout << "[-] " << port << " closed! " << endl; 
            }
        }catch(exception e){
            cout << "error!" << endl;
        }
        close(socketClient);
    }
    

    多端口多线程实现

    • 多线程中加入静态互斥锁,可以通过-p参数指定线程数,但是建议的线程数不要太大,不能超过100,因为此处定义的线程数组大小为100。
    • linux下sleep函数的单位时是秒,可以通过usleep来指定更短的时间。
    • 在编程实现的过程中考虑线程数的多少,而不是一共有多少个要扫描的端口。
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <exception>
    
    using namespace std;
    
    pthread_mutex_t mutex_x=PTHREAD_MUTEX_INITIALIZER;
    char addr[30];
    struct threadPort{
        int thread_port;
    };
    
    void * port_scan(void *threadarg);
    
    
    int main(int argc, char **argv){
        int start_port=1, end_port=1000;
        int thread_num = 5;
        int opt;
        const char *optstring = "a:s:e:p:";
    
        struct threadPort tp[100];
        int time_thread = 10000;
        pthread_t threads[100];
        int thread_id;
        int id = 0;
        int rc;
    
        while((opt = getopt(argc, argv, optstring)) != -1){
            switch(opt){
                case 'a':
                    strcpy(addr, argv[optind-1]);
                    break;
                case 's':
                    start_port = atoi(argv[optind-1]);
                    break;
                case 'e':
                    end_port = atoi(argv[optind-1]);
                    break;
                case 'p':
                    thread_num = atoi(argv[optind-1]);
                    break;
                default:
                    cout << "parameter error" << endl;
                    exit(0);
            }
        }
    
        if(addr == nullptr)
            cout << "address is not supplyed!" << endl;
        cout << thread_num << endl;
        cout << "*********** Scanning " << addr << " from port " << start_port << " to port " << end_port << " *************************"<<endl;
        for(int port=start_port; port <= end_port; port++, id++){
            thread_id = id % thread_num;
            tp[thread_id].thread_port = port;
            rc = pthread_create(&threads[thread_id], NULL, port_scan, &tp[thread_id]);
            if(rc){
                cout << "Error, return code from pthread_create() is "<< rc << endl;
                exit(-1);
            }
            usleep(time_thread);
        }
        pthread_exit(NULL);
        return 0;
    }
    
    void * port_scan(void *threadarg){ // 注意函数的原型要这么定义
        pthread_mutex_lock(&mutex_x);
        struct threadPort * data = (struct threadPort *) threadarg;
        int port = data->thread_port;
        int socketClient;
        struct sockaddr_in addrSrv;
        try{
            socketClient = socket(AF_INET, SOCK_STREAM, 0);
            memset(&addrSrv, 0, sizeof(addrSrv));
            addrSrv.sin_family = AF_INET;
            addrSrv.sin_addr.s_addr = inet_addr(addr);
            addrSrv.sin_port = htons(port);
            if(connect(socketClient, (struct sockaddr*) &addrSrv, sizeof(addrSrv)) >= 0){
                cout << "[+] " << port << " open! " << endl; 
            }else{
                cout << "[-] " << port << " closed! " << endl; 
            }
        }catch(exception e){
            cout << "error!" << endl;
        }
        close(socketClient);
        pthread_mutex_unlock(&mutex_x);
        pthread_exit(NULL);
        return NULL;
    } 
    
    #编译命令
    g++ simple_pthread_port_scan.cpp -o simple_pthread_port_scan -lpthread
    #执行命令
    ./simple_pthread_port_scan -a 192.168.3.132 -p 20 -s 20 -e 100    
    
    展开全文
  • 多线程端口扫描实现(C语言)源码:#include #include #include #include #include #pragma comment(lib,"WS2_32.lib")DWORD WINAPI ScanThread (LPVOID port);int main (int argc, char* argv[]){WSADATA wsd;int ...

    多线程端口扫描实现(C语言)

    源码:

    #include

    #include

    #include

    #include

    #include

    #pragma comment(lib,"WS2_32.lib")

    DWORD WINAPI ScanThread (LPVOID port);

    int main (int argc, char* argv[])

    {

    WSADATA wsd;

    int port = 0;

    int MAX_PORT;

    clock_t start, end;

    HANDLE handle;

    DWORD dwThreadId;

    //Initialize socket lib

    if (WSAStartup (MAKEWORD (2, 2), &wsd) != 0)

    {

    printf ("WSAStartup failed!\n");

    return 1;

    }

    printf ("请输入要扫描的最大端口:");

    scanf ("%d", &MAX_PORT);

    printf("Scaning......\n");

    start = clock ();

    //扫描的主要代码,根据需要删减

    do{

    handle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ScanThread, (LPVOID)port, 0, &dwThreadId);

    port++;

    } while (port < MAX_PORT);

    WaitForSingleObject (handle, INFINITE);//等待最后一个线程结束

    end = clock ();

    int duration = end - start;

    printf ("总耗时 %d ms", duration);

    system ("pause");

    return 0;

    }

    DWORD WINAPI ScanThread (LPVOID port)

    {

    int Port = (int)(LPVOID)port;

    int retval;//调用各种socket函数的返回值

    SOCKET sHost;

    SOCKADDR_IN servAddr;

    sHost = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (INVALID_SOCKET == sHost)

    {

    printf ("socket failed!\n");

    WSACleanup ();

    return -1;

    }

    servAddr.sin_family = AF_INET;

    servAddr.sin_addr.S_un.S_addr = inet_addr ("127.0.0.1");

    //setsockopt (sHost, IPPROTO_TCP, TCP_MAXRT, (char *)&Timeout, sizeof (Timeout));//设置快速扫描

    servAddr.sin_port = htons (Port);

    retval = connect (sHost, (LPSOCKADDR)&servAddr, sizeof (servAddr));//lpsockaddr is 环路地址

    if (retval == SOCKET_ERROR) {

    printf ("端口%d关闭!\n", Port); //这里不要使用WSACleanup()函数,不然后续的线程会创建不了socket

    closesocket (sHost);

    return -1;

    }

    printf ("端口%d开放!\n", Port);

    closesocket (sHost);

    return 1;

    }

    可以在ScanThread线程函数中设置server的IP来确定要扫描的主机,运行时会提示输入扫描的最大端口。

    1f4aa909a23d?utm_campaign=maleskine

    提示.png

    调用time.h中的clock函数来精确确定扫描的时间,在end之前调用WaitForSingleObject函数等待最后一个线程扫描结束。

    1f4aa909a23d?utm_campaign=maleskine

    定义start,end时钟

    1f4aa909a23d?utm_campaign=maleskine

    调用WaitForSingleObject

    测试结果:

    扫描本地:

    1f4aa909a23d?utm_campaign=maleskine

    本地耗时1265ms

    扫描百度(123.125.115.110):

    1f4aa909a23d?utm_campaign=maleskine

    扫描百度耗时21262ms

    展开全文
  • 本源码在 https://blog.csdn.net/qq78442761/article/details/89016277 中有解释说明
  • 本设计通过端口扫描器的研究来提高对计算机安全的认识。利用TCPconnect扫描原理,扫描主机通过TCP/IP协议的三次握手与目标主机的指定端口建立一次完整的...该端口扫描器采用c++语言开发,在VC6.0编译环境下通过测试。
  • 网络端口扫描器 采用python c++两种语言开发。分别有windows平台和Linux平台版本。 介绍:输入端口号进行扫描,支持多线程,支持特定端口扫描或全端口扫描。
  • 多线程tcp端口扫描

    2010-12-05 14:36:17
    基于c++语言的tcp端口扫描器,是多线程
  • 第一、原理端口扫描的原理很简单,就是建立socket通信,切换不通端口,通过connect函数,如果成功则代表端口开发者,否则端口关闭。所有需要socket程序熟悉,本内容是在window环境下的第二、单线程实现方式// ...
  • C++端口扫描器

    千次阅读 2014-11-26 00:31:48
    // PortScan.cpp : Defines the entry point for the console application. #include "stdafx.h" #include #include #pragma comment(lib,"Ws2_32.lib"...//线程个数 #define
  • 1、python 单线程 import socket while True: #引入协议族AF_INET和SOCK_STREAM sm=socket.socket(socket.AF_INET, socket.SOCK_STREAM) sm.settimeout(1) ip = input("靶机ip:") d...
  • #define WIN32_LEAN_AND_MEAN ... //进行多线程 #pragma comment (lib,"ws2_32.lib") //加载ws2_32库文件 using namespace std; //扫描函数——自己创建的线程1 void scan1(string I, int Start
  • 单线程与多线程的区别 单线程: 每个正在运行的程序(即进程),至少包括一个线程,这个线程叫主线程 主线程在程序启动时被创建,用于执行main函数 只有一个主线程的程序,称作单线程程序 主线程负责执行程序的所有...
  • 本设计通过端口扫描器的研究来提高对计算机安全的认识。利用TCPconnect扫描原理,扫描主机通过TCP/IP协议的三次握手与目标主机的指定端口建立一次完整的...该端口扫描器采用c++语言开发,在VC6.0编译环境下通过测试。
  • 本设计通过端口扫描器的...该端口扫描器采用c++语言开发,在VC6.0编译环境下通过测试 资源包含 1. 27页绝对详细的课程设计报告书,包含目录。 2. c++实现的Socket编程 源代码 3. 超级简单好用的Vc 6.0 编译器安装包
  • PAGE主机端口扫描程序设计摘 要计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全...TCP扫描支持多线程,能对单个指定的主机进行扫描或对指定网...
  • 端口扫描器 这个项目与linux机器上的nmap工具非常相似。
  • Visual C++串口通信编程---多线程异步方式 1. 串口通信基础 提到串口让人想起并口,它们是计算机中两个比较重要的通信方式。 串口:也叫COM口,把字节的二进制位按位列队进行传输,每个字节占一个固定的时间长,...
  • 【导语】:Masscan是一个批量端口扫描器,程序运行在单机上,每秒传输 1 千万个数据包,可以在 6 分钟之内扫完整个互联网。它是迄今为止,速度最快的端口扫描器。 简介 Masscan 的输入输出类似于 nmap,如果对...
  • 【CTF】端口扫描教程

    千次阅读 2019-10-30 11:00:23
    网络扫描实验实验目的预备知识TCP与UDP扫描的分类nmap简介实验环境安装NmapZenmap图形基本应用1.查找本机网关2....整网段扫描4.选择不同的profile重新对目标10.1.1.1进行扫描5....扫描目标主机10.1.1.2所有端口(...
  • C++ 编写简单的端口扫描工具,使用MFC界面,超时时间和非阻塞技术。(需要多线程可自行添加)
  • 如何实现控制台的多线程端口扫描器。 我已经完成了单线程扫描器 //头文件 #ifndef SCAN_H #define SCAN_H #include #include #include #include void scan( QString ad,int sp,int ep) { //连接并验证端口是否...
  • 实验内容:用C/C++语言(必须用socket函数)编写一个扫描局域网内主机的程序。要求可以显示局域网内的主机名列表,IP地址列表,并可以显示哪些主机开放了哪些端口。 实验环境 主运行机器:Linux kal...
  • linux和windows下都可以用,用多线程来ping1-255所有的地址,效率不高,2分钟左右。 先凑合和用吧。 #-*- coding: utf-8 -*- #author: orangleliu date: 2014-11-12 #python2.7.x ip_scaner.py ''''' 不同平台,...
  • 简介:该扫描器实现了多线程进行扫描,同时支持端口范围,显示所有已打开端口列表。 开发环境:Ubuntu16.04 开发平台:Qt5.9 语言:C++ 实现:本程序用的是TCP connect扫描,也是最基本的扫描,利用系统提供的...
  • 多线程中的线程同步可以使用,CreateThread,CreateMutex 互斥锁实现线程同步,通过临界区实现线程同步,Semaphore 基于信号实现线程同步,CreateEvent 事件对象的同步,以及线程函数传递单一参数与多个参数的实现...
  • 本来想改成SYN半开式扫描器的,后来想起XP SP2不支持原始套接字,也就将就改成活跃式的扫描器了。如果有对SYN感兴趣的朋友,可以用Winpcap改成SYN的。    其实主要的代码就两块: 代码 1 Private ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,739
精华内容 2,295
关键字:

c++多线程端口扫描器

c++ 订阅