Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
В общем появилась у меня необходимость в прослушивании сокета другой программы . Эту задачу можно решить с помощью сниффера но вопервых они все треубт установки специального драйвера чт оне удобно во творых они ловят все пакеты дае не предназначенные для это машины и уж темболее программы да и еще там много "мусора". Мне же необходимо делать это толкьо локально . Нашел кусок исходника в интернете но он ловит только входящие пакеты icon_sad.gif и все для этой машина а не для программы. Вот собсвенно и вопрос если возможность слушать сокет другой программы ? Если это важно то предполагаю это чудо наваять на VS2005 icon_cool.gif . В интернете ничего дельного не нашел по теме icon_wall.gif уже третий день воюю. Кто сталкивался хоть линками полезными помоги прямо и не знаю куда копать.Ведь есл иможно даже память чужого процесса читать без его ведома значит и с сокетами чтото такое должно быть.
Да я новичек в вопросе поэтому сильно не пинайте |
Сообщ.
#2
,
|
|
|
Поискать на сайте sources.ru исходники снифера. Они там есть.
|
Сообщ.
#3
,
|
|
|
На сайте есть исходник сниффера без дополнительных библиотек.
А чтобы "слушать" данные определенного сокета, можно парсить IP пакет и выбирать только те пакеты, которые идут на порт, который слушает сокет. |
Сообщ.
#4
,
|
|
|
Можно еще перехватить win sock api
|
Сообщ.
#5
,
|
|
|
win2000, winxp поддерживают raw sockets, при помощи которых можно снифить че попало без сторонних библиотек.
кстати, загляни на sysinternals.com, там есть куча полезных системных прог и иногда с исходниками;) |
Сообщ.
#6
,
|
|
|
Цитата Slimy @ В общем появилась у меня необходимость в прослушивании сокета другой программы . И эта программа стоит на этом же самом компе? Те я имею в виду - одной программой локально (на одной машине) слушать сокет другой программы на этой машине? |
Сообщ.
#7
,
|
|
|
Цитата Oleg2004 @ Цитата Slimy @ В общем появилась у меня необходимость в прослушивании сокета другой программы . И эта программа стоит на этом же самом компе? Те я имею в виду - одной программой локально (на одной машине) слушать сокет другой программы на этой машине? Да именно на тойже самой машине т.е. программа которыю надо слушать и которая должна слушать крутятся на одной машине вот. Насчет снифера я уже написал почему это плохо,а вот идея с raw меня заинтересовала. Киньте ссылочкой на руском или примером пользования такого сокета. Спасибо |
Сообщ.
#8
,
|
|
|
Цитата Slimy @ идея с raw меня заинтересовала Raw-сокеты этого сделать не смогут - они поднимают на сетевой уровень то, что приходит на сетевую карту по кабелю. Для вас единственная альтернатива - перехват - или драйвер - или LSP Цитата LuckLess @ Можно еще перехватить win sock api |
Сообщ.
#9
,
|
|
|
Хм с raw проблема нашел исходник
#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 чтото не густо на эту тему. Цитата Raw-сокеты этого сделать не смогут - они поднимают на сетевой уровень то, что приходит на сетевую карту по кабелю. Для вас единственная альтернатива - перехват - или драйвер - или LSP Хм я не не сатолько крут в программирование к сожелению . Если наложить фильтр на информацию то можно получить исхкомые данные (ну в теории именно так ) .Еще маленький вопрос для чтения данных везде применяется бесконечный цикл что навернео очень плохо сточки зрения занятости процессора нет ли какого механизма прерываний или событий чтобы программа читала данные только тогда когда они дествительно приняты. |
Сообщ.
#10
,
|
|
|
Цитата Slimy @ Так вот это ловит почемуто только входящие пакеты Так оно и должно быть Цитата Slimy @ Исходящих почему-то нет, почему? Потому что сниффер на равсокетах ловит только то, что приходит извне Профессиональные снифферы эту технологию не используют Цитата Slimy @ нет ли какого механизма прерываний или событий чтобы программа читала данные только тогда когда они дествительно приняты. Конечно есть - это select() - работает и в виндах и в юниксе ( в линуксе еще и poll) или события в виндах - WsaEventSelect() Впрочем в виндовс есть 7 моделей сетевого ввода/вывода |
Сообщ.
#11
,
|
|
|
Есть такая идея:
Ставиш на этот же комп еще и прокси-сервер (socks5), затем с помощью проги ProxyCap,FreeCap,SocksCap и т.п. пускаешь прогу которую нужно "слушать" через сокс. А в соксе включаеш логирование, например в файл. Все. Пробуй Добавлено Или. Инжектишся в процесс проги, и перехватываешь ф-ии работы с сокетами. |
Сообщ.
#12
,
|
|
|
Цитата Jenizix @ Есть такая идея: Ставиш на этот же комп еще и прокси-сервер (socks5), затем с помощью проги ProxyCap,FreeCap,SocksCap и т.п. пускаешь прогу которую нужно "слушать" через сокс. А в соксе включаеш логирование, например в файл. Все. Пробуй Добавлено Или. Инжектишся в процесс проги, и перехватываешь ф-ии работы с сокетами. круто! вы вообще читаете что я пишу ? Если даже драйвер не хотелось бы ставить (но видать придется), а тут мне сервер прикрутить советуют. Может еще вторую машину на linux поднять и в iptables отлавливать то, что нужно и пересылать обратно на другой порт? Ну бред ей богу. Я просил просто про механизм который бы смог отлавить пакеты путь не по проге, но по порту и только локально т.е. то что идет с этой машины и то что кней приходит. Весь остальной траффик мне не интересен. Так а через winapi как перехват сделать? |
Сообщ.
#14
,
|
|
|
Нет не рулит. Я попросил чтото конкретное. С темже успехом меня можно отправить в гугл (кстати регулярно бываю там, по этому и не только вопросу) . Я ведь только учусь, а там столько лишней информации. К томуже я даже в теории не представляю как это происходит? Объяните хоть. |
Сообщ.
#15
,
|
|
|
Цитата Slimy @ Я попросил чтото конкретное Вы просили вот это: Цитата Slimy @ через winapi как перехват сделать? не так ли? Я не могу - да и наврядли кто другой сможет - рассказать вам (прочитать курс) перехвата функций Win API - по причине того, что это форум, а не институт или университет - просто времени нет у меня и людей Единственно чем могу помочь в этом вопросе - отослать вам кучу материалов на эту тему - которые вы должны освоить самостоятельно - Цитата Slimy @ Я просил просто про механизм который бы смог отлавить пакеты путь не по проге, но по порту и только локально т.е. то что идет с этой машины и то что к ней приходит. Этот механизм вам практически известен - приходящие пакеты вы отлавливаете сниффером - уходящие с помощью перехвата функции send()(WSASend) Или без сниффера - перехват recv() - приходящие - и send() - уходящие Далее - Цитата не по проге, а по порту Это можно сделать только драйвером или LSP Цитата Slimy @ Я ведь только учусь, а там столько лишней информации. К томуже я даже в теории не представляю как это происходит? Поэтому и никак это у вас быстро не получится - надо читать и разбираться Как я уже сказал, по перехвату могу вам отослать на мыло - давайте его в ПМ |