Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2010, 13:16   #1
jhonyxakep
Пользователь
 
Аватар для jhonyxakep
 
Регистрация: 17.04.2010
Сообщений: 20
Подмигивание Дописать простенький сниффер

Привет всем))

Имеется код простого сниффера, немного подправленного, но взятого с просторов интернета:
Код:
#include <conio.h>
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>
#include <winsock2.h>

#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
// Буфер для приёма данных
char Buffer[MAX_PACKET_SIZE]; // 64 Kb

using namespace std;

//Структура заголовка 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];
char dso[5];
unsigned short lowbyte;
unsigned short hibyte;

int 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( 0 == 0 )
  {
    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 "); else
	if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP "); else
	printf("UNKNOWN ");

	// Вычисляем размер. Так как в сети принят прямой порядок
	// байтов, а не обратный, то прийдётся поменять байты местами.
	printf("Size: ");
	lowbyte = hdr->iph_length>>8;
	hibyte = hdr->iph_length<<8;
	hibyte = hibyte + lowbyte;
	printf("%s",itoa(hibyte,ds,10));

	// Вычисляем время жизни пакета.
	printf("%s",itoa(hibyte,ds,10));
	printf(" TTL:%s",itoa(hdr->iph_ttl,ds,10));

   cout << endl;
    }
  }

  closesocket( s );
  WSACleanup();
}
Этот сниффер умеет только получать данные о принятых и отосланых пакетах, но надо научить его работать с самими пакетами, те вычислять их хеш, и тд, и тп. Дело в том что с сетью я раньше до этого не работал, понятия не имею как это делается, буду рад хотя бы направлению куда же копать... А еще лучше кодик...
Strange Code Generator

Последний раз редактировалось Stilet; 17.04.2010 в 13:31.
jhonyxakep вне форума Ответить с цитированием
Старый 18.04.2010, 16:32   #2
Виталий Серов
Заснувший
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 213
По умолчанию

Я тоже с сетью не работал, но судя по всему в вашем случае:
1 - пакет находится в переменной Buffer, следовательно работайте с этой переменной, например сохраняйте все пакеты в файл, а потом смотрите что вышло или распечатывайте всю переменную в консоль.
2 - контрольная сумма содержится в заголовке и это ясно из названия поля структуры
Код:
......
USHORT  iph_xsum;     // контрольная сумма 
......
Виталий Серов вне форума Ответить с цитированием
Старый 18.04.2010, 17:00   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
надо научить его работать с самими пакетами, те вычислять их хеш, и тд, и тп.
Отлично поставленный вопрос! Сразу ясно где проблема и чем мы сможем помочь вам.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сниффер W0LF Работа с сетью в Delphi 4 03.03.2010 00:08
Сложно ли написать простенький сниффер? TwiX Софт 3 25.01.2010 15:32
Сниффер Pavelok Софт 1 15.05.2009 01:24
Сниффер Joe_Tribbiani Работа с сетью в Delphi 2 19.04.2009 13:19
Сниффер порта keng00r00 Работа с сетью в Delphi 1 22.04.2007 08:53