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



             

Состояние локального компьютера


Если нужно узнать состояние портов локального компьютера, нет необходимости сканировать порты. Есть способ лучше — запросить состояние всех портов с помощью функции GetTcpTable. В этом случае вы получите более подробную информацию, которую можно свести в таблицу из следующих колонок:

  • локальный адрес — интерфейс, на котором открыт порт;
  • локальный порт — открытый порт;
  • удаленный адрес — адрес, с которого в данный момент установлено соединение с портом;
  • удаленный порт — порт на удаленной машине, через который происходит обращение к локальной машине;
  • состояние — может принимать различные значения: прослушивание, закрытие порта, принятие соединения и т. д.
  • Самое главное преимущество использования состояния локальной таблицы TCP — мгновенная работа. Сколько бы ни было открытых портов, их определение происходит в считанные миллисекунды.

    Для иллюстрации примера работы с TCP-портом создайте MFC-приложение на основе диалогового окна с именем IPState. На главное диалоговое окно поместите один список типа List Box и кнопку с заголовком TCP Table. На рис. 6.3 вы можете увидеть окно будущей программы.

    Рис. 6.3. Окно будущей программы IPState

    По нажатии кнопки TCP Table должен выполняться код из листинга 6.3.

    Листинг 6.3. Получение информации о ТСР-портах
    void CIPStateDlg::OnBnClickedButton1() { DWORD dwStatus = NO_ERROR; PMIB_TCPTABLE pTcpTable = NULL; DWORD dwActualSize = 0;

    dwStatus = GetTcpTable(pTcpTable, &dwActualSize, TRUE);

    pTcpTable = (PMIB_TCPTABLE) malloc(dwActualSize); assert(pTcpTable);

    dwStatus = GetTcpTable(pTcpTable, &dwActualSize, TRUE); if (dwStatus != NO_ERROR) { AfxMessageBox("Couldn't get tcp connection table."); free(pTcpTable); return; }

    CString strState; struct in_addr inadLocal, inadRemote; DWORD dwRemotePort = 0; char szLocalIp[1000]; char szRemIp[1000];

    if (pTcpTable != NULL) { lList.AddString("================================================="); lList.AddString("TCP table:"); for (int i=0; i<pTcpTable->dwNumEntries; i++) { dwRemotePort = 0; switch (pTcpTable->table[i].dwState) { case MIB_TCP_STATE_LISTEN: strState="Listen"; dwRemotePort = pTcpTable->table[i].dwRemotePort; break; case MIB_TCP_STATE_CLOSED: strState="Closed"; break; case MIB_TCP_STATE_TIME_WAIT: strState="Time wait"; break; case MIB_TCP_STATE_LAST_ACK: strState="Last ACK"; break; case MIB_TCP_STATE_CLOSING: strState="Closing"; break; case MIB_TCP_STATE_CLOSE_WAIT: strState="Close Wait"; break; case MIB_TCP_STATE_FIN_WAIT1: strState="FIN wait"; break; case MIB_TCP_STATE_ESTAB: strState="EStab"; break; case MIB_TCP_STATE_SYN_RCVD: strState="SYN Received"; break; case MIB_TCP_STATE_SYN_SENT: strState="SYN Sent"; break; case MIB_TCP_STATE_DELETE_TCB: strState="Delete"; break; } inadLocal.s_addr = pTcpTable->table[i].dwLocalAddr; inadRemote.s_addr = pTcpTable->table[i].dwRemoteAddr; strcpy(szLocalIp, inet_ntoa(inadLocal)); strcpy(szRemIp, inet_ntoa(inadRemote));




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