Как то раз озадачили меня проблемой контроля посещений пользователей ресурсов интернет, - кто, куда и сколько раз заходил. Статистика подробная была не нужна, достаточно было IP пользователя URL ресурса, куда заходил пользователь и кол-во посещений каждого ресурса
Покупать и устанавливать ПО для данной задачи было не целесообразным, ввиду безлимитного подключения, - глав бух попался дотошный, и не согласился выделить денги. Поэтому пришлось набросать простенький сниффер своими руками. Для этого я использовал полюбившийся мне C++ Builder 6
Для написания своего нюхача оказалось достаточно
Загрузить необходимые библиотеки
#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; ULONG iph_dest; } IPHeader; char src[10]; char dest[10]; char ds[15]; unsigned short lowbyte; unsigned short hibyte;
Все переменные определены, можно инициализировать WinSock
WSADATA wsadata; SOCKET s; char name[128]; HOSTENT* phe; SOCKADDR_IN sa; IN_ADDR sa1; unsigned long flag = 1;
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 пакетов
int i=0; while( i ) { int count; count = recv( s, Buffer, sizeof(Buffer), 0 ); обрабатываем принятый пакет 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));
Вычисляем протокол
....... код опущен. Кому интересно спрашивайте.
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));
Время жизни пакета
Воработка полученной информации, у каждого она своя, смотря какая стоит задача } } Конец цикла
Тушим всё .... closesocket( s ); WSACleanup(); }
Конец.
Надумываю продолжить и написать унифицированный сниффер c автологами по каждому юзеру. Возможно включу и запреты на определённые url-ы , т.к. во многих организациях даже с безлимитным интернетом стоит задача ограничения трафика ввиду большой нагрузки на локалку. К примеру у меня на работе анлим 3мбит/сек на 58 эзверей. В принципе есть трафик инспектор на 75 пользователей, но лицензия скоро кончается.
С другой стороны, зачем изобретать велосипед, если только в целях самообразования..................
Рекомендую Вам также почитать:
Загрузить, скачать Программирование, Пишем свой сниффер для локальной сети на C++ Builder 6 бесплатно.
Скачать Пишем свой сниффер для локальной сети на C++ Builder 6 бесплатно
Пишем свой сниффер для локальной сети на C++ Builder 6 бесплатно и без регистрации. При копировании материала указывайте источник
Пишем свой сниффер для локальной сети на C++ Builder 6 download free
|