Не могу понять можно ли с помощью Winsock'а работать с сырыми сокетами. Я имею ввиду вот такой сокет socket(AF_INET,SOCK_RAW,IPPROTO_RAW); Читал статьи в которых пишутся совсем разные вещи. Например Касперский в своей статье "Самоучитель игры на WINSOCK" (http://citforum.isurgut.ru/book/cook/winsock.shtml) говорит что нельзя, потому что "вызов "setsockopt(my_sock,IPPROTO_IP, IP_HDRINCL, &oki, sizeof(oki))" возвращал ошибку!". С другой стороны вот здесь: http://netsecurity.r2.ru/docs/raw.html пишется что всё должно работать (хотя ИМХО статья в стиле Ксакепа). Может сведения Касперского устарели и очередной сервис-пак исправил ошибку? Или Касперский прав и Winsock только пинг умеет делать. Я кстати так и не нашёл ни одного исходника IP-спуфера под винду, если кто знает где есть путёвый HelloWorld по этой теме - киньте ссылку.
========================Moderator======================== Тебе не кажется, что к "Безопасности Windows" это прямого отношения не имеет? Топик уходит в "Программирование". ========================Moderator========================
Мдяаааа. Что так глухо-то? Вопрос сильно сложный или наоборот ламерский? Или таким извратом как "сетевой кодинг под Виндовс" здесь никто не занимается? Скажите хоть про "RTFM" что-нибудь.
Mazay пишет: Да кстати, чему равен IP_HDRINCL? 2 или 3 ?
** WS2TCPIP.H - WinSock2 Extension for TCP/IP protocols
/* Option to use with [gs]etsockopt at the IPPROTO_IP level */
#define IP_OPTIONS 1 /* set/get IP options */ #define IP_HDRINCL 2 /* header is included with data */ #define IP_TOS 3 /* IP type of service and preced*/ #define IP_TTL 4 /* IP time to live */ #define IP_MULTICAST_IF 9 /* set/get IP multicast i/f */ #define IP_MULTICAST_TTL 10 /* set/get IP multicast ttl */ #define IP_MULTICAST_LOOP 11 /*set/get IP multicast loopback */ #define IP_ADD_MEMBERSHIP 12 /* add an IP group membership */ #define IP_DROP_MEMBERSHIP 13/* drop an IP group membership */ #define IP_DONTFRAGMENT 14 /* don't fragment IP datagrams */
2Michael_X: Покажи пример плз! Просто отправка пустого IP пакета, скажем с ТТЛ=63. Я получаю 10049 ошибку при отправке. Это что-то вроде "Нет такого адреса".
2MishaSt Снифить у меня получается, про Winpcap тоже слышал, но хочется обойтись WInsock'ом.
Начиная с W2k поддержка raw sockets есть точно и разрешены они только узерам с админ-привилегиями. В гуглях ты плохо к тому же искал, вот что у меня валяется с инета слитое когда-то:
Цитата
Затем, как вы знаете, надо инициализировать windows sockets api. Делается это WSAStartup'ом, коему впаривается версия именно 2.2 - в противном случае вас ожидает вселенский сакс.
Далее все зависит от цели - снифак мы пишем, спуфер, или даже все вместе. СПУФЕР
------
Для тех кто не знает, спуфер (spoofer) - это такая хрень, которая позволяет вместо своего IP-шника подставить чужой. А в общем случае послать весь IP-пакет целиком. И это правильно.
Для того, чтобы через созданный raw-сокет отправить raw ip-пакет, надо поставить на этот сокет такую опцию, чтоб винда не создавала ip-заголовки у посылаемых пакетов, а попросту бы * забила на них и молча отправляла дальше в сеть. Вот как это делается:
int res = sendto(raw_socket, buf, len, 0, (sockaddr*)&addr, sizeof(addr)); if (res != len) { printf("ERROR:sendto()=%i, WSAGetLastError=%i\n", res,WSAGetLastError()); exit(0); }
(*) И тут есть одна тонкость. Винда пошлет пакет вовсе не на тот адрес, коий указан в поле dst ip-заголовка пакета. А пошлет винда пакет на тот адрес, который указан в структуре sockaddr, подаваемой в sendto(). В случае одной сетевухи это все одно и то же; в случае двух - может быть определенная разница.
Да читал я эту статью (см. мой 1й постинг). Ты сам то пробовал пакеты так слать? Вот глянь такой исходник, почто не работает? (жирным выделил то, что сам писал, как самые багоопасные участки)
10049 помоему значит, что он хоста не видит. Пакет в сетку не уходит, я смотрю это снифером (кстати ты чем пользовался?). Интересно, какое винсоку дело дойдёт или нет пакет. Сокет же сырой. Пробовал писать в dst реальный айпишник, тоже самое.
Mazay Может быть и никакое, но зачем слать битый пакет? Просто скомпиль исходник, к-рый я вставил и посмотри - если у тебя не заработает, значит неправильно что-то делаешь. У меня работает.А юзал я, конечно же, снифер - пакеты нормально уходят. НО если ты надеешься что очень дегко заспуфить свой IP то сильно ошибаешься - внутри локалки это еще можно, но через грамотно настроенные роутеры пакет не пройдет, т.к. настраивают фильтрование SRC IP, блокирующее отправку пакетов с SRC IP из чужих сетей, что блокирует спуффинг.
тот исходник под виндовый VC++ .NET(хотя должно компилиться без проблем в любом MS VC++ 5,6) Можешь просто ту строчку убрать и подключить либу в свойствах проекта.
Почти! Дома скомпилил под VS.NET, сначала получил ошибку No route to host. Что вполне объяснимо: сетки нет - IP нет. Поставил в src и в dest 127.0.0.1 - всё отправилось без ошибок, но снифер ничего не поймал (по-моему он и не должен ловить такие пакеты от localhost'а). На полевых испытаниях: отправляю пакет от своего IP на другой, реально существующий - ошибка WSAEINTR (10004) Interrupted function call. A blocking operation was interrupted by a call to WSACancelBlockingCall.
Кстати если компилить Борландом и явно укзывать библиотеку всегда получаю ошибку 10049