Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 10 декабря!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

Перечисление сетевых соединений компьютера 

Данный код перечислит все соединения компьютера по протоколу TCP, аналогично утилите netstat:

#pragma hdrstop
 
 
 
 #include <stdio.h>
 
 
 
 #include <winsock.h>
 
 
 
 #include <iphlpapi.h>
 
 
 
 //---------------------------------------------------------------------------
 
 
 
 #define MAX_STRLEN        128
 
 
 
 #pragma argsused
 
 
 
 void PrintTcpTable(PMIB_TCPTABLE pTcpTable)
 
 
 
 {
 
 
 
     char    strState[MAX_STRLEN];
 
 
 
     struct  in_addr    inadLocal, inadRemote;
 
 
 
     DWORD   dwRemotePort = 0;
 
 
 
     char    szLocalIp[MAX_STRLEN];
 
 
 
     char    szRemIp[MAX_STRLEN];
 
 
 
     if (pTcpTable != NULL)
 
 
 
     {
 
 
 
         printf("TCP TABLE\r\n");
 
 
 
         printf("%20s %10s %20s %10s %s\r\n", "Loc Addr", "Loc Port", "Rem Addr",
 
 
 
                 "Rem Port", "State");
 
 
 
         for (UINT i = 0; i < pTcpTable->dwNumEntries; ++i)
 
 
 
         {
 
 
 
             switch (pTcpTable->table[i].dwState)
 
 
 
             {
 
 
 
             case MIB_TCP_STATE_CLOSED:
 
 
 
                 strcpy(strState, "CLOSED");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_TIME_WAIT:
 
 
 
                 strcpy(strState, "TIME_WAIT");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_LAST_ACK:
 
 
 
                 strcpy(strState, "LAST_ACK");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_CLOSING:
 
 
 
                 strcpy(strState, "CLOSING");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_CLOSE_WAIT:
 
 
 
                 strcpy(strState, "CLOSE_WAIT");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_FIN_WAIT1:
 
 
 
                 strcpy(strState, "FIN_WAIT1");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_ESTAB:
 
 
 
                 strcpy(strState, "ESTABLISHED");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_SYN_RCVD:
 
 
 
                 strcpy(strState, "SYN_RCVD");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_SYN_SENT:
 
 
 
                 strcpy(strState, "SYN_SENT");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_LISTEN:
 
 
 
                 strcpy(strState, "LISTEN");
 
 
 
                 break;
 
 
 
             case MIB_TCP_STATE_DELETE_TCB:
 
 
 
                 strcpy(strState, "DELETE");
 
 
 
                 break;
 
 
 
             default:
 
 
 
                 printf("UNKNOWN\n\r");
 
 
 
                 break;
 
 
 
             }
 
 
 
             inadLocal.s_addr = pTcpTable->table[i].dwLocalAddr;
 
 
 
             if (strcmp(strState, "LISTEN") != 0)
 
 
 
             {
 
 
 
                 dwRemotePort = pTcpTable->table[i].dwRemotePort;
 
 
 
             }
 
 
 
             else
 
 
 
                 dwRemotePort = 0;
 
 
 
             inadRemote.s_addr = pTcpTable->table[i].dwRemoteAddr;
 
 
 
             strcpy(szLocalIp, inet_ntoa(inadLocal));
 
 
 
             strcpy(szRemIp, inet_ntoa(inadRemote));
 
 
 
             printf("%20s %10u %20s %10u %s\r\n",
 
 
 
                 szLocalIp,  ntohs((unsigned short)(0x0000FFFF & pTcpTable->table[i].dwLocalPort)),
 
 
 
                 szRemIp, ntohs((unsigned short)(0x0000FFFF & dwRemotePort)),
 
 
 
                 strState);
 
 
 
         }
 
 
 
     }
 
 
 
 }
 
 
 
 //---------------------------------------------------------------------------
 
 
 
 int main(int argc, char* argv[])
 
 
 
 {
 
 
 
   WSADATA WSAData;
 
 
 
   if (!WSAStartup(MAKEWORD(1,1),&WSAData))
 
 
 
      {
 
 
 
      printf("WSA started seccessfully!\r\n");
 
 
 
      PMIB_TCPTABLE pTcpTable = NULL;
 
 
 
      DWORD dwActualSize = 0;
 
 
 
      DWORD status = NO_ERROR;
 
 
 
      status = GetTcpTable(pTcpTable, &dwActualSize, TRUE);
 
 
 
      if (status == NOERROR) printf("Success!\r\n");
 
 
 
      else if (status == ERROR_INSUFFICIENT_BUFFER)
 
 
 
         {
 
 
 
         printf("Error memory! %u %u\r\n",dwActualSize, sizeof(*pTcpTable));
 
 
 
         pTcpTable = (PMIB_TCPTABLE) malloc(dwActualSize);
 
 
 
         status = GetTcpTable(pTcpTable, &dwActualSize, TRUE);
 
 
 
         if (status == NOERROR) printf("taki Success!\r\n");
 
 
 
         PrintTcpTable(pTcpTable);
 
 
 
         };
 
 
 
      if (pTcpTable)
 
 
 
         free(pTcpTable);
 
 
 
      getchar();
 
 
 
      WSACleanup();
 
 
 
      };
 
 
 
   return 0;
 
 
 
 }
 
 
 
 //---------------------------------------------------------------------------


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS