Нужна помощь, не могу перевести сокет в режим promiscuous,функция ioctlsocket() возвращает -1,то же самое когда хочу настроит сокет на режим IP_HDRINL,функция setsockopt() возвращает -1. Администраторские права есть,Windows Home Edition,SP3. Буду благодарен за любую помощь.
Вот целый код : Code: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <mstcpip.h> #include <conio.h> typedef struct{ unsigned int version : 4; unsigned int h_len : 4; unsigned int tos : 8; unsigned int tot_len : 16; unsigned int ID : 16; unsigned int flags : 3; unsigned int f_offset : 13; unsigned int TTL : 8; unsigned int protocol : 8; unsigned int h_checksum : 16; unsigned int srcip : 32; unsigned int dstip : 32; }IPHEADER; int main(void) { SOCKADDR_IN addr; WSADATA wsd; SOCKET mSocket; HOSTENT *host; IPHEADER *ip; unsigned long mode = 1; int len; char pcname[32]; char buf[sizeof(IPHEADER)]; /* load windows socket interface */ if(WSAStartup(MAKEWORD(2,2),&wsd) != 0) { puts("Could not load winsocket api"); exit(1); } /* Get computer name */ len = sizeof(pcname) - 1; GetComputerNameA(pcname,&len); len = 0; /* Get host IP address by name */ host = gethostbyname(pcname); /* Set addr & buf to 0 */ memset(&addr,0,sizeof(addr)); memset(buf,0,sizeof(buf)); /* init. local address & create raw socket */ addr.sin_addr.s_addr = ((struct in_addr*)host->h_addr_list[0])->s_addr; addr.sin_family = AF_INET; addr.sin_port = htons(0); mSocket = socket(AF_INET,SOCK_RAW,IPPROTO_IP); if(mSocket == INVALID_SOCKET) { puts("Could not create a RAW socket"); exit(1); } /* Bind socket with local address */ if(bind(mSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR)) != -1) { /* Convert socket to SIO_RCVALL mode */ if(ioctlsocket(mSocket,SIO_RCVALL,&mode) != 0) { puts("Could not convert socket to SIO_RCVALL mode"); } /*-----------------------------------------------*/ int x = 1; while(!kbhit()) { len = recv(mSocket,buf,sizeof(buf),0); /* Check received data */ if(len >= sizeof(IPHEADER)) { ip = (IPHEADER*)buf; printf("\n+--------- %d ------------+\n",x++); printf("| DEST : %s\n",inet_ntoa(*((struct in_addr*)&ip->dstip))); printf("| SRC : %s\n",inet_ntoa(*((struct in_addr*)&ip->srcip))); printf("| VERSION : %d\n",ip->version); printf("+------------------------+\n"); } } } else { puts("Could not bind"); } } Походу он только у меня на компе не работает,у друга проверял - все работало.
хм...попробуй константу SIO_RCVALL самому определить: Code: #define SIO_RCVALL 0x98000001 // желательно с другим именем :) и глянь что GetLastError() возвращает
GetLastError() возвращает 10022 - был задан неправильный аргумент или что оно там. Странно то что на другом компе работает и никакой ошибки не выдает. Дело не в SIO_RCVALL,я посмотрел так как ты написал.
Вот, у меня этот вариант работает: Code: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <windows.h> [COLOR=Red][B]#include <winsock.h>[/B][/COLOR] #include <conio.h> [COLOR=Red][B]#define PROMISC 0x98000001 #define MAX 10000 #pragma comment(lib, "ws2_32.lib") [/B][/COLOR] typedef struct{ unsigned int version : 4; unsigned int h_len : 4; unsigned int tos : 8; unsigned int tot_len : 16; unsigned int ID : 16; unsigned int flags : 3; unsigned int f_offset : 13; unsigned int TTL : 8; unsigned int protocol : 8; unsigned int h_checksum : 16; unsigned int srcip : 32; unsigned int dstip : 32; }IPHEADER; int main(void) { SOCKADDR_IN addr; WSADATA wsd; SOCKET mSocket; HOSTENT *host; IPHEADER *ip; unsigned long mode = 1; int len; char pcname[32]; [COLOR=Red][B] char buf[MAX];[/B][/COLOR] int x; /* load windows socket interface */ if(WSAStartup(MAKEWORD(2,2),&wsd) != 0) { puts("Could not load winsocket api"); exit(1); } /* Get computer name */ len = sizeof(pcname) - 1; GetComputerNameA(pcname,&len); len = 0; /* Get host IP address by name */ host = gethostbyname(pcname); /* Set addr & buf to 0 */ memset(&addr,0,sizeof(addr)); memset(buf,0,sizeof(buf)); /* init. local address & create raw socket */ addr.sin_addr.s_addr = ((struct in_addr*)host->h_addr_list[0])->s_addr; addr.sin_family = AF_INET; addr.sin_port = htons(0); mSocket = socket(AF_INET,SOCK_RAW,IPPROTO_IP); if(mSocket == INVALID_SOCKET) { puts("Could not create a RAW socket"); exit(1); } /* Bind socket with local address */ if(bind(mSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR)) != -1) { /* Convert socket to SIO_RCVALL mode */ if(ioctlsocket(mSocket,PROMISC,&mode) != 0) { puts("Could not convert socket to SIO_RCVALL mode"); printf("Error: %d\n", GetLastError()); } /*-----------------------------------------------*/ x = 1; while(!kbhit()) { len = recv(mSocket,buf,sizeof(buf),0); /* Check received data */ if(len >= sizeof(IPHEADER)) { ip = (IPHEADER*)buf; printf("\n+--------- %d ------------+\n",x++); printf("| DEST : %s\n",inet_ntoa(*((struct in_addr*)&ip->dstip))); printf("| SRC : %s\n",inet_ntoa(*((struct in_addr*)&ip->srcip))); printf("| VERSION : %d\n",ip->version); printf("+------------------------+\n"); } } } else { puts("Could not bind"); } return 0; } Выделил то, что добавил сам. З.Ы. тестировал на Builder'е, пришлось некоторые либы выкинуть
Неа,criz у меня даже этот вариант не работает,RAW сокеты в виндовс включен от версии винсока 2,поэтому header file тоже должен быть winsock2.h Походу дело с SP3 или с виндовс.
Попробуй так Code: #include <conio.h> #include <stdio.h> #include <winsock2.h> #define MAX_PACKET_SIZE 0x10000 #define SIO_RCVALL 0x98000001 // Буфер для приёма данных char Buffer[MAX_PACKET_SIZE]; // 64 Kb //Структура заголовка IP-пакета typedef struct IPHeader { UCHAR iph_verlen; // версия и длина заголовка UCHAR iph_tos; // тип сервиса USHORT iph_length; // длина всего пакета USHORT iph_id; // Идентификация USHORT iph_offset; // флаги и смещения UCHAR iph_ttl; // время жизни пакета UCHAR iph_protocol; // протокол USHORT iph_xsum; // контрольная сумма ULONG iph_src; // IP-адрес отправителя ULONG iph_dest; // IP-адрес назначения } IPHeader; char src[10]; char dest[10]; char ds[15]; unsigned short lowbyte; unsigned short hibyte; void main() { WSADATA wsadata; // Инициализация WinSock. SOCKET s; // Cлущающий сокет. char name[128]; // Имя хоста (компьютера). HOSTENT* phe; // Информация о хосте. SOCKADDR_IN sa; // Адрес хоста IN_ADDR sa1; // unsigned long flag = 1; // Флаг PROMISC Вкл/выкл. // инициализация WSAStartup(MAKEWORD(2,2), &wsadata); s = socket( AF_INET, SOCK_RAW, IPPROTO_IP ); 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; //Начинаем разбор пакета... strcpy(src,"Пакет: "); CharToOem(src,dest); printf(dest); // Преобразуем в понятный вид адрес отправителя. printf("From "); sa1.s_addr = hdr->iph_src; printf(inet_ntoa(sa1)); // Преобразуем в понятный вид адрес. printf(" To "); sa1.s_addr = hdr->iph_dest; printf(inet_ntoa(sa1)); // Протокол. Полный список этих констант // содержится в файле winsock2.h printf(" Prot: "); if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP "); if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP "); // Вычисляем размер. Так как в сети принят прямой порядок // байтов, а не обратный, то прийдётся поменять байты местами. printf("Size: "); lowbyte = hdr->iph_length>>8; hibyte = hdr->iph_length<<8; hibyte = hibyte + lowbyte; printf("%s",itoa(hibyte,"",10)); // Вычисляем время жизни пакета. printf(" TTL:%s",itoa(hdr->iph_ttl,"",10)); printf("\n"); } } closesocket( s ); WSACleanup(); }
А в чем фишка то 8))) могу выложить проект и сокеты асинхронные .... а то while-ами вспотеете 8)))))) снифер на сырых сокетах.... дирьма не жалко!
учиться на раусокет снифере??? ЗАЧЕМ?? Там новых технологий нет! 8)) если снифер дак полноценный, на винпикап!!! Значит ТС нужно что снифер выполнялся на удаленных компах, значит есть цель 8)))))))))))) ... чего надо то ? Выдернуть icq пароль или послушать о чем говорят в аське ... или мыло спереть?
Ты не туда въехал ,какой пароль,какой е-маил ? Тут никто никого не хочет хакать,если тебе нечего предложит по теме,лучше пройди мимо... спасибо.
Извини cash$$$ но код который ты выложил в принципе не отличаеться от того что я написал. И ту статью с которого ты скопировал этот код я читал - статья называеться "Сниффер : Щит и меч". Может ты не прочитал все мои посты,дело в том что это программа которую я написал не работает на моем компе,но на компе друга она работает. У меня оно выдает ошибку 10022,т.е. "задан не правильный аргумент".
читаем .... читаем.... отличия w2к от хр .... читаем читаем отличия хр_сп1 от хр_сп2 читаем блокирование встроенным файрволом промижин сокетов! Я об таком кавне ....уже забыл столько сколько ты и не знал ! 8)) (Атлантида)
2Delimiter гыгы, я почитав немного об этих типа сырых сокетах забил на них и не вспоминал ))) Винпикап рулит для изучение сетевых протоколов на низком уровне ). Тем более он прост, как сапог ))). Это так оффтоп )
Блин,я прочитал что козлы с мелкософта сделали лимит на использование RAW сокетов на Виндовс... пускай эти п*дарасы делают все что хотят, а я опять буду кодить на своем добром мандрайке . Спс.. всем кто отозвался.