Пример #1
0
// ****************************************************************************
//
//  Function Name:	RAlert::AlertUser( )
//
//  Description:		Alert the user of a problem with an Alert and an OK button
//							Retrieve the message from a resource file.
//
//  Returns:			Nothing
//
//  Exceptions:		None
//
// ****************************************************************************
//
void	RAlert::AlertUser( YResourceId alertId )
	{
	RMBCString	string = GetResourceManager().GetResourceString( alertId );
#ifdef	TPSDEBUG
	char	buffer[128];
	buffer[0] = '\0';
	WinCode( wsprintf( buffer, " - %d", alertId ) );
	string += buffer;
#endif
	AlertUser( (LPCSZ)string );
	}
Пример #2
0
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) {
		//2012.3.15
		//Edit:   
		//	   在小于64个端口时,nDeadIndex过大,DeadStack数组越界
		//
		nDeadIndex = -1;
                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;
}