На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Перехват пакетов локальной сети
      Как в Windows 9x можно перехватывать все пакеты локальной сети, используя winsock?
        progr
        Посмотрите ссылку
        или наберите в "поиск" слово сниффер
          Написано, что надо переключить интерфейс на прием всех пакетов проходящих через интерфейс - promiscuous mode:
          PromiscuousMode=1;
          ioctlsocket(hSocket, SIO_RCVALL, PromiscuousMode);

          Но в winsock2.h нет SIO_RCVALL.
          Пишу на Visual C++ 6.0
            Цитата progr @
            Но в winsock2.h нет SIO_RCVALL.
            Пишу на Visual C++ 6.0


            обнови Platform SDK

            Цитата progr @
            Как в Windows 9x можно перехватывать все пакеты локальной сети, используя winsock?


            http://rsdn.ru/article/net/sniffer.xml

            Libpcap (WinPCAP)
            http://www.tcpdump.org/

            или придется писать NDIS/TDI драйвер
              progr
              SIO_RCVALL использует также функция WSAIoctl()
              А для SIO_RCVALL надо Mstcpip.h
                Но способ с переводом в promiscuous mode работает только начиная с Windows 2000 как я понял.

                Добавлено
                А мне нужно, чтобы это работало и более ранних версиях windows.
                  а что за локалка - на хабах, или свитчах?
                    Сеть из нескольких компов и больше ничего.
                      progr
                      Цитата
                      способ с переводом в promiscuous mode работает только начиная с Windows 2000

                      Не думаю - в Win98 реализована таже спецификация WinSock 2.2
                      Правда, в Visual Studio 6.0 нет Mstcpip.h, зато он есть в Borland CBuilder 6.
                      Вот его полный текст:

                      ExpandedWrap disabled
                        //  Copyright (c) Microsoft Corporation. All rights reserved.
                        #if _MSC_VER > 1000
                        #pragma once
                        #endif
                         
                        /* Argument structure for SIO_KEEPALIVE_VALS */
                         
                        struct tcp_keepalive {
                            u_long  onoff;
                            u_long  keepalivetime;
                            u_long  keepaliveinterval;
                        };
                         
                        // New WSAIoctl Options
                         
                        #define SIO_RCVALL            _WSAIOW(IOC_VENDOR,1)
                        #define SIO_RCVALL_MCAST      _WSAIOW(IOC_VENDOR,2)
                        #define SIO_RCVALL_IGMPMCAST  _WSAIOW(IOC_VENDOR,3)
                        #define SIO_KEEPALIVE_VALS    _WSAIOW(IOC_VENDOR,4)
                        #define SIO_ABSORB_RTRALERT   _WSAIOW(IOC_VENDOR,5)
                        #define SIO_UCAST_IF          _WSAIOW(IOC_VENDOR,6)
                        #define SIO_LIMIT_BROADCASTS  _WSAIOW(IOC_VENDOR,7)
                        #define SIO_INDEX_BIND        _WSAIOW(IOC_VENDOR,8)
                        #define SIO_INDEX_MCASTIF     _WSAIOW(IOC_VENDOR,9)
                        #define SIO_INDEX_ADD_MCAST   _WSAIOW(IOC_VENDOR,10)
                        #define SIO_INDEX_DEL_MCAST   _WSAIOW(IOC_VENDOR,11)
                         
                        // Values for use with SIO_RCVALL* options
                        #define RCVALL_OFF             0
                        #define RCVALL_ON              1
                        #define RCVALL_SOCKETLEVELONLY 2
                      Сообщение отредактировано: Oleg2004 -
                        Просто я написал пример, на который Mfcer__ дал ссылку и пример этот не работает. К тому же в той же статье с примером написано, что способ с переводом сетевой карты в promiscuous mode в windows 9x не работает.
                          Цитата progr @
                          Просто я написал пример, на который Mfcer__ дал ссылку и пример этот не работает. К тому же в той же статье с примером написано, что способ с переводом сетевой карты в promiscuous mode в windows 9x не работает.


                          winpcap должна работать под win9x
                            progr
                            Цитата
                            promiscuous mode в windows 9x не работает.

                            Я прочел тоже эту статью и не нашел убедительных доводов
                            К тому же термины RAW/IP RAW/TCP/UDP совершенно бессмысленны в смысле возможной поддержки со стороны системы
                            Система должна поддерживать только RAW-сокеты, и это все. Что мы будем формировать - это не ее дело. Другое дело, что программное обеспечение не содержит какие-то хедеры, функции и т.д. - но это дело поправимое со стороны программиста.
                              Я хотел бы без использования winpcap. Я подключил Mstcpip.h, но такой же облом. ioctlsocket(s,SIO_RCVALL,&flag) возвращает -1
                                progr
                                Цитата
                                ioctlsocket(s,SIO_RCVALL,&flag) возвращает -1

                                1. ioctlsocket() - это спецификация Winsock 1.1, а она RAW не поддерживает
                                2. Надо использовать уже указанную WSAIoctl()
                                3.-1 ничего не говорит о виде ошибки, после неудачного вызова всегда надо вызывать WSAGetLastError(), которая и сообщит об истинной причине - это правило написания сетевых программ №1
                                  А ты не мог бы дать пример правильного вызова WSAIoctl. А WSAGetLastError возвращает WSAEINVAL (Invalid argument) при использовании ioctlsocket.
                                    Примерно так:
                                    ExpandedWrap disabled
                                          unsigned int  optval;
                                          DWORD        dwBytesRet;
                                          ...
                                          optval = 1;
                                          if (WSAIoctl(s,
                                                       SIO_RCVALL,
                                                       &optval, sizeof(optval),
                                                       NULL,
                                                       0,
                                                       &dwBytesRet,
                                                       NULL,
                                                       NULL) == SOCKET_ERROR)
                                          {
                                              printf("WSAIotcl(%d) failed; %d\n", dwIoControlCode,
                                                                                  WSAGetLastError());
                                              return -1;
                                          }
                                      С WSAIoctl то же самое, что и с ioctlsocket. Та же самая ошибка.
                                        Что говорит WSAGetLastError?
                                          WSAGetLastError возвращает WSAEINVAL (Invalid argument) при использовании и ioctlsocket и WSAIoctl.
                                            Стоп!
                                            А ты как вызываешь WSASocket или socket, с параметром SOCK_RAW?
                                              Цитата ViGOur @
                                              SOCK_RAW?


                                              а как еще использовать сырые сокеты?
                                                Да, с SOCK_RAW
                                                  progr
                                                  Надо вызывать WSASocket()
                                                  Кстати, какую .lib вы линкуетте с проектом?
                                                  И всетаки желателен код - хотя бы основные моменты - вызов сокета, bind и все остальное с этим связанное.
                                                  Сообщение отредактировано: Oleg2004 -
                                                    хм...
                                                    1) у меня (на Win2003) SOCK_RAW и иже с ними работают на ура со стандартными функциями, без всяких WSA*
                                                    2)
                                                    Цитата progr @
                                                    К тому же в той же статье с примером написано, что способ с переводом сетевой карты в promiscuous mode в windows 9x не работает.
                                                    насколько мне известно, так оно и есть.

                                                    Цитата Oleg2004 @
                                                    И всетаки желателен код - хотя бы основные моменты - вызов сокета, bind и все остальное с этим связанное
                                                    :yes:
                                                    ioctlsocket(s,SIO_RCVALL,&flag); сработает только если предварительно был успешно вызван bind (токо в качестве IP должен быть не с ноль aka INADDR_ANY)
                                                      Да все как в статье я делал

                                                      Добавлено
                                                      С WSASocket тоже не работает. С проектом линкую ws2_32.lib
                                                        Вот тебе пример работы с raw сокетами, который работает на 100%...
                                                        И не будем гадать, что не так! ;)
                                                        Прикреплённый файлПрикреплённый файлsio_rcvall.rar (6.74 Кбайт, скачиваний: 290)
                                                          ViGOur
                                                          //#include <mstcpip.h>??? comment?

                                                          #include "mstcpip.h"
                                                          Короче скомпилил и.......... получил ту же 10022!!!
                                                          И Debug, и Release
                                                          У меня тоже Win98SE
                                                          Bind проходит, пишет интерфейс, на который биндится, и привет :o
                                                          А по каким тогда все-таки именно причине он не хочет пахать на 98-м?
                                                          Просто сказать - не пашет, и все????
                                                          Ведь винсок и все хедеры и все либы - в достатке?
                                                          В чем же идеологическая ошибка :wall:
                                                          Хочется докопаться до точной причины <_<
                                                          Сообщение отредактировано: Oleg2004 -
                                                            О чем-то говорит? :)
                                                            ExpandedWrap disabled
                                                                  if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
                                                                  {
                                                                      printf("WSAStartup() failed: %d\n", GetLastError());
                                                                      return -1;
                                                                  }
                                                              ViGOur
                                                              Ну и что?
                                                              20 раз писал, и все ОК - Winsock 2.2 на Win98 идет на раз :angry:
                                                                Помнится для этого нужно что-то доустонавливать, что не помню, мы как-то по этому поводу с Uncle_Bob'ом говорили... Он даже ссылку давал, на microsoft'овский сайт, где это описывалось, но вот никак найти не могу... :(
                                                                  ViGOur
                                                                  Было бы интересно оооччень :o
                                                                  Что то у меня какое-то внутреннее чувство, что какая-то клизма здесь есть, и четко детерминированная, неужели только winpcap на уровне NDIS? Почему :wall:
                                                                  Сообщение отредактировано: Oleg2004 -
                                                                    Цитата ViGOur @
                                                                    мы как-то по этому поводу с Uncle_Bob'ом говорили...

                                                                    Не, там было другое - ты говорил, что на W95 нет второго винсока, а я тебе ссылку на апдейт дал.
                                                                      Каюсь перепутал! :whistle:
                                                                      Но запомнил с точностью до x. :)
                                                                        Значит облом с таким способом перехвата пакетов сети в Windows 9x?
                                                                          Цитата progr @
                                                                          Значит облом с таким способом перехвата пакетов сети в Windows 9x?

                                                                          WinPCap отменно работает под WIn9x! Даже модем слушал :D
                                                                            progr
                                                                            Я тоже сожалею :wacko:
                                                                            Но обещаю - в идеологии, почему нельзя, я разберусь - если кто другой не поможет - в ближайшее время. Ведь по идее должно все работать <_<
                                                                              Насколько мне известно Win98 не поддерживает io_ctrl recv_all и поэтому RAW socket на ней не работает :yes:
                                                                                Я еще раз посмотрел в MSDN.
                                                                                SIO_RCVALL
                                                                                Enables a socket to receive all IP packets on the network. The socket handle passed to the WSAIoctl function must be of AF_INET address family, SOCK_RAW socket type, and IPPROTO_IP protocol. The socket also must be bound to an explicit local interface, which means that you cannot bind to INADDR_ANY.
                                                                                Вроде все ОК, но дальше:
                                                                                Once the socket is bound and the ioctl set, calls to the WSARecv or recv functions return IP datagrams passing through the given interface. Note that you must supply a sufficiently large buffer. Setting this ioctl requires Administrator privilege on the local computer. SIO_RCVALL is available in Windows 2000 and later versions of Windows.

                                                                                Читаем дальше:
                                                                                Some IOCTL codes require additional header files. For example, use of the SIO_RCVALL IOCTL requires the Mstcpip.h header file.
                                                                                Requirements
                                                                                Client Requires Windows XP, Windows 2000 Professional, Windows NT Workstation 3.51 and later, Windows Me, Windows 98, or Windows 95.
                                                                                Server Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server 3.51 and later.
                                                                                Header
                                                                                Declared in Winsock2.h.
                                                                                Library
                                                                                Link to Ws2_32.lib.
                                                                                DLL Requires Ws2_32.dll.
                                                                                Вот и пойми, чем это 98-ой отличается от 2000? Требования то одни и теже для клиента??? Ну может хедера Mstcpip.h нет в 98, так его можно поставить!
                                                                                Непонятки :wacko:
                                                                                  А как с помощью RAW сокетов перехватывать IPX пакеты?
                                                                                    progr
                                                                                    Для этого естественно должен быть установлен стек IPX/SPX
                                                                                    Функция сокета должна содержать адресную константу AF_IPX
                                                                                    Для стека IPX/SPX структура IPX-сокета выглядит так:
                                                                                    ExpandedWrap disabled
                                                                                      struct sockaddr_ipx
                                                                                      {
                                                                                          short sa_family;        /* Семейство AF_IPX */
                                                                                          char  sa_netnum[4];         /* Номер сети */
                                                                                          char  sa_nodenum[6];    /* Номер узла */
                                                                                          unsigned short sa_socket;
                                                                                      }

                                                                                    В остальном вроде все как и для TCP/IP
                                                                                    Вот здесь все расписано
                                                                                    Сообщение отредактировано: Oleg2004 -
                                                                                      Я пишу: SOCKET ipx_socket=socket(PF_IPX,SOCK_RAW,NSPROTO_IPX)
                                                                                      и ioctlsocket(ipx_socket,SIO_RCVALL,&flag) возвращает -1
                                                                                        progr
                                                                                        -1 в общем ни о чем не говорит, надо ставить WSAGetLastError, чтобы увидеть код ошибки.
                                                                                        А вы продолжаете все это на win98?
                                                                                          Нет, на XP
                                                                                            Цитата Oleg2004 @
                                                                                            Вот и пойми, чем это 98-ой отличается от 2000? Требования то одни и теже для клиента??? Ну может хедера Mstcpip.h нет в 98, так его можно поставить!
                                                                                            Непонятки

                                                                                            Имеется в виду, что сама функция доступна в 9x линейке. Разумеется, с оговорками, указанными напротив каждого параметра.
                                                                                              WSAGetLastError для ioctlsocket выдает WSAENOTSOCK (Socket operation on non-socket). Кстати, для bind WSAGetLastError тоже выдает WSAENOTSOCK.
                                                                                                progr
                                                                                                Значит несколько доп. инфо:
                                                                                                У вас проинсталлированы оба стека - TCP/IP и IPX/SPX?
                                                                                                Если так, то может быть конфликт, и если к тому же используется Client for Microsoft Network - последний работает только с TCP/IP
                                                                                                Может быть есть в настройках возможность указать default стек или придется убить TCP/IP, чтобы был только один стек
                                                                                                  Установлены и TCP/IP и IPX/SPX. И используется Client for Microsoft Network.
                                                                                                    progr
                                                                                                    В groups.google.com очень много постов что WinXP не по делу выдает WSANOTSOCK в основном при играх Half Life и Countеr Strike
                                                                                                    Прямо скажу - трудная проблема, и лучше всего все-таки работать а "чистой" IPX-среде, а TCP/IP снести для чистоты эксперимента
                                                                                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                                                    0 пользователей:


                                                                                                    Рейтинг@Mail.ru
                                                                                                    [ Script execution time: 0,0748 ]   [ 16 queries used ]   [ Generated: 10.12.24, 10:51 GMT ]