Автор
|
Тема: Как socket установить в режим прослушивания?
|
Gilbert |
опубликован 31-10-2001 11:46 MSK
Я в книжке читал, написано сделай так:s=socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL)); Не работает, ошибку даёт на SOCK_PACKET.Может это под *NIX? Как мне в windows сделать прослушивающий сокет?
|
purpe
|
опубликован 31-10-2001 11:52 MSK
чёт я не совсем понил. вроде всегда для этого использовалась функция listenили я всё-таки тебя не понял ? :)
|
purpe
|
опубликован 31-10-2001 11:53 MSK
правда ента функция работает только для сокета TCP |
Gilbert
|
опубликован 31-10-2001 00:09 MSK
нее не то. Я хочу сделать маленький сниффер, что бы он ловил пакеты.
|
Gilbert
|
опубликован 31-10-2001 00:37 MSK
я прочитал, что есть два варианта как сделать сниффер: 1. это использовать какие-то там уже написанные драйверы, которые на уровне ядра работают. 2. Можно создать сокет и настроить его что бы он ловил пакеты.Понятно что 2 вариант будет медленнее, но хотя бы такой сделать. Может что-то я ещё не так понял? |
Gilbert
|
опубликован 31-10-2001 16:18 MSK
да, значит я всё таки что-то напутал... |
server_mouse
|
опубликован 31-10-2001 16:35 MSK
Снифер перехватывает все пакеты проходящие через твою сетевуху. IMHO Работает он на уровень ниже сокетов, на транспортном уровне (модель OSI знаешь?) Если упростить, то проимерно так: Сетевуха чего-то получает и передаёт это драйверу. Драйвер передаёт нужному драйверу протокола через NDIS (IP например). А драйв протокола уже сокетской DLL.Снифер работает как NDIS. IMHO Через сокеты написать снифер импосибл. Ну разве что подменить DLL -- но это путь для извращенцев. |
Lord_DEMON
|
опубликован 31-10-2001 16:36 MSK
Сниффер ты сможешь написать только на UDP BroadCast пакеты, TCP пакеты ны не поймаешь, потому что они все адресные! Для того, чтоб сниффить пакеты, тебе надо как минимум спустится ниже IPНа уровне NDIS можешь попробовать че нить написать, но разбираться долго... ковыряй MSDN Хотя в принципе я не знаю как IP передает пакеты, если там MAC адрес учитывается, то тогда надо еще ниже копать... |
Gilbert
|
опубликован 31-10-2001 16:52 MSK
Понятно. А есть где-нибудь исходники сниффера или библиотека какая-нибудь под Windows? Ну например, чтобы ловила все пакеты а фильтровать уже самому? |
Gilbert
|
опубликован 31-10-2001 17:05 MSK
Библиотеку libpcap которая идёт вместе с tcpdump можно использовать? |
server_mouse
|
опубликован 31-10-2001 17:08 MSK
На сайте MS есть пример pass-through intermediate драйвера, который ничего не делает (просто пропускает пакеты). Точнее не скажу, поищи... Примеры NDIS есть также и в DDK. Если собираешся NDIS ваять он тебе пригодится. Как альтернативу, могу предложить winpcap. Там попроще всё, по придётся везде его с собой потом тягать.
|
server_mouse
|
опубликован 31-10-2001 17:14 MSK
Советую прислушатся к советам, даваемым в pcap касательно скорости обработки пропускаемого пакета. А то тоска смотреть будет, как сеть работает... |
Gilbert
|
опубликован 31-10-2001 17:25 MSK
а DDK это где? :) |
Lord_DEMON
|
опубликован 31-10-2001 17:44 MSK
MSDN Library Visual Studio \ DDK Documentation\ В ПУТЬ :)
|
Lord_DEMON
|
опубликован 31-10-2001 17:47 MSK
Вопрос состоит в том, кто отсекает пакеты, предназначенные для других МАС адресов... В принципе это работа драйвера... Если что нить найдешь, напиши плз :))) Для общего развития :) |
server_mouse
|
опубликован 31-10-2001 17:56 MSK
Знаю такую штуку: ежели послать пакет юникастом на конкретый MAC, то можно удалённо загрузить машину. Ну исесно при поддержке сетевухи и биоса. А ведь машина полностью выключена, драйвера нет... |
Gilbert
|
опубликован 31-10-2001 18:46 MSK
хорошо, путь понятен. При прохождении нового материала, буду задавать вопросы и писать предложения. :))) |
SergeyAksuchenko
|
опубликован 31-10-2001 19:02 MSK
Пользуйтесь. SOCKADDR_IN sa; SOCKET soc; soc = socket(AF_INET, SOCK_RAW, IPPROTO_IP); sa.sin_family = AF_INET; sa.sin_port = htons(7000); sa.sin_addr.s_addr= localhost_ip; bind(soc,(PSOCKADDR)&sa, sizeof(sa)); WSAIoctl(soc, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL); Остальное, тот кому нужно сам додумает. РАБОТАЕТ ТОЛЬКО ПОД WIN2000!
|
Gilbert
|
опубликован 01-11-2001 06:18 MSK
как я понимаю под win98 ничего подобного нет? очень бы хотелось... |
Gilbert
|
опубликован 05-11-2001 08:16 MSK
что-то я не до конца въехал в функцию WSAIoctl(soc, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL);Можно по подробней о параметрах этой функции? |