На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Сокеты , как сделать?
      В общем появилась у меня необходимость в прослушивании сокета другой программы . Эту задачу можно решить с помощью сниффера но вопервых они все треубт установки специального драйвера чт оне удобно во творых они ловят все пакеты дае не предназначенные для это машины и уж темболее программы да и еще там много "мусора". Мне же необходимо делать это толкьо локально . Нашел кусок исходника в интернете но он ловит только входящие пакеты icon_sad.gif и все для этой машина а не для программы. Вот собсвенно и вопрос если возможность слушать сокет другой программы ? Если это важно то предполагаю это чудо наваять на VS2005 icon_cool.gif . В интернете ничего дельного не нашел по теме icon_wall.gif уже третий день воюю. Кто сталкивался хоть линками полезными помоги прямо и не знаю куда копать.Ведь есл иможно даже память чужого процесса читать без его ведома значит и с сокетами чтото такое должно быть.
      Да я новичек в вопросе поэтому сильно не пинайте :rolleyes:
        Поискать на сайте sources.ru исходники снифера. Они там есть.
          На сайте есть исходник сниффера без дополнительных библиотек.
          А чтобы "слушать" данные определенного сокета, можно парсить IP пакет и выбирать только те пакеты, которые идут на порт, который слушает сокет.
            Можно еще перехватить win sock api
              win2000, winxp поддерживают raw sockets, при помощи которых можно снифить че попало без сторонних библиотек.
              кстати, загляни на sysinternals.com, там есть куча полезных системных прог и иногда с исходниками;)
                Цитата Slimy @
                В общем появилась у меня необходимость в прослушивании сокета другой программы .

                И эта программа стоит на этом же самом компе?
                Те я имею в виду - одной программой локально (на одной машине) слушать сокет другой программы на этой машине?
                  Цитата Oleg2004 @
                  Цитата Slimy @
                  В общем появилась у меня необходимость в прослушивании сокета другой программы .

                  И эта программа стоит на этом же самом компе?
                  Те я имею в виду - одной программой локально (на одной машине) слушать сокет другой программы на этой машине?

                  Да именно на тойже самой машине т.е. программа которыю надо слушать и которая должна слушать крутятся на одной машине вот. Насчет снифера я уже написал почему это плохо,а вот идея с raw меня заинтересовала. Киньте ссылочкой на руском или примером пользования такого сокета. Спасибо :)
                  Сообщение отредактировано: Slimy -
                    Цитата Slimy @
                    идея с raw меня заинтересовала

                    Raw-сокеты этого сделать не смогут - они поднимают на сетевой уровень то, что приходит на сетевую карту по кабелю.
                    Для вас единственная альтернатива - перехват - или драйвер - или LSP
                    Цитата LuckLess @
                    Можно еще перехватить win sock api
                      Хм с raw проблема нашел исходник
                      ExpandedWrap disabled
                        #include "stdafx.h"
                        #include <cstdlib>  // для system();
                         
                         
                        typedef struct _IPHeader
                        {
                            unsigned char verlen; // версия и длина заголовка
                            unsigned char tos; // тип сервиса
                            unsigned short length; // длина всего пакета
                            unsigned short id; // Id
                            unsigned short offset; // флаги и смещения
                            unsigned char ttl; // время жизни
                            unsigned char protocol; // протокол
                            unsigned short xsum; // контрольная сумма
                            unsigned long src; // IP-адрес отправителя
                            unsigned long dest; // IP-адрес назначения
                        }IPHeader;
                         
                        #define SIO_RCVALL 0x98000001
                         
                        #define MAX_PACKET_SIZE 0x10000
                        // Буфер для приёма данных
                        static char Buffer[MAX_PACKET_SIZE]; // 64 Kb
                         
                        int main()
                        {
                            WSADATA wsadata; // Инициализация WinSock.
                            SOCKET s; // Cлущающий сокет.
                            char name[128]; // Имя хоста (компьютера).
                            HOSTENT* phe; // Информация о хосте.
                            SOCKADDR_IN sa; // Адрес хоста
                            unsigned long flag = 1; // Флаг PROMISC Вкл/выкл.
                         
                            // инициализация
                            WSAStartup(MAKEWORD(2,2), &wsadata);
                            s = socket( AF_INET, SOCK_RAW, IPPROTO_IP ); // RAW SOCKET
                            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;
                         
                                    printf("packet:from %d.%d.%d.%d\tto %d.%d.%d.%d\n",
                                    hdr->src&0x000000ff,
                                    (hdr->src&0x0000ff00)>>8,
                                    (hdr->src&0x00ff0000)>>16,
                                    (hdr->src&0xff000000)>>24,
                                    hdr->dest&0x000000ff,
                                    (hdr->dest&0x0000ff00)>>8,
                                    (hdr->dest&0x00ff0000)>>16,
                                    (hdr->dest&0xff000000)>>24
                                    );
                         
                         
                                //что-то делаем с пакетом...
                                }
                            }
                            // Конец работы.
                            closesocket( s );
                            WSACleanup();
                         
                         
                        //========= delay ============
                            system("PAUSE");
                            return EXIT_SUCCESS;  
                        //========== end ==============
                         
                        }

                      Так вот это ловит почемуто только входящие пакеты :(. Исходящих почему-то нет, почему? нашел еще статью Но там почему-то ошибка входа в promisc mode. Странно то что строка перевода в этом режиме в двух программах одинаковая. К томуже во второй программе реализована фильрация и собственно получаение самих полезных данных пакета. Я чтото так ине смог разобратся как именно? В MSDN чтото не густо на эту тему. :wall:
                      Цитата
                      Raw-сокеты этого сделать не смогут - они поднимают на сетевой уровень то, что приходит на сетевую карту по кабелю.
                      Для вас единственная альтернатива - перехват - или драйвер - или LSP

                      Хм я не не сатолько крут в программирование к сожелению :(. Если наложить фильтр на информацию то можно получить исхкомые данные (ну в теории именно так ) .Еще маленький вопрос для чтения данных везде применяется бесконечный цикл что навернео очень плохо сточки зрения занятости процессора нет ли какого механизма прерываний или событий чтобы программа читала данные только тогда когда они дествительно приняты.
                      Сообщение отредактировано: Slimy -
                        Цитата Slimy @
                        Так вот это ловит почемуто только входящие пакеты

                        Так оно и должно быть :yes:
                        Цитата Slimy @
                        Исходящих почему-то нет, почему?

                        Потому что сниффер на равсокетах ловит только то, что приходит извне :D
                        Профессиональные снифферы эту технологию не используют
                        Цитата Slimy @
                        нет ли какого механизма прерываний или событий чтобы программа читала данные только тогда когда они дествительно приняты.

                        Конечно есть - это select() - работает и в виндах и в юниксе ( в линуксе еще и poll)
                        или события в виндах - WsaEventSelect()
                        Впрочем в виндовс есть 7 моделей сетевого ввода/вывода :D
                          Есть такая идея:
                          Ставиш на этот же комп еще и прокси-сервер (socks5), затем с помощью проги ProxyCap,FreeCap,SocksCap и т.п. пускаешь прогу которую нужно "слушать" через сокс.
                          А в соксе включаеш логирование, например в файл.
                          Все.

                          Пробуй ;)

                          Добавлено
                          Или. Инжектишся в процесс проги, и перехватываешь ф-ии работы с сокетами.
                            Цитата Jenizix @
                            Есть такая идея:
                            Ставиш на этот же комп еще и прокси-сервер (socks5), затем с помощью проги ProxyCap,FreeCap,SocksCap и т.п. пускаешь прогу которую нужно "слушать" через сокс.
                            А в соксе включаеш логирование, например в файл.
                            Все.

                            Пробуй ;)

                            Добавлено
                            Или. Инжектишся в процесс проги, и перехватываешь ф-ии работы с сокетами.

                            круто! вы вообще читаете что я пишу :wall: ? Если даже драйвер не хотелось бы ставить (но видать придется), а тут мне сервер прикрутить советуют. Может еще вторую машину на linux поднять и в iptables отлавливать то, что нужно и пересылать обратно на другой порт? Ну бред ей богу. Я просил просто про механизм который бы смог отлавить пакеты путь не по проге, но по порту и только локально т.е. то что идет с этой машины и то что кней приходит. :unsure: Весь остальной траффик мне не интересен. Так а через winapi как перехват сделать?
                            Сообщение отредактировано: Slimy -
                              Поиск рулит :D
                                Цитата Oleg2004 @
                                Поиск рулит :D

                                Нет не рулит. Я попросил чтото конкретное. С темже успехом меня можно отправить в гугл :angry:(кстати регулярно бываю там, по этому и не только вопросу) . Я ведь только учусь, а там столько лишней информации. К томуже я даже в теории не представляю как это происходит? :huh: Объяните хоть.
                                Сообщение отредактировано: Slimy -
                                  Цитата Slimy @
                                  Я попросил чтото конкретное

                                  Вы просили вот это:
                                  Цитата Slimy @
                                  через winapi как перехват сделать?

                                  не так ли?
                                  Я не могу - да и наврядли кто другой сможет - рассказать вам (прочитать курс) перехвата функций Win API - по причине того, что это форум, а не институт или университет - просто времени нет у меня и людей
                                  Единственно чем могу помочь в этом вопросе - отослать вам кучу материалов на эту тему - которые вы должны освоить самостоятельно -
                                  Цитата Slimy @
                                  Я просил просто про механизм который бы смог отлавить пакеты путь не по проге, но по порту и только локально т.е. то что идет с этой машины и то что к ней приходит.

                                  Этот механизм вам практически известен - приходящие пакеты вы отлавливаете сниффером - уходящие с помощью перехвата функции send()(WSASend)
                                  Или без сниффера - перехват recv() - приходящие - и send() - уходящие
                                  Далее -
                                  Цитата
                                  не по проге, а по порту

                                  Это можно сделать только драйвером или LSP
                                  Цитата Slimy @
                                  Я ведь только учусь, а там столько лишней информации. К томуже я даже в теории не представляю как это происходит?

                                  Поэтому и никак это у вас быстро не получится - надо читать и разбираться
                                  Как я уже сказал, по перехвату могу вам отослать на мыло - давайте его в ПМ
                                    Я у себя проделовал такой трюк:
                                    Пишем простецкий прокси, который тупо все пишет в файл. В проге, которую слушаем, прописываем локальный адрес и порт нашего сервера (можно и через HEX-редактор все сделать, если в проге настроек нет), а в исходниках нашего прокси указываем конечный адрес.
                                      Цитата
                                      Вы просили вот это:

                                      Цитата (Slimy @ Вчера, 00:01)
                                      через winapi как перехват сделать?

                                      не так ли?


                                      Не совсем так. Я попросил помощи по вопросу перехвата данных локальной програмы от от локальной программы а как это сделать предложили вы.

                                      Цитата
                                      Я не могу - да и наврядли кто другой сможет - рассказать вам (прочитать курс) перехвата функций Win API - по причине того, что это форум, а не институт или университет - просто времени нет у меня и людей
                                      Единственно чем могу помочь в этом вопросе - отослать вам кучу материалов на эту тему - которые вы должны освоить самостоятельно

                                      Там все так бесконечно сложно? Это огорчает. В универе таких лекций не читают могу вас заверить. Там максиму сокеты, безовсяких тонкостей.
                                      В про чем кидайте информацию, что есть почитаю постарась понять хотя например загадка в том как сделать этот перехват избирательным ведь системным вызовом будут пользоватся и другие программы котореы перехватчик добросоветсно тоже перехватит.

                                      Вообще вариант с драйвермо в сети я нашел. Кто знает как этот жрайвер поставить в систему доупустим через скрипт а не кликаньем мышки? или через эту программу?
                                      И последное точно нет возможности перенастроить сокет чтобы и исходящие ловил?
                                      Цитата
                                      Поэтому и никак это у вас быстро не получится - надо читать и разбираться

                                      Читаю разбирась но книжки такие толстые тут ведь и TCP знать надо а не только работу с сокетами.

                                      Вот над ругом форуме мне подсказывают про некий pcap выглядит не сложно.
                                      Сообщение отредактировано: Slimy -
                                        Цитата Slimy @
                                        Вот над другом форуме мне подсказывают про некий pcap выглядит не сложно.

                                        Это вариант - но это не перехват
                                        Capture - в переводе с английского - это захват - и winpcap в принципе просто адаптация BPF - это копирование с канального уровня того что уходит и приходит
                                        Но не перехватывает
                                        Цитата Slimy @
                                        TCP знать надо а не только работу с сокетами.

                                        Ну, сокеты и TCP-близнецы-братья :D и друг без друга жить не могут :yes:

                                        Цитата Slimy @
                                        И последное точно нет возможности перенастроить сокет чтобы и исходящие ловил?

                                        Сокет - нет.
                                        Сокет ведь высоко стоит в модели OSI - это прослойка-интерфейс - между транспортным уровнем и пользовательским уровнем
                                        Поэтому ловить надо гораздо ниже
                                        Доки отправил
                                          Цитата Oleg2004 @
                                          Это вариант - но это не перехват

                                          Хм а какая разница меня волнует результат не способ.Всерано потмо сделаю отдельную функцию и буду тупо к ней обращатся особо не впомная как она работает. Но почитал тут про этот вариант он определнно мне нравится.
                                          Хм мой впорос про установку из консоли остался без внимания. <_< наверное такой возможности нет.
                                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                          0 пользователей:


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