Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > C/C++: Сетевое программирование > Сокеты |
Автор: Slimy 26.06.07, 23:35 |
В общем появилась у меня необходимость в прослушивании сокета другой программы . Эту задачу можно решить с помощью сниффера но вопервых они все треубт установки специального драйвера чт оне удобно во творых они ловят все пакеты дае не предназначенные для это машины и уж темболее программы да и еще там много "мусора". Мне же необходимо делать это толкьо локально . Нашел кусок исходника в интернете но он ловит только входящие пакеты icon_sad.gif и все для этой машина а не для программы. Вот собсвенно и вопрос если возможность слушать сокет другой программы ? Если это важно то предполагаю это чудо наваять на VS2005 icon_cool.gif . В интернете ничего дельного не нашел по теме icon_wall.gif уже третий день воюю. Кто сталкивался хоть линками полезными помоги прямо и не знаю куда копать.Ведь есл иможно даже память чужого процесса читать без его ведома значит и с сокетами чтото такое должно быть. Да я новичек в вопросе поэтому сильно не пинайте ![]() |
Автор: Alexandoros 27.06.07, 06:28 |
Поискать на сайте sources.ru исходники снифера. Они там есть. |
Автор: V_all 27.06.07, 07:13 |
На сайте есть исходник сниффера без дополнительных библиотек. А чтобы "слушать" данные определенного сокета, можно парсить IP пакет и выбирать только те пакеты, которые идут на порт, который слушает сокет. |
Автор: LuckLess 27.06.07, 08:18 |
Можно еще перехватить win sock api |
Автор: Demo_S 27.06.07, 09:29 |
win2000, winxp поддерживают raw sockets, при помощи которых можно снифить че попало без сторонних библиотек. кстати, загляни на sysinternals.com, там есть куча полезных системных прог и иногда с исходниками;) |
Автор: Oleg2004 27.06.07, 13:06 |
И эта программа стоит на этом же самом компе? Те я имею в виду - одной программой локально (на одной машине) слушать сокет другой программы на этой машине? |
Автор: Slimy 27.06.07, 15:54 |
Цитата Oleg2004 @ И эта программа стоит на этом же самом компе? Те я имею в виду - одной программой локально (на одной машине) слушать сокет другой программы на этой машине? Да именно на тойже самой машине т.е. программа которыю надо слушать и которая должна слушать крутятся на одной машине вот. Насчет снифера я уже написал почему это плохо,а вот идея с raw меня заинтересовала. Киньте ссылочкой на руском или примером пользования такого сокета. Спасибо ![]() |
Автор: Oleg2004 27.06.07, 16:49 |
Raw-сокеты этого сделать не смогут - они поднимают на сетевой уровень то, что приходит на сетевую карту по кабелю. Для вас единственная альтернатива - перехват - или драйвер - или LSP |
Автор: Slimy 27.06.07, 17:23 |
Хм с raw проблема нашел исходник <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> #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 ============== } Так вот это ловит почемуто только входящие пакеты ![]() ![]() Цитата Raw-сокеты этого сделать не смогут - они поднимают на сетевой уровень то, что приходит на сетевую карту по кабелю. Для вас единственная альтернатива - перехват - или драйвер - или LSP Хм я не не сатолько крут в программирование к сожелению ![]() |
Автор: Oleg2004 27.06.07, 18:27 |
Так оно и должно быть ![]() Потому что сниффер на равсокетах ловит только то, что приходит извне ![]() Профессиональные снифферы эту технологию не используют Цитата Slimy @ нет ли какого механизма прерываний или событий чтобы программа читала данные только тогда когда они дествительно приняты. Конечно есть - это select() - работает и в виндах и в юниксе ( в линуксе еще и poll) или события в виндах - WsaEventSelect() Впрочем в виндовс есть 7 моделей сетевого ввода/вывода ![]() |
Автор: Jenizix 27.06.07, 20:49 |
Есть такая идея: Ставиш на этот же комп еще и прокси-сервер (socks5), затем с помощью проги ProxyCap,FreeCap,SocksCap и т.п. пускаешь прогу которую нужно "слушать" через сокс. А в соксе включаеш логирование, например в файл. Все. Пробуй ![]() Добавлено Или. Инжектишся в процесс проги, и перехватываешь ф-ии работы с сокетами. |
Автор: Slimy 27.06.07, 21:01 |
Цитата Jenizix @ Есть такая идея: Ставиш на этот же комп еще и прокси-сервер (socks5), затем с помощью проги ProxyCap,FreeCap,SocksCap и т.п. пускаешь прогу которую нужно "слушать" через сокс. А в соксе включаеш логирование, например в файл. Все. Пробуй ![]() Добавлено Или. Инжектишся в процесс проги, и перехватываешь ф-ии работы с сокетами. круто! вы вообще читаете что я пишу ![]() ![]() |
Автор: Oleg2004 28.06.07, 10:21 |
Поиск рулит ![]() |
Автор: Slimy 28.06.07, 15:25 |
Нет не рулит. Я попросил чтото конкретное. С темже успехом меня можно отправить в гугл ![]() ![]() |
Автор: Oleg2004 28.06.07, 17:17 |
Вы просили вот это: не так ли? Я не могу - да и наврядли кто другой сможет - рассказать вам (прочитать курс) перехвата функций Win API - по причине того, что это форум, а не институт или университет - просто времени нет у меня и людей Единственно чем могу помочь в этом вопросе - отослать вам кучу материалов на эту тему - которые вы должны освоить самостоятельно - Цитата Slimy @ Я просил просто про механизм который бы смог отлавить пакеты путь не по проге, но по порту и только локально т.е. то что идет с этой машины и то что к ней приходит. Этот механизм вам практически известен - приходящие пакеты вы отлавливаете сниффером - уходящие с помощью перехвата функции send()(WSASend) Или без сниффера - перехват recv() - приходящие - и send() - уходящие Далее - Цитата не по проге, а по порту Это можно сделать только драйвером или LSP Цитата Slimy @ Я ведь только учусь, а там столько лишней информации. К томуже я даже в теории не представляю как это происходит? Поэтому и никак это у вас быстро не получится - надо читать и разбираться Как я уже сказал, по перехвату могу вам отослать на мыло - давайте его в ПМ |
Автор: Keepun 28.06.07, 18:12 |
Я у себя проделовал такой трюк: Пишем простецкий прокси, который тупо все пишет в файл. В проге, которую слушаем, прописываем локальный адрес и порт нашего сервера (можно и через HEX-редактор все сделать, если в проге настроек нет), а в исходниках нашего прокси указываем конечный адрес. |
Автор: Slimy 29.06.07, 19:45 |
Цитата Вы просили вот это: Цитата (Slimy @ Вчера, 00:01) через winapi как перехват сделать? не так ли? Не совсем так. Я попросил помощи по вопросу перехвата данных локальной програмы от от локальной программы а как это сделать предложили вы. Цитата Я не могу - да и наврядли кто другой сможет - рассказать вам (прочитать курс) перехвата функций Win API - по причине того, что это форум, а не институт или университет - просто времени нет у меня и людей Единственно чем могу помочь в этом вопросе - отослать вам кучу материалов на эту тему - которые вы должны освоить самостоятельно Там все так бесконечно сложно? Это огорчает. В универе таких лекций не читают могу вас заверить. Там максиму сокеты, безовсяких тонкостей. В про чем кидайте информацию, что есть почитаю постарась понять хотя например загадка в том как сделать этот перехват избирательным ведь системным вызовом будут пользоватся и другие программы котореы перехватчик добросоветсно тоже перехватит. Вообще вариант с драйвермо в сети я нашел. Кто знает как этот жрайвер поставить в систему доупустим через скрипт а не кликаньем мышки? или через эту программу? И последное точно нет возможности перенастроить сокет чтобы и исходящие ловил? Цитата Поэтому и никак это у вас быстро не получится - надо читать и разбираться Читаю разбирась но книжки такие толстые тут ведь и TCP знать надо а не только работу с сокетами. Вот над ругом форуме мне подсказывают про некий pcap выглядит не сложно. |
Автор: Oleg2004 29.06.07, 20:17 |
Это вариант - но это не перехват Capture - в переводе с английского - это захват - и winpcap в принципе просто адаптация BPF - это копирование с канального уровня того что уходит и приходит Но не перехватывает Ну, сокеты и TCP-близнецы-братья ![]() ![]() Сокет - нет. Сокет ведь высоко стоит в модели OSI - это прослойка-интерфейс - между транспортным уровнем и пользовательским уровнем Поэтому ловить надо гораздо ниже Доки отправил |
Автор: Slimy 29.06.07, 21:50 |
Хм а какая разница меня волнует результат не способ.Всерано потмо сделаю отдельную функцию и буду тупо к ней обращатся особо не впомная как она работает. Но почитал тут про этот вариант он определнно мне нравится. Хм мой впорос про установку из консоли остался без внимания. ![]() |