На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Сниффер в windows
      Пытаюсь написать сниффер для винды, проблема вот в чем, он прекрасно ловит все пакеты в моей подсетке, и входящие из других, а вот исходящие в другие подсети не видит. Вот главная часть кода :

      ExpandedWrap disabled
        sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
         
        ZeroMemory(&saddr, sizeof(saddr));
         
        saddr.sin_family = AF_INET ;
        saddr.sin_addr.S_un.S_addr = inet_addr("moi_lokalnii_ip");
         
        bind(sock, (sockaddr *)&saddr, sizeof(sockaddr));
         
        u_long flag = 1;
        ioctlsocket(sock, SIO_RCVALL, &flag);
         
        while (true)
        {
           cnt = recv(sock, buf, MAXBUFSIZE, 0);
                        //........обрабатываем принятый пакет
        }


      M
      Тег CODE!
      Сообщение отредактировано: Leprecon -
        А на карточку пакеты приходят? По идее предоставленный код должен их перехватывать. Проверь сетевым монитором.
          Ниже приведён полный код программы. Данный код не претендует на звание крутого снифера, однако при желании его можно доработать, чтобы можно было просматривать содержимое пакетов. Так же на его основе можно легко сделать простой анализатор трафика. А главное - не надо делать всяких драйверов; всё просто и понятно.

          Суть этого сниффера заключается в том, что используются сокеты второй версии и созданный сокет переводится в режим promiscuous (прослушивания).

          ExpandedWrap disabled
            #include <conio.h>
            #include <stdio.h>
            #include <winsock2.h>
             
            #define MAX_PACKET_SIZE    0x10000
            #define SIO_RCVALL         0x98000001
            // Буфер для приёма данных
            char Buffer[MAX_PACKET_SIZE]; // 64 Kb
             
            //Структура заголовка IP-пакета
             
            typedef struct IPHeader {
              UCHAR   iph_verlen;   // версия и длина заголовка
              UCHAR   iph_tos;      // тип сервиса
              USHORT  iph_length;   // длина всего пакета
              USHORT  iph_id;       // Идентификация
              USHORT  iph_offset;   // флаги и смещения
              UCHAR   iph_ttl;      // время жизни пакета
              UCHAR   iph_protocol; // протокол
              USHORT  iph_xsum;     // контрольная сумма
              ULONG   iph_src;      // IP-адрес отправителя
              ULONG   iph_dest;     // IP-адрес назначения
            } IPHeader;
             
            char src[10];
            char dest[10];
            char ds[15];
            unsigned short lowbyte;
            unsigned short hibyte;
             
            void main()
            {
              WSADATA     wsadata;   // Инициализация WinSock.
              SOCKET      s;         // Cлущающий сокет.
              char        name[128]; // Имя хоста (компьютера).
              HOSTENT*    phe;       // Информация о хосте.
              SOCKADDR_IN sa;        // Адрес хоста
              IN_ADDR sa1;        //
              unsigned long        flag = 1;  // Флаг PROMISC Вкл/выкл.
             
              // инициализация
              WSAStartup(MAKEWORD(2,2), &wsadata);
              s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
              gethostname(name, sizeof(name));
              phe = gethostbyname( name );
              ZeroMemory( &sa, sizeof(sa) );
              sa.sin_family = AF_INET;
              sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
              bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
              
              // Включение promiscuous mode.
              ioctlsocket(s, SIO_RCVALL, &flag);
             
              // Бесконечный цикл приёма IP-пакетов.
              while( !_kbhit() )
              {
                int count;
                count = recv( s, Buffer, sizeof(Buffer), 0 );
                // обработка IP-пакета
                if( count >= sizeof(IPHeader) )
                {
                  IPHeader* hdr = (IPHeader *)Buffer;
                  //Начинаем разбор пакета...
             
                strcpy(src,"Пакет: ");
                CharToOem(src,dest);
                printf(dest);
                // Преобразуем в понятный вид адрес отправителя.
                printf("From ");
                sa1.s_addr = hdr->iph_src;
                printf(inet_ntoa(sa1));
             
                // Преобразуем в понятный вид адрес получателя.
                printf(" To ");
                sa1.s_addr = hdr->iph_dest;
                printf(inet_ntoa(sa1));
             
                // Вычисляем протокол. Полный список этих констант
                // содержится в файле winsock2.h
                printf(" Prot: ");
                if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
                if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
             
                // Вычисляем размер. Так как в сети принят прямой порядок
                // байтов, а не обратный, то прийдётся поменять байты местами.
                printf("Size: ");
                lowbyte = hdr->iph_length>>8;
                hibyte = hdr->iph_length<<8;
                hibyte = hibyte + lowbyte;
                printf("%s",itoa(hibyte,"",10));
             
                // Вычисляем время жизни пакета.
                printf(" TTL:%s",itoa(hdr->iph_ttl,"",10));
                printf("\n");
             
                }
              }
             
              closesocket( s );
              WSACleanup();
            }


          Для успешной компиляции, необходимо подключить к проекту файл ws2_32.lib.
          Сообщение отредактировано: IEZ -
            Скорее всего этот код и был взят за основу...
              Да я пользовался именно этим кодом. А насчет пакетов - да он приходят, с этим все нормально.
                Извиняюсь, не совсем точно описал ситуацию, исходящие пакеты в моей подсети тоже не перехватываются. Кстати выше приведенный код тоже не позволяет перехватывать исходящие пакеты, возникает вопрос - может быть этот сниффер фиксирует только входящие пакеты? С другой стороны все должно работать...
                  brus
                  А какая винда?
                  Неразборчивый режим не все версии поддерживают
                    2 Oleg2004: OSb XP SP1, режим поддерживает. Вопрос тогда такой - у кого нибудь этот снифф ловит исходящие пакеты? P.S. В предоставленном исходнике нужно исправить несколько строк в конце, иначе не компилится, но лучше, начная с вычисления размера все удалить.
                      Все. Я разобрался. Спаисбо всем откликнувшимся. Ести кому интересна данная тема советую заглянуть сюда http://www.xakep.ru/post/16494/default.asp
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0293 ]   [ 16 queries used ]   [ Generated: 1.05.24, 19:09 GMT ]