
![]() |
Наши проекты:
Журнал · 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 ============== } Так вот это ловит почемуто только входящие пакеты ![]() ![]() Цитата Raw-сокеты этого сделать не смогут - они поднимают на сетевой уровень то, что приходит на сетевую карту по кабелю. Для вас единственная альтернатива - перехват - или драйвер - или LSP Хм я не не сатолько крут в программирование к сожелению ![]() |
Сообщ.
#10
,
|
|
|
Цитата Slimy @ Так вот это ловит почемуто только входящие пакеты Так оно и должно быть ![]() Цитата Slimy @ Исходящих почему-то нет, почему? Потому что сниффер на равсокетах ловит только то, что приходит извне ![]() Профессиональные снифферы эту технологию не используют Цитата Slimy @ нет ли какого механизма прерываний или событий чтобы программа читала данные только тогда когда они дествительно приняты. Конечно есть - это select() - работает и в виндах и в юниксе ( в линуксе еще и poll) или события в виндах - WsaEventSelect() Впрочем в виндовс есть 7 моделей сетевого ввода/вывода ![]() |
Сообщ.
#11
,
|
|
|
Есть такая идея:
Ставиш на этот же комп еще и прокси-сервер (socks5), затем с помощью проги ProxyCap,FreeCap,SocksCap и т.п. пускаешь прогу которую нужно "слушать" через сокс. А в соксе включаеш логирование, например в файл. Все. Пробуй ![]() Добавлено Или. Инжектишся в процесс проги, и перехватываешь ф-ии работы с сокетами. |
Сообщ.
#12
,
|
|
|
Цитата Jenizix @ Есть такая идея: Ставиш на этот же комп еще и прокси-сервер (socks5), затем с помощью проги ProxyCap,FreeCap,SocksCap и т.п. пускаешь прогу которую нужно "слушать" через сокс. А в соксе включаеш логирование, например в файл. Все. Пробуй ![]() Добавлено Или. Инжектишся в процесс проги, и перехватываешь ф-ии работы с сокетами. круто! вы вообще читаете что я пишу ![]() ![]() |
Сообщ.
#14
,
|
|
|
Нет не рулит. Я попросил чтото конкретное. С темже успехом меня можно отправить в гугл ![]() ![]() |
Сообщ.
#15
,
|
|
|
Цитата Slimy @ Я попросил чтото конкретное Вы просили вот это: Цитата Slimy @ через winapi как перехват сделать? не так ли? Я не могу - да и наврядли кто другой сможет - рассказать вам (прочитать курс) перехвата функций Win API - по причине того, что это форум, а не институт или университет - просто времени нет у меня и людей Единственно чем могу помочь в этом вопросе - отослать вам кучу материалов на эту тему - которые вы должны освоить самостоятельно - Цитата Slimy @ Я просил просто про механизм который бы смог отлавить пакеты путь не по проге, но по порту и только локально т.е. то что идет с этой машины и то что к ней приходит. Этот механизм вам практически известен - приходящие пакеты вы отлавливаете сниффером - уходящие с помощью перехвата функции send()(WSASend) Или без сниффера - перехват recv() - приходящие - и send() - уходящие Далее - Цитата не по проге, а по порту Это можно сделать только драйвером или LSP Цитата Slimy @ Я ведь только учусь, а там столько лишней информации. К томуже я даже в теории не представляю как это происходит? Поэтому и никак это у вас быстро не получится - надо читать и разбираться Как я уже сказал, по перехвату могу вам отослать на мыло - давайте его в ПМ |