Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Сообщ.
#1
,
|
|
|
Как в Windows 9x можно перехватывать все пакеты локальной сети, используя winsock?
|
Сообщ.
#3
,
|
|
|
Написано, что надо переключить интерфейс на прием всех пакетов проходящих через интерфейс - promiscuous mode:
PromiscuousMode=1; ioctlsocket(hSocket, SIO_RCVALL, PromiscuousMode); Но в winsock2.h нет SIO_RCVALL. Пишу на Visual C++ 6.0 |
Сообщ.
#4
,
|
|
|
Цитата progr @ Но в winsock2.h нет SIO_RCVALL. Пишу на Visual C++ 6.0 обнови Platform SDK Цитата progr @ Как в Windows 9x можно перехватывать все пакеты локальной сети, используя winsock? http://rsdn.ru/article/net/sniffer.xml Libpcap (WinPCAP) http://www.tcpdump.org/ или придется писать NDIS/TDI драйвер |
Сообщ.
#5
,
|
|
|
progr
SIO_RCVALL использует также функция WSAIoctl() А для SIO_RCVALL надо Mstcpip.h |
Сообщ.
#6
,
|
|
|
Но способ с переводом в promiscuous mode работает только начиная с Windows 2000 как я понял.
Добавлено А мне нужно, чтобы это работало и более ранних версиях windows. |
Сообщ.
#7
,
|
|
|
а что за локалка - на хабах, или свитчах?
|
Сообщ.
#8
,
|
|
|
Сеть из нескольких компов и больше ничего.
|
Сообщ.
#9
,
|
|
|
progr
Цитата способ с переводом в promiscuous mode работает только начиная с Windows 2000 Не думаю - в Win98 реализована таже спецификация WinSock 2.2 Правда, в Visual Studio 6.0 нет Mstcpip.h, зато он есть в Borland CBuilder 6. Вот его полный текст: // Copyright (c) Microsoft Corporation. All rights reserved. #if _MSC_VER > 1000 #pragma once #endif /* Argument structure for SIO_KEEPALIVE_VALS */ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; // New WSAIoctl Options #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2) #define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3) #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4) #define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5) #define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6) #define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7) #define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8) #define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9) #define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10) #define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11) // Values for use with SIO_RCVALL* options #define RCVALL_OFF 0 #define RCVALL_ON 1 #define RCVALL_SOCKETLEVELONLY 2 |
Сообщ.
#10
,
|
|
|
Просто я написал пример, на который Mfcer__ дал ссылку и пример этот не работает. К тому же в той же статье с примером написано, что способ с переводом сетевой карты в promiscuous mode в windows 9x не работает.
|
Сообщ.
#11
,
|
|
|
Цитата progr @ Просто я написал пример, на который Mfcer__ дал ссылку и пример этот не работает. К тому же в той же статье с примером написано, что способ с переводом сетевой карты в promiscuous mode в windows 9x не работает. winpcap должна работать под win9x |
Сообщ.
#12
,
|
|
|
progr
Цитата promiscuous mode в windows 9x не работает. Я прочел тоже эту статью и не нашел убедительных доводов К тому же термины RAW/IP RAW/TCP/UDP совершенно бессмысленны в смысле возможной поддержки со стороны системы Система должна поддерживать только RAW-сокеты, и это все. Что мы будем формировать - это не ее дело. Другое дело, что программное обеспечение не содержит какие-то хедеры, функции и т.д. - но это дело поправимое со стороны программиста. |
Сообщ.
#13
,
|
|
|
Я хотел бы без использования winpcap. Я подключил Mstcpip.h, но такой же облом. ioctlsocket(s,SIO_RCVALL,&flag) возвращает -1
|
Сообщ.
#14
,
|
|
|
progr
Цитата ioctlsocket(s,SIO_RCVALL,&flag) возвращает -1 1. ioctlsocket() - это спецификация Winsock 1.1, а она RAW не поддерживает 2. Надо использовать уже указанную WSAIoctl() 3.-1 ничего не говорит о виде ошибки, после неудачного вызова всегда надо вызывать WSAGetLastError(), которая и сообщит об истинной причине - это правило написания сетевых программ №1 |
Сообщ.
#15
,
|
|
|
А ты не мог бы дать пример правильного вызова WSAIoctl. А WSAGetLastError возвращает WSAEINVAL (Invalid argument) при использовании ioctlsocket.
|
Сообщ.
#16
,
|
|
|
Примерно так:
unsigned int optval; DWORD dwBytesRet; ... optval = 1; if (WSAIoctl(s, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR) { printf("WSAIotcl(%d) failed; %d\n", dwIoControlCode, WSAGetLastError()); return -1; } |
Сообщ.
#17
,
|
|
|
С WSAIoctl то же самое, что и с ioctlsocket. Та же самая ошибка.
|
Сообщ.
#18
,
|
|
|
Что говорит WSAGetLastError?
|
Сообщ.
#19
,
|
|
|
WSAGetLastError возвращает WSAEINVAL (Invalid argument) при использовании и ioctlsocket и WSAIoctl.
|
Сообщ.
#20
,
|
|
|
Стоп!
А ты как вызываешь WSASocket или socket, с параметром SOCK_RAW? |
Сообщ.
#21
,
|
|
|
Цитата ViGOur @ SOCK_RAW? а как еще использовать сырые сокеты? |
Сообщ.
#22
,
|
|
|
Да, с SOCK_RAW
|
Сообщ.
#23
,
|
|
|
progr
Надо вызывать WSASocket() Кстати, какую .lib вы линкуетте с проектом? И всетаки желателен код - хотя бы основные моменты - вызов сокета, bind и все остальное с этим связанное. |
Сообщ.
#24
,
|
|
|
хм...
1) у меня (на Win2003) SOCK_RAW и иже с ними работают на ура со стандартными функциями, без всяких WSA* 2) Цитата progr @ насколько мне известно, так оно и есть. К тому же в той же статье с примером написано, что способ с переводом сетевой карты в promiscuous mode в windows 9x не работает. Цитата Oleg2004 @ И всетаки желателен код - хотя бы основные моменты - вызов сокета, bind и все остальное с этим связанное ioctlsocket(s,SIO_RCVALL,&flag); сработает только если предварительно был успешно вызван bind (токо в качестве IP должен быть не с ноль aka INADDR_ANY) |
Сообщ.
#25
,
|
|
|
Да все как в статье я делал
Добавлено С WSASocket тоже не работает. С проектом линкую ws2_32.lib |
Сообщ.
#26
,
|
|
|
Вот тебе пример работы с raw сокетами, который работает на 100%...
И не будем гадать, что не так! Прикреплённый файлsio_rcvall.rar (6.74 Кбайт, скачиваний: 290) |
Сообщ.
#27
,
|
|
|
ViGOur
//#include <mstcpip.h>??? comment? #include "mstcpip.h" Короче скомпилил и.......... получил ту же 10022!!! И Debug, и Release У меня тоже Win98SE Bind проходит, пишет интерфейс, на который биндится, и привет А по каким тогда все-таки именно причине он не хочет пахать на 98-м? Просто сказать - не пашет, и все???? Ведь винсок и все хедеры и все либы - в достатке? В чем же идеологическая ошибка Хочется докопаться до точной причины |
Сообщ.
#28
,
|
|
|
О чем-то говорит?
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { printf("WSAStartup() failed: %d\n", GetLastError()); return -1; } |
Сообщ.
#29
,
|
|
|
ViGOur
Ну и что? 20 раз писал, и все ОК - Winsock 2.2 на Win98 идет на раз |
Сообщ.
#30
,
|
|
|
Помнится для этого нужно что-то доустонавливать, что не помню, мы как-то по этому поводу с Uncle_Bob'ом говорили... Он даже ссылку давал, на microsoft'овский сайт, где это описывалось, но вот никак найти не могу...
|
Сообщ.
#31
,
|
|
|
ViGOur
Было бы интересно оооччень Что то у меня какое-то внутреннее чувство, что какая-то клизма здесь есть, и четко детерминированная, неужели только winpcap на уровне NDIS? Почему |
Сообщ.
#32
,
|
|
|
Цитата ViGOur @ мы как-то по этому поводу с Uncle_Bob'ом говорили... Не, там было другое - ты говорил, что на W95 нет второго винсока, а я тебе ссылку на апдейт дал. |
Сообщ.
#33
,
|
|
|
Каюсь перепутал!
Но запомнил с точностью до x. |
Сообщ.
#34
,
|
|
|
Значит облом с таким способом перехвата пакетов сети в Windows 9x?
|
Сообщ.
#35
,
|
|
|
Цитата progr @ Значит облом с таким способом перехвата пакетов сети в Windows 9x? WinPCap отменно работает под WIn9x! Даже модем слушал |
Сообщ.
#36
,
|
|
|
progr
Я тоже сожалею Но обещаю - в идеологии, почему нельзя, я разберусь - если кто другой не поможет - в ближайшее время. Ведь по идее должно все работать |
Сообщ.
#37
,
|
|
|
Насколько мне известно Win98 не поддерживает io_ctrl recv_all и поэтому RAW socket на ней не работает
|
Сообщ.
#38
,
|
|
|
Я еще раз посмотрел в MSDN.
SIO_RCVALL Enables a socket to receive all IP packets on the network. The socket handle passed to the WSAIoctl function must be of AF_INET address family, SOCK_RAW socket type, and IPPROTO_IP protocol. The socket also must be bound to an explicit local interface, which means that you cannot bind to INADDR_ANY. Вроде все ОК, но дальше: Once the socket is bound and the ioctl set, calls to the WSARecv or recv functions return IP datagrams passing through the given interface. Note that you must supply a sufficiently large buffer. Setting this ioctl requires Administrator privilege on the local computer. SIO_RCVALL is available in Windows 2000 and later versions of Windows. Читаем дальше: Some IOCTL codes require additional header files. For example, use of the SIO_RCVALL IOCTL requires the Mstcpip.h header file. Requirements Client Requires Windows XP, Windows 2000 Professional, Windows NT Workstation 3.51 and later, Windows Me, Windows 98, or Windows 95. Server Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server 3.51 and later. Header Declared in Winsock2.h. Library Link to Ws2_32.lib. DLL Requires Ws2_32.dll. Вот и пойми, чем это 98-ой отличается от 2000? Требования то одни и теже для клиента??? Ну может хедера Mstcpip.h нет в 98, так его можно поставить! Непонятки |
Сообщ.
#39
,
|
|
|
А как с помощью RAW сокетов перехватывать IPX пакеты?
|
Сообщ.
#40
,
|
|
|
progr
Для этого естественно должен быть установлен стек IPX/SPX Функция сокета должна содержать адресную константу AF_IPX Для стека IPX/SPX структура IPX-сокета выглядит так: struct sockaddr_ipx { short sa_family; /* Семейство AF_IPX */ char sa_netnum[4]; /* Номер сети */ char sa_nodenum[6]; /* Номер узла */ unsigned short sa_socket; } В остальном вроде все как и для TCP/IP Вот здесь все расписано |
Сообщ.
#41
,
|
|
|
Я пишу: SOCKET ipx_socket=socket(PF_IPX,SOCK_RAW,NSPROTO_IPX)
и ioctlsocket(ipx_socket,SIO_RCVALL,&flag) возвращает -1 |
Сообщ.
#42
,
|
|
|
progr
-1 в общем ни о чем не говорит, надо ставить WSAGetLastError, чтобы увидеть код ошибки. А вы продолжаете все это на win98? |
Сообщ.
#43
,
|
|
|
Нет, на XP
|
Сообщ.
#44
,
|
|
|
Цитата Oleg2004 @ Вот и пойми, чем это 98-ой отличается от 2000? Требования то одни и теже для клиента??? Ну может хедера Mstcpip.h нет в 98, так его можно поставить! Непонятки Имеется в виду, что сама функция доступна в 9x линейке. Разумеется, с оговорками, указанными напротив каждого параметра. |
Сообщ.
#45
,
|
|
|
WSAGetLastError для ioctlsocket выдает WSAENOTSOCK (Socket operation on non-socket). Кстати, для bind WSAGetLastError тоже выдает WSAENOTSOCK.
|
Сообщ.
#46
,
|
|
|
progr
Значит несколько доп. инфо: У вас проинсталлированы оба стека - TCP/IP и IPX/SPX? Если так, то может быть конфликт, и если к тому же используется Client for Microsoft Network - последний работает только с TCP/IP Может быть есть в настройках возможность указать default стек или придется убить TCP/IP, чтобы был только один стек |
Сообщ.
#47
,
|
|
|
Установлены и TCP/IP и IPX/SPX. И используется Client for Microsoft Network.
|
Сообщ.
#48
,
|
|
|
progr
В groups.google.com очень много постов что WinXP не по делу выдает WSANOTSOCK в основном при играх Half Life и Countеr Strike Прямо скажу - трудная проблема, и лучше всего все-таки работать а "чистой" IPX-среде, а TCP/IP снести для чистоты эксперимента |