⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpscan.c

📁 nessus 扫描器 windows版 漏洞扫描
💻 C
字号:
#include "port.h"
#include "tcpscan.h"

int GetPortArray(char *szLine, BOOL *PortPool)
{
    char *p = NULL;
    char *q = NULL;
    char *r = NULL;
    char *s = NULL;
    char temp[1024];
    char *t;
    int i;
    
    int nMin, nMax, nCount = 0;
    
    for (i=0; i<MAX_PORT_NUM; i++)
        PortPool[i] = FALSE;
    
    p = szLine;
    for (q=r=p; q; q++) {
        if ((*q==',') || (*q=='\0')) {
            s = NULL;
            strncpy(temp, r, q-r);
            *(temp+(q-r)) = 0;
            if (s = strstr(temp, "-")) {
                *s = 0;
                s++;
                t = temp;
                while (*t == ' ' || *t == '\t') t++;
                nMin = atoi(t);
                if (nMin < 0) nMin = 0;
                else if (nMin >65535) nMin = 65535;
                
                while (*s == ' ' || *s == '\t') s++;
                nMax = atoi(s);
                if (nMax < 0) nMax =0;
                else if (nMax >65535) nMax = 65535;
                
                for (i=nMin; i<=nMax; i++) {
                    PortPool[i] = TRUE;
                    nCount++;
                }
            }
            else {
                t = temp;
                while (*t == ' ' || *t == '\t' ) t++;
                nMin = atoi(t);
                if (nMin < 0) nMin = 0;
                else if (nMin >65535) nMin = 65535;
                PortPool[nMin] = TRUE;
                nCount++;
            }
            r = q+1;
        }
        if (*q == '\0') break;
    }
    
    return nCount;
    
}

void BlockSocket(SOCKET sock, BOOL block)
{
    ULONG ulInBuffer;

    if (block) ulInBuffer = 0L;
    else ulInBuffer = 1L;

    if (SOCKET_ERROR == ioctlsocket(sock, FIONBIO, &ulInBuffer))
        printf("ioctlsocket failed. Error: %d\n", WSAGetLastError());

    return;
}

int FastTcpScan(char *szHostName, BOOL *PortPool, struct arglist *desc)
{
    int             nCount = 0,
                    nCheckPortNum = 0,
                    nCurrentSocket = 0,
                    nOutNum = 0,
                    nDeadIndex = 0,
                    nRtn = 0,
                    sockaddr_in_len = 0;                      
    char            temp[1024],
                    buf[65536];
    SOCKET          ServerSock[MAX_PARALLEL_SOCKNUM] = {0};
    int             PortArray[MAX_PORT_NUM] = {0},
                    DeadStack[MAX_PARALLEL_SOCKNUM] = {0},
                    PortNo[MAX_PARALLEL_SOCKNUM] = {0};
    SOCKADDR_IN     destination_sin,
                    stranger;        
    fd_set          fdsWrite,
                    fdsRead,
                    fdsError;
    DWORD           dwLastTime, dwTimeOut;

    int             i, j, k;
    BOOL            bIsSet;
    struct timeval  tsWait;

    int             nVerbose = 0;                   //是否显示详细扫描信息
    int             *pnTimeout;                     //插件超时
    char            *szCurrentSchedule = NULL;
    char            szTempBuf[1024] = {0};
    char            szLine[1024] = {0};

    nVerbose = plug_get_parameter(desc, "verbose");
    pnTimeout = plug_get_parameter(desc, "Timeout");
    szCurrentSchedule = (char *)plug_get_parameter(desc, "CurrentSchedule");

    FD_ZERO(&fdsRead);
    FD_ZERO(&fdsWrite);
    FD_ZERO(&fdsError);
    
    memset(PortArray, 0, sizeof(PortArray));
    
    // initialize port array
    for (i=0, j=0; ; i++) {
        if (PortPool[i]) PortArray[j++] = i;    
        if (i == MAX_PORT_NUM -1) break;
    }
    nCheckPortNum = j;
    
    for (i=0; i<MAX_PARALLEL_SOCKNUM; i++) {
        DeadStack[nDeadIndex++] = i;
        PortNo[i] = 0;
    }
    nDeadIndex--;

    for (i=0; i<MAX_PARALLEL_SOCKNUM; i++)
        ServerSock[i] = INVALID_SOCKET;

    // Fill out the server socket's address information.
    destination_sin.sin_family = AF_INET;
    destination_sin.sin_addr.s_addr = inet_addr(szHostName);
    
    dwTimeOut = SELECT_TIMEOUT;

    j = 0;

    tsWait.tv_sec = 0;
    tsWait.tv_usec = 0;

    while (PortArray[j] != 0 || nOutNum != 0) {
        for (i=nOutNum; i<MAX_PARALLEL_SOCKNUM && PortArray[j]!=0; j++, i++) {
            if (dwTimeOut) Sleep(1);
            nCurrentSocket = DeadStack[nDeadIndex--];
            if (nCurrentSocket >= MAX_PARALLEL_SOCKNUM) nCurrentSocket = MAX_PARALLEL_SOCKNUM-1;
            if (nCurrentSocket < 0) nCurrentSocket = 0;
            nOutNum++;
            PortNo[nCurrentSocket] = PortArray[j];

            if ((ServerSock[nCurrentSocket] = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
                printf("Allocate socket failed.\n");
                return -1;
            }
#ifdef _XSCAN_PLUG
            // Display the current schedule
            GetString("PORT-PORT", szLine, NULL, NULL);
            sprintf(szTempBuf, "%s: %d", szLine, PortArray[j]);
            GetString("ACT-CHECKING", szLine, szTempBuf, NULL);
            strcpy(szCurrentSchedule, szLine);
            if (pnTimeout) *pnTimeout = 0;
#endif
            fprintf(stdout, "%d\r", PortArray[j]);

            // Convert to network ordering.
            destination_sin.sin_port = htons(PortArray[j]);
            BlockSocket(ServerSock[nCurrentSocket], FALSE);
            // Establish a connection to the server socket.
            if (0 == connect(ServerSock[nCurrentSocket], 
                (PSOCKADDR) &destination_sin, 
                sizeof (destination_sin))) {
                closesocket(ServerSock[nCurrentSocket]);
                if (AlertUser(desc, PortNo[nCurrentSocket])) {
                    nCount++;
                }
            }
            else {
                switch (WSAGetLastError()) {
                case WSAEWOULDBLOCK :
                    BlockSocket(ServerSock[nCurrentSocket], TRUE);
                case WSAEALREADY:
                    FD_SET(ServerSock[nCurrentSocket], &fdsWrite);
                    FD_SET(ServerSock[nCurrentSocket], &fdsRead);
                    FD_SET(ServerSock[nCurrentSocket], &fdsError);
                    break;
                case WSAECONNREFUSED:
                    DeadStack[++nDeadIndex] = nCurrentSocket;
                    nOutNum--;
                    PortNo[nCurrentSocket] = 0;
                    closesocket(ServerSock[nCurrentSocket]);
                    break;
                default:
                    closesocket(ServerSock[nCurrentSocket]);
                    printf("Strange error in connect\n");
                    return -1;
                }
            }
            if (dwTimeOut) dwLastTime = GetTickCount();
        }

        if (PortArray[j] == 0 && dwTimeOut) Sleep(2000);

        if ((nRtn = select(0, &fdsRead, &fdsWrite, &fdsError, &tsWait)) < 0) {
            printf("select error=%d, %d\n", nRtn, WSAGetLastError());
            return -1;
        }

        for (k=MAX_PARALLEL_SOCKNUM-1; k>=0; k--) {
            if (dwTimeOut) Sleep(1);
            if (!PortNo[k]) continue;
            bIsSet = FALSE;
            if (FD_ISSET(ServerSock[k], &fdsWrite)
                && FD_ISSET(ServerSock[k], &fdsRead)) {
                if (AlertUser(desc, PortNo[k])) {
                    nCount++;
                }
                bIsSet = TRUE;
                FD_CLR(ServerSock[k], &fdsWrite);
                FD_CLR(ServerSock[k], &fdsRead);
            }
            else if (FD_ISSET(ServerSock[k], &fdsWrite)) {
                if (AlertUser(desc, PortNo[k])) {
                    nCount++;
                }
                bIsSet = TRUE;
                FD_CLR(ServerSock[k], &fdsWrite);
            }
            else if (FD_ISSET(ServerSock[k], &fdsRead)) {
                if (AlertUser(desc, PortNo[k])) {
                    nCount++;
                }
                bIsSet = TRUE;
                FD_CLR(ServerSock[k], &fdsRead);
            }
            else if (FD_ISSET(ServerSock[k], &fdsError)) {
                int type = 0;
                if (!plug_get_key(desc, "PortScan/ClosePort", &type))
                    plug_set_key(desc, "PortScan/ClosePort", ARG_INT, PortNo[k]);
                bIsSet = TRUE;
                FD_CLR(ServerSock[k], &fdsError);
            }
            else if (dwTimeOut) {
                FD_SET(ServerSock[k], &fdsWrite);
                FD_SET(ServerSock[k], &fdsRead);
                FD_SET(ServerSock[k], &fdsError);
            }

            if (bIsSet || !dwTimeOut) {
                DeadStack[++nDeadIndex] = k;
                nOutNum--;
                closesocket(ServerSock[k]);
                PortNo[k] = 0;
                if (dwTimeOut) dwLastTime = GetTickCount();
            }
            else if (GetTickCount()-dwLastTime > dwTimeOut) {
                for (k=MAX_PARALLEL_SOCKNUM-1; k>=0; k--) {
                    FD_CLR(ServerSock[k], &fdsWrite);
                    FD_CLR(ServerSock[k], &fdsRead);
                    FD_CLR(ServerSock[k], &fdsError);
                    DeadStack[++nDeadIndex] = k;
                    closesocket(ServerSock[k]);
                    PortNo[k] = 0;
                }
                nOutNum = 0;
                dwLastTime = GetTickCount();
                break;
            }
        }
    }

    return nCount;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -