Записки сисадмина
Алексей Никипольский
Пятница, 26.04.2024, 11:32
 
Меню
Настройка windows XP [38]
тонкости настройки, скрытые возможности
Программирование [8]
Нюансы, примеры, мои наработки и прочая полезная информация
Защита [28]
Компьютера, данных, интернет соединений и прочая полезная информация по защите
Обзор новинок [15]
Новинки ПО и железа
Обмен опытом [20]
Заработок в сети [9]
Все виды заработка в сети интернет, обзор, анализ, рекомендации
Распознование [10]
Все о методах и способах распознавания графической информации. Взлом капчи, методы и способы анализа...
Электронные книги [4]
По PHP CSS SQL PERL программированию Всё что есть в свободном доступе в интернете на разных ресурсах.
WEB программирование [9]
Всё о программировании WEB PHP Java PERL HTTP HTML и т.п.
Взлом [6]
методика взлома, примеры взлома, способы защиты от взлома
Онлайн сервисы [2]
Полезные сервисы онлайн
Администрирование [27]
Опыт системного администрирования
Статистика
Календарь
«  Сентябрь 2010  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
27282930
Главная » 2010 » Сентябрь » 7 » Пишем свой сниффер для локальной сети на C++ Builder 6
16:32
Пишем свой сниффер для локальной сети на C++ Builder 6

Как то раз озадачили меня проблемой контроля посещений пользователей ресурсов интернет, - кто, куда и сколько раз заходил. Статистика подробная была не нужна, достаточно было 

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 пользователей, но лицензия скоро кончается. 
  С другой стороны, зачем изобретать велосипед, если только в целях самообразования..................

Рекомендую Вам также почитать:


  • Способы исправления зависания компьютера при выключении
  • Сообщество программистов РОССИИ
  • Внутреннее устройство Microsoft Windows. 6-е издание
  • Как вывести баннер на форуме Ucoz в первом сообщении темы
  • Безопасность Windows XP SP3
  • Опубликовано доказательство P ≠ NP?
  • Выполнение новой установки Windows XP
  • Расширенный поиск Google
  • Получение прямой ссылки на видео с my.mail.ru
  • Как защититься от спама

  • Загрузить, скачать Программирование, Пишем свой сниффер для локальной сети на C++ Builder 6 бесплатно.
    Скачать Пишем свой сниффер для локальной сети на C++ Builder 6 бесплатно
    Пишем свой сниффер для локальной сети на C++ Builder 6 бесплатно и без регистрации.

    При копировании материала указывайте источник

    Пишем свой сниффер для локальной сети на C++ Builder 6 download free


    Категория: Программирование | Просмотров: 9461 | Добавил: Никипольский-Алексей | Рейтинг: 4.7/3
    Всего комментариев: 2
    avatar
    0
    2 Константин • 08:03, 26.04.2012
    Для этого дела подойдёт Kerio Winroute Firewall , но как сетевуху в режим прослушки поставить - за это спасибо!
    avatar
    0
    1 Але}{ • 20:31, 03.02.2011
    Простенько и со вкусом, сенкс
    Ответ: Это лишь скелет, для написания
    А куда заведёт Вас ваша фантазия - ....
    avatar
    Мои услуги на Kwork
    Like It


    Copyright Алексей Никипольский © 2009 - 2024