端口扫描器实现

head.h文件

#include <iostream>
#include <Windows.h>
using namespace std;

struct MainThreadParam
{
    DWORD StartIp;
    DWORD EndIp;
    DWORD StartPort;
    DWORD EndPort;
    HANDLE hCopyEvent;
};

struct SubThreadParam
{
    DWORD Ip;
    DWORD Port;
    HANDLE hThreadNum;
    HANDLE hParamEvent;
};


//int StartScanner(DWORD StartIp, DWORD StartPort, DWORD EndIp, DWORD EndPort);
DWORD WINAPI PortScanThread(LPVOID LpParam);
BOOL InitPortScan();
BOOL InsertInfo(char *buff);
DWORD WINAPI StartScanner(LPVOID LpParam);

resource.h文件
这个是对gui界面控件的定义构建界面时候自动的

#define IDD_DIALOG1                     101
#define IDC_BUTTON1                     1001
#define IDC_IPADDRESS1                  1002
#define IDC_IPADDRESS2                  1003
#define IDC_EDIT1                       1004
#define IDC_EDIT2                       1005
#define IDC_LIST1                       1006


#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1007
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

PortScanner.cpp文件

#include <winsock2.h>
#include <Ws2tcpip.h>
#pragma comment(lib,"Ws2_32.lib")
#include <CommCtrl.h>       
#include <Windows.h>
#include "resource.h"
#include "head.h"

HWND hDlg;
SubThreadParam SParam;
MainThreadParam MParam;

int CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wparam, LPARAM lparam);

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
    DialogBox(hInstance,
        MAKEINTRESOURCE(IDD_DIALOG1),
        NULL,
        DlgProc
        );
    return 0;
    //建立一个模态的对话框
}

int CALLBACK DlgProc(HWND hDlgMain,
    UINT uMsg, WPARAM wparam, LPARAM lparam)
{
    hDlg = hDlgMain;
    DWORD StartIp;
    DWORD StartPort;
    DWORD EndIp;
    DWORD EndPort;
    switch (uMsg)
    {
    case WM_COMMAND:
        switch (LOWORD(wparam))
        {
        case IDC_BUTTON1:
        {
            SendMessage(GetDlgItem(hDlg, IDC_LIST1), LB_RESETCONTENT, NULL, NULL);
            SendMessage(GetDlgItem(hDlg, IDC_IPADDRESS1), IPM_GETADDRESS, NULL, (LPARAM)&StartIp);
            SendMessage(GetDlgItem(hDlg, IDC_IPADDRESS2), IPM_GETADDRESS, NULL, (LPARAM)&EndIp);
            StartPort = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, FALSE);
            EndPort = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, FALSE);          
            MParam.StartIp = StartIp;
            MParam.EndIp = EndIp;
            MParam.StartPort = StartPort;
            MParam.EndPort = EndPort;
            CreateThread(NULL, 0, StartScanner, NULL, 0, NULL);
        }
        break;
        default:
            break;
        }
        break;
    case WM_CLOSE:
    {
        EndDialog(hDlg, 0);
        DestroyWindow(hDlg);
    }
    break;
    default:
        break;
    }
    return 0;
}

//程序中的主线程
DWORD WINAPI StartScanner(LPVOID LpParam)
{

    HANDLE hParamEvent = CreateEvent(NULL, TRUE, FALSE, NULL);                      
    HANDLE hThreadNum = CreateSemaphore(NULL, 256, 256, NULL);              
    SParam.hParamEvent = hParamEvent;
    SParam.hThreadNum = hThreadNum;

    for (DWORD Ip = MParam.StartIp; Ip <= MParam.EndIp; Ip++)
    {
        for (DWORD Port = MParam.StartPort; Port <= MParam.EndPort; Port++)
        {

            DWORD WaitResult = WaitForSingleObject(hThreadNum, 200);            

            if (WaitResult == WAIT_OBJECT_0)
            {
                SParam.Ip = Ip;
                SParam.Port = Port;

                CreateThread(NULL, 0, PortScanThread, &SParam, 0, NULL);
                WaitForSingleObject(hParamEvent, INFINITE);                             
                ResetEvent(hParamEvent);                                            

            }
            else if (WaitResult == WAIT_TIMEOUT)
            {
                Port--;
                continue;
            }
        }

    }
    return 1;
}

//端口扫描子线程
DWORD WINAPI PortScanThread(LPVOID LpParam)
{
    SubThreadParam SParam;
    MoveMemory(&SParam, LpParam, sizeof(SParam));
    SetEvent(SParam.hParamEvent);                       //唤醒事件
    if (!InitPortScan())
    {
        return 0;
    }
    SOCKET Sock;
    SOCKADDR_IN SockAddr;
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (Sock == INVALID_SOCKET)
    {
        MessageBoxA(NULL, "INVALID_SOCKET", NULL, NULL);
    }
    SockAddr.sin_addr.S_un.S_addr = htonl(SParam.Ip);
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_port = htons(SParam.Port);

    char* Ipchar = inet_ntoa(SockAddr.sin_addr);

    char str[200];
    if (connect(Sock, (SOCKADDR*)&SockAddr, sizeof(SockAddr)) == 0)
    {
        sprintf_s(str, "%s:%d-----------连接成功\n", Ipchar, SParam.Port);
        InsertInfo(str);
    }
    else
    {
        sprintf_s(str, "%s:%d   连接失败\n", Ipchar, SParam.Port);
    }


    closesocket(Sock);
    ReleaseSemaphore(SParam.hThreadNum, 1, NULL);           //释放一个信号量
    return 0;
}

BOOL InitPortScan()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;


    wVersionRequested = MAKEWORD(2, 2);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {

        printf("WSAStartup failed with error: %d\n", err);
        return 0;
    }



    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
        printf("Could not find a usable version of Winsock.dll\n");
        WSACleanup();
        return 0;
    }
    else
        printf("The Winsock 2.2 dll was found okay\n");
    return 1;


}

BOOL InsertInfo(char *buff)
{
    SendMessage(GetDlgItem(hDlg, IDC_LIST1), LB_ADDSTRING, NULL, (LPARAM)buff);
    return TRUE;
}

最后的还有个文件PortScanner.rc
这是对话框框体的设计。。。

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 309, 177
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    PUSHBUTTON      "开始扫描",IDC_BUTTON1,94,154,107,16
    LTEXT           "开始IP",IDC_STATIC,34,19,23,8
    LTEXT           "结束IP",IDC_STATIC,34,39,23,8
    LTEXT           "开始PORT",IDC_STATIC,193,18,35,8
    LTEXT           "结束PORT",IDC_STATIC,193,39,35,8
    CONTROL         "",IDC_IPADDRESS1,"SysIPAddress32",WS_TABSTOP,65,18,95,14
    CONTROL         "",IDC_IPADDRESS2,"SysIPAddress32",WS_TABSTOP,65,37,95,14
    EDITTEXT        IDC_EDIT1,232,16,54,16,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT2,231,36,54,16,ES_AUTOHSCROLL
    LISTBOX         IDC_LIST1,40,60,223,90,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 302
        TOPMARGIN, 7
        BOTTOMMARGIN, 170
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

最后的整个工程: 链接:https://pan.baidu.com/s/14K3nKvKY2LofCQIsGKNqsA 密码:p2uf

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值