Воскресенье, 12.01.2025, 03:46
Приветствую Вас Гость | RSS

блокнот

article

Главная » Статьи » other

Сетевой анализатор
Сетевой анализатор
Анализатор трафика, или сниффер – анализатор трафика, программа , предназначенное для перехвата и последующего анализа, либо только анализа сетевого трафика, предназначенного для других узлов.
Примеров может служить следующий код:

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
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

EzH->

link

Категории раздела

other [13]
translate [0]
STL [2]
Doxygen [2]
pcap.net [1]
Шарпомир [11]
Builder C++ / C / C++ [7]
Программирование МК [1]
Разработка программ для МК, анализ кода и эксперименты с железом

депозит

Поиск