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

    Стоит такая задача нужно принимать все входящие пакеты которые приходят с интернета к разного рода программам) притом пункт номер 2 этой задачи заключается в том что реализоать надо на C++.NET, потому что впоследмтвии эта часть будет интегрирована к большой программе.

    Вот пытался тут чето химичить, ни нихрена не работает:

    ExpandedWrap disabled
      #include "stdafx.h"
       
      #using <mscorlib.dll>
       
      #include <winsock2.h>
      //Включаем ws2_32.lib для использования функций WinSock2
      #pragma comment(lib, "ws2_32.lib")
      //Включаем netapi32.lib для использования функций NetApi
      #pragma comment(lib, "netapi32.lib")
       
       
      using namespace System;
      using namespace System::Net::Sockets;
      using namespace System::Net;
       
       
      #define SIO_RCVALL 0x98000001
       
      typedef struct IPHeader
      {
          Byte iph_verlen;         // версия и длина заголовка
          Byte iph_tos;      // тип сервиса
          UInt16 iph_length;  // длина всего пакета
          UInt16 iph_id;      // Идентификация
          UInt16 iph_offset;  // флаги и смещения
          Byte iph_ttl;      // время жизни пакета
          Byte iph_protocol;     // протокол
          UInt16 iph_xsum;          // контрольная сумма
          UInt64 iph_src;      // IP-адрес отправителя
          UInt64 iph_dest;     // IP-адрес назначения
      }IPHeader;
       
       
       
      int main()
      {
      //Cоздаем и биндим сокет
      Socket * sock = new Socket(AddressFamily::InterNetwork, SocketType::Raw, ProtocolType::IP);
      IPEndPoint * ipEP = new IPEndPoint(Dns::GetHostByName(Dns::GetHostName())->AddressList[1], 2020);
      sock->Bind(ipEP);
      //Включаем опцию получать все пакеты
      sock->SetSocketOption(SocketOptionLevel::IP, SocketOptionName::HeaderIncluded, 1);
      Byte outValue[] = BitConverter::GetBytes(0);
      Byte inValue[] = BitConverter::GetBytes(1);
      sock->IOControl(SIO_RCVALL, inValue, outValue );
      /////////////////////////////////////////
       
      int size;
      Byte buff[];
      buff = new Byte[65535];
      char * ch = new char[65535];
      IPHeader * hdr;
      while (true)
      {
      size = sock->Receive(buff);
      if(size >= sizeof(hdr))
      {
      // конвертирование Byte[] в CHAR
      for(int i = 0; i < size; i++)
      ch[i] = buff[i];
      //Получаем структуру IPHeader
      hdr = (IPHeader*)ch;
      //Поулчаем адреса отправителя и получателя
      in_addr ia;
                  ia.s_addr = hdr->iph_dest;
      char * pszTargetIP = inet_ntoa(ia);
      ia.s_addr = hdr->iph_src;
          char *pszSourceIP = inet_ntoa(ia);
       
      Console::WriteLine("{0}{1}{2}",Convert::ToString(pszSourceIP) , S"->", Convert::ToString(pszTargetIP));
      }
      }
       
      Console::ReadLine();
      sock->Close();
      return 0;
      }



    Надеюсь на вашу помощь.

    Заранее спасибо.
    С уважением Алексей.
      http://www.microolap.com/products/network/pssdk/examples.php посмотри тут (внизу страницы линки на исходники) может поможет.
        juice Спасибо ща буду смотреть. Надеюсь поможет.
          Пока ничем не помогло, если можно, поактивнее высказывайте предложение. Очень срочно надо :wall: :wall:
            Цитата
            Вот пытался тут чето химичить, ни нихрена не работает:

            Не ловит вообще или пропускает пакеты? У меня на C# тоже с Raw сокетом снифер ловит пакеты но не все :(
            Копирую фильм по сети а снифер (только считает количество пакетов и объём переданных данных) не правильно указывает объём сетевого трафика. Может кто встречался с таким глюком?

            Фрагмент кода:
            ExpandedWrap disabled
              FmainSocket = new Socket( AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP );
              FmainSocket.Bind( new IPEndPoint( IPAddress.Parse( FcaptureIP ), 0 ) );
              FmainSocket.SetSocketOption( SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true );
              byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
              byte[] byOut = new byte[4];
              FmainSocket.IOControl( IOControlCode.ReceiveAll, byTrue, byOut );
              FmainSocket.BeginReceive( FreceiveBuf, 0, FreceiveBuf.Length, SocketFlags.None, new AsyncCallback( OnReceive ), null );
               
              private void OnReceive ( IAsyncResult _ar ) {
              int vReceived = FmainSocket.EndReceive( _ar );
              byte[] vReceiveBuf = FreceiveBuf;
              // отпарсить принятое
              ParseData( vReceiveBuf, vReceived );
              FreceiveBuf = new byte[CmaxPacketSize];
              FmainSocket.BeginReceive( FreceiveBuf, 0, FreceiveBuf.Length, SocketFlags.None, new AsyncCallback( OnReceiv ), null );
              }
               
               
              private void ParseData ( byte[] _receiveBuf, int _Received ) {
              lock(this){
              CapturedPackets++;
              CapturedBytes += _Received;
              }
              }
              У меня ваще не ловит пакеты(
                Цитата

                IPEndPoint * ipEP = new IPEndPoint(Dns::GetHostByName(Dns::GetHostName())->AddressList[1], 2020);
                sock->Bind(ipEP);

                Попробуй
                Dns::GetHostName())->AddressList[1]
                заменить на строку с адресом. Может быть "127.0.0.1" слушать пытаешься.
                  Всем, кто искренне пытался помочь спасибо, то что нужно уже написано, если интересно могу выложить, но возник еще один маленький вопросик, вот получил я пакет, а мне надо из него тело достать. так вот пакет у меня в переменной типа Byte[], а мне надо его вывести в listBox, допустим, так вот если я просто пишу:
                  ExpandedWrap disabled
                    listBox->Items->Add(buf->ToString());

                  то в listBox е у меня выводится строка System.Byte[], что не особо меня устраивает, точнее ваще не устраивает, и отсюда вопрос: Можно как нибудь преобразовать массив Byte[] в String?
                    Можно. В зависимости от того, что у тебя там в пакете

                    попробуй:

                    ExpandedWrap disabled
                                  string str = BitConverter.ToString(source, 0, source.Length);
                                  string str = Encoding.UTF8.GetString(source, 0, source.Length);

                    где, source твой массив байт.
                    Сообщение отредактировано: juice -
                      juice спасибо, ;) осталось только с кодировкой разобраться :huh:
                        Цитата MsAlex @
                        juice спасибо

                        Незачто ;)
                        Цитата MsAlex @
                        осталось только с кодировкой разобраться

                        ASC|| ?

                        Есть возможность получать кодировки по кодовой странице, славноизвестная cp1251
                        string str = Encoding.GetEncoding(1251).GetString(source, 0, source.Length);

                        Удачи :)
                          Так и не получилось у меня подобрать кодировку :angry:(проверял на аське и мэйл агенте) , поэтому вынужден просить о помощи... Выкладываю проект. Разбор пакета идет в функции
                          ExpandedWrap disabled
                            void Receive(Byte buf[], int len)
                          которая находится в файле RawSocket.h

                          По ходу разбирательства с пакетами возникло еще парав вопросов:
                          1)
                          ExpandedWrap disabled
                            Net::IPHostEntry * HE = Dns::Resolve(Dns::GetHostName();
                            if(HE->AddressList->Length > 0)
                            {
                                   IP = HE->AddressList[1]->ToString();
                            }

                          Здесь, то что инет это AddressList[1] подбиралось методом тыка <_< , вопрос: как определить какой адрес инетовский, а какой локальной домашней сети?

                          2) Как проверять наличие подключение к интернету, например в случае обрыва связи? :huh:

                          3) Как отлавливать исходящие пакеты, ибо судя по логу, моя программа ловит только входящие... :no-sad:

                          Надеюсь на вашу помощь. :yes: Заранее спасибо. :wall:
                          Прикреплённый файлПрикреплённый файлsniffer.rar (12.19 Кбайт, скачиваний: 123)
                            Ребят, помогите, очень надо, уже 3 дня бьюсь над это кодировкой, ничего не могу придумать. горит!!! :wall: :wall:
                              Все! главная проблема решена! Нашел я ошибку, только не понял почему так надо. Те кто скачал проект, может видели строчки
                              ExpandedWrap disabled
                                ...
                                e->message_length = (UInt32)len - e->header_length;
                                ...
                                Array::Copy(buf, (int)e->header_length, e->message_bytes, 0, (int)e->message_length);


                              так вот их следовадо заменить на
                              ExpandedWrap disabled
                                ...
                                e->message_length = (UInt32)len - 2*(e->header_length);
                                ...
                                Array::Copy(buf, 2*((int)e->header_length), e->message_bytes, 0, (int)e->message_length);


                              Кто знает почему, прошу ответ в студию. :yes:

                              Нуи остались еще 2 нерешенных вопроса, как проверять наличие подключения к интернету и отлавливать исходящие пакеты.
                                Цитата MsAlex @
                                Кто знает почему, прошу ответ в студию.

                                Потому, что в unicode 2 байта на символ.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0572 ]   [ 16 queries used ]   [ Generated: 7.05.24, 22:52 GMT ]