Программирование на C++ глазами хакера



             

Самый быстрый сканер портов - часть 3


connect(sock[i], (struct sockaddr *) &addr, sizeof (addr)); if (WSAGetLastError() == WSAEINPROGRESS) { closesocket (sock[i]); iBusySocks--; } else { busy[i] = 1; port[i] = iStartPort; } iStartPort++; } } FD_ZERO (&fdWaitSet); for (int i = 0; i < MAX_SOCKETS; i++) { if (busy[i] == 1) FD_SET (sock[i], &fdWaitSet); }

struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0;

if (select (1, NULL, &fdWaitSet, NULL, &tv) == SOCKET_ERROR) { SetDlgItemText(IDC_STATUSTEXT, "Select error"); return; }

for (int i = 0; i < MAX_SOCKETS; i++) { if (busy[i] == 1) { if (FD_ISSET (sock[i], &fdWaitSet)) { int opt; int Len = sizeof(opt); if (getsockopt(sock[i], SOL_SOCKET, SO_ERROR, (char*)&opt, &Len) == SOCKET_ERROR) SetDlgItemText(IDC_STATUSTEXT, "getsockopt error");

if (opt == 0) { struct servent *tec; itoa(port[i],tStr, 10); strcat(tStr, " ("); tec = getservbyport(htons (port[i]), "tcp"); if (tec==NULL) strcat(tStr, "Unknown"); else strcat(tStr, tec->s_name);

strcat(tStr, ") - open"); m_PortList.AddString(tStr); busy[i] = 0; shutdown(sock[i], SD_BOTH); closesocket(sock[i]); } busy[i] = 0; shutdown (sock[i], SD_BOTH); closesocket (sock[i]); iBusySocks--; } else { busy[i] = 0; closesocket(sock[i]); iBusySocks--; } } } ProcessMessages(); } WSACleanup(); SetDlgItemText(IDC_STATUSTEXT, "Scaning complete"); return; }

В данном примере для сканирования используются три массива:

  • sock — массив дескрипторов сокетов, которые ожидают соединения;
  • busy — состояние сканируемых портов. Любой из них может быть занят и вызвать ошибку. В файле помощи по WinSock написано, что не каждый порт можно использовать. Поэтому элемент массива, номер которого соответствует такому занятому (зарезервированному) порту, делается равным 1, в противном случае — присваивается 0;
  • port — массив сканируемых портов. В принципе, можно было бы обойтись и без этого массива, но для упрощения кода я его ввел.
  • В этом примере есть одна новая функция, которую мы не рассматривали, — getservbyport. Она выглядит следующим образом:




    Содержание  Назад  Вперед