На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Орущий снифер
      Почему при работе следующего кода, когда идут пакеты, начинает "орать" динамик в системнике?
      ExpandedWrap disabled
        void ShowNetwork(HANDLE hStdout) // hStdout - Хэндл командной строки
        {
            char Buffer[MAX_PACKET_SIZE]; // Буфер для приёма данных, 64 Kb
         
            WSADATA lpWSAData;            // Инициализация WinSock
            SOCKET s;                     // Cлущающий сокет
            CHAR szHostName[MAX_PATH];    // Имя хоста (компьютера)
            HOSTENT* pHost;               // Информация о хосте
            SOCKADDR_IN sa;               // Адрес хоста
            IN_ADDR sa1;                  //
            unsigned long flag = 1;       // Флаг PROMISC Вкл/выкл
            DWORD dwBytesWritten;
         
            // инициализация
            if (WSAStartup(MAKEWORD(2, 2), &lpWSAData)==0)
            {
                s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
                gethostname(szHostName, sizeof(szHostName));
                pHost = gethostbyname(szHostName);
                ZeroMemory(&sa, sizeof(sa));
                sa.sin_family = AF_INET;
                sa.sin_addr.s_addr = ((struct in_addr *)pHost->h_addr_list[0])->s_addr;
                bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
         
                // Включение promiscuous mode
                ioctlsocket(s, SIO_RCVALL, &flag);
         
                // Бесконечный цикл приёма IP-пакетов
                while (1 > 0)
                {
                    int iCount = recv(s,Buffer,65536,0);
                    
                    WriteFile(hStdout, (LPCVOID)Buffer, iCount, &dwBytesWritten, 0);
         
                    printf("\n"); // next line
                }
         
                //Off
                flag = 0;
                ioctlsocket(s, SIO_RCVALL, &flag);
                closesocket(s);
                WSACleanup();
            }

      Если не использовать WriteFile то такого эффекта нет.
        Цитата vtg @
        Если не использовать WriteFile то такого эффекта нет.


        Цитата vtg @
        WriteFile(hStdout, (LPCVOID)Buffer, iCount, &dwBytesWritten, 0);

        здесь на консоль выдается последовательность символов,
        среди них встречается символ beep ('\b' - кажется)
        при выводе данного символа на консоль в динамики выдается звуковой сигнал.
        Видимо среди байтов пакетов встречаются байты со значением равным значению символа beep
          Интересно, не знал. Но странно, что звуковой сигнал выдаётся на каждом пакете. Неужели '\b' или что-то в этом роде встречается в каждом?
            Ты в файл запиши байты и посмотри, сколько из них "бипов" :)
              Цитата
              Ты в файл запиши байты и посмотри, сколько из них "бипов" :)

              А в консоли посмотреть нельзя? Или они там не отображаются?
              И как точно должен выглядеть этот символ?
                Цитата vtg @
                И как точно должен выглядеть этот символ?

                он никогда не отображается
                  Как тогда лучше вывести содержимое пакета на консоль без звука (в HEX и текстовом виде)?
                  Полагаю, что через printf(wsprintf). Но у меня что-то не получается (толком не умею обращаться с этими функциями). Можно пример?
                    Может быть нет смысла отображать непечатаемые символы? Делать дополнительную проверку, если символ в нужном диапазоне - выводить в виде текста. Иначе в Hex. По-моему, делается с помощью %x.
                    Сообщение отредактировано: Waltz -
                      Цитата
                      Может быть нет смысла отображать непечатаемые символы? Делать дополнительную проверку, если символ в нужном диапазоне - выводить в виде текста. Иначе в Hex. По-моему, делается с помощью %x.

                      Можно пример?
                        Наипростейший вариант:

                        ExpandedWrap disabled
                          char InData[SIZE];        // Данные
                           
                          ...
                           
                          {
                              for (int i = 0; i < SIZE; i++)
                              {
                                  if (InData[i] > 0x20)
                                  {
                                      // Можно выводить данный символ, так как он петачаемый
                                  }
                                  else
                                  {
                                      // Символы в диапазоне от 0x00 до 0x20 - невидимые
                                      // Печатаем hex-значение
                                      printf("%x\", InData[i]);
                                  }
                              }
                          }


                        Примерно так.
                        Сообщение отредактировано: Waltz -
                          Зачем в printf("%x\", InData[i]); символ "\"? У меня в MSVS 2008 он отменяет кавычку и получается синтаксическая ошибка.

                          При работе printf("%x", Buffer[i]); у меня иногда проскакивают восьмизначные числа. Почему?
                          Сообщение отредактировано: vtg -
                            Цитата vtg @
                            Почему?
                            Знаковое расширение char в int.

                            Добавлено
                            лучше всего - изменить декларацию на
                            ExpandedWrap disabled
                              unsigned char InData[SIZE];


                            Добавлено
                            P.S. Спецсимволы надо как-то выделять, иначе ты не отличишь группу печатных символов от одного непечатного.
                              Следующия функция должна форматировать данные буфера в текст, пропуская "бипы", но прога вылетает.
                              ExpandedWrap disabled
                                void DataToText(LPTSTR lpszBuffer, LPCTSTR lpBuffer, int iSizeBuffer)
                                {
                                    for (int i = 0; i < iSizeBuffer; i++)
                                    {
                                        if (lpBuffer[i] != 0x07) //0x07 is beep
                                        {
                                            wsprintf((LPTSTR)lpszBuffer[i], _T("%c"), lpBuffer[i]);
                                        }
                                    }
                                }

                              Что не так?
                                Нет, все-таки это непреложная истина - программировать надо начинать с прочтения хороших умных книг.

                                1) ты уж определись, TCHAR тебе нужен или wchar_t;
                                2) wsprintf здесь абсолютно не нужен;
                                3) преобразовывать TCHAR в TCHAR* - естественно работать не будет.
                                  vtg А чем тебе std::string не угодил?
                                  Цитата vtg @
                                  LPTSTR lpszBuffer, LPCTSTR lpBuffer
                                  или в конце концов char или wchar_t зачем Win переопределения юзаеш?
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


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