article
Сетевой анализатор
Сетевой анализатор Анализатор трафика, или сниффер – анализатор трафика, программа , предназначенное для перехвата и последующего анализа, либо только анализа сетевого трафика, предназначенного для других узлов. Примеров может служить следующий код: Code // // -------------------------------------------------------------------------- #include "stdafx.h" #include #include #include // -------------------------------------------------------------------------- #pragma warning(disable : 4996) #pragma comment (lib, "ws2_32.lib") // -------------------------------------------------------------------------- #define MAX_PACKET_SIZE 0x10000 #define SIO_RCVALL 0x98000001 // -------------------------------------------------------------------------- USHORT swap (USHORT sou); // -------------------------------------------------------------------------- // Буфер для приёма данных 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;
typedef struct TCPHeader{ USHORT port_source; // USHORT port_destination; // ULONG number_sequence;// ULONG number_acknowledgement; // USHORT len_reserv_flags; // USHORT window_size; // USHORT check_sum; // USHORT pointer_important; // } TCPHeader;
typedef struct UDPHeader{ USHORT port_source; // USHORT port_destination; // USHORT lengthUDP; // USHORT check_sum; // } UDPHeader; // -------------------------------------------------------------------------- char src [1024]; char dest[1024]; char ds [1024]; unsigned short lowbyte; unsigned short hibyte; // -------------------------------------------------------------------------- //int _tmain(int argc, _TCHAR* argv[]) int _tmain(void) {
// инициализация данных 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);
// Включение promiscuous mode. int RetCode = ioctlsocket(s, SIO_RCVALL, &flag);
if(RetCode) { int WsaErr = WSAGetLastError(); printf("WsaError=%d",WsaErr); }
int packets=0; // Бесконечный цикл приёма IP-пакетов. while( !_kbhit()) { //if(packets >= 2000) break; int count;
// The recv function receives data from a connected or bound socket. //int recv( __in SOCKET s,__out char* buf, __in int len, __in int flags); count = recv( s, Buffer, sizeof(Buffer), 0 ); // обработка IP-пакета if( count >= sizeof(IPHeader) ) { IPHeader* hdr = (IPHeader *)Buffer; TCPHeader* hdr1 = (TCPHeader *)&Buffer[21]; UDPHeader* hdr2 = (UDPHeader *)&Buffer[21];
//Начинаем разбор пакета... //strcpy(src,"Пакет: "); //CharToOem(src,dest); //printf(dest); // Преобразуем в понятный вид адрес отправителя.
printf("\n[packet %d]---------------------------------------------------------------------\n",packets);
printf("Version&Length=0x%xh; TOS=%d; full lenght=%d; \n",hdr->iph_verlen,hdr->iph_tos,hdr->iph_length); printf("identification=%d; flags_offset=%d; \n",hdr->iph_id,hdr->iph_offset);
printf("TTL=%u; protocol=%d",hdr->iph_ttl,hdr->iph_protocol); if(hdr->iph_protocol == IPPROTO_TCP) printf("(TCP);"); if(hdr->iph_protocol == IPPROTO_UDP) printf("(UDP);"); printf("checksum=0x%xh;\n",hdr->iph_xsum);
printf("Packet from=");sa1.s_addr = hdr->iph_src;printf(inet_ntoa(sa1)); // Преобразуем в понятный вид адрес получателя. printf(" To ");sa1.s_addr = hdr->iph_dest;printf(inet_ntoa(sa1));printf("\n"); // Вычисляем протокол. Полный список этих констант // содержится в файле winsock2.h
// Вычисляем размер. Так как в сети принят прямой порядок // байтов, а не обратный, то прийдётся поменять байты местами. // lowbyte = hdr->iph_length>>8; // hibyte = hdr->iph_lengthport_source,hdr2->port_destination); printf("lengthUDP=%d checksum=%d \n",hdr2->lengthUDP,hdr2->check_sum); } if (hdr->iph_protocol == IPPROTO_TCP){ printf("port_source=%d port_destination=%d number_sequence=%d number_acknowledgement=%d\n",hdr1->port_source,hdr1->port_destination,hdr1->number_sequence,hdr1->number_acknowledgement); printf("len_reserv_flags=%d window_size=%d check_sum=%d pointer_important=%d\n",hdr1->len_reserv_flags,hdr1->window_size,hdr1->check_sum,hdr1->pointer_important); }
//USHORT sizep = swap (hdr->iph_length); // printf("Size: %u",sizep); // Время жизни пакета. ++packets; } } closesocket( s ); // WSACleanup функ-ия убивает использование Winsock 2 DLL (Ws2_32.dll). Отключение. WSACleanup();
printf("push any key to exit..."); while( !_kbhit()){}
return 0; } // -------------------------------------------------------------------------- USHORT swap (USHORT sou) { USHORT tar;
tar = (sou<>8) & 0x00FF; return tar; } // --------------------------------------------------------------------------
|
Категория: other | Добавил: gen (28.09.2010)
|
Просмотров: 657
|
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|
|