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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2013, 14:44   #1
Tambel
 
Регистрация: 09.06.2013
Сообщений: 6
По умолчанию Проблемы со снифером

Здравствуйте, написал элементарный сниффер на RAW сокете.

При активном соединении с каким либо сервером, он отображает только внутренние пакеты, то есть те которые сам отправляет серверу, а пакеты которые отправляет сервер(которые и нужны) он не видит, хотя они благополучно доходят, о чем свидетельствует 100% работающий клиент, и wireshark который тоже без особого труда находит эти пакеты.

Отмечу, что компьютер находиться в подсети роутера и общается с миром через NAT, однако я не думаю что проблема в этом. Опять таки потому, что пакеты доходят, а не видит их только моя программа.

Буду очень благодарен за любую полезную информацию, заранее спасибо.

Код:
#include <stdio.h>
#include <tchar.h>
#include <winsock2.h>
#include <conio.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;      // IP-адрес отправителя
  ULONG   iph_dest;     // IP-адрес назначения
} IPHeader;

char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
char * buff=new char[1024];
int count=0;
void 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);
  //SendMessage(window,WM_MYMESSAGE,NULL,NULL);

  // Бесконечный цикл приёма IP-пакетов.
 
  while( !_kbhit() )
  {
  

    count = recv( s, Buffer, sizeof(Buffer), 0 );
    // обработка IP-пакета
    //if( count >= sizeof(IPHeader) )
    {
		
      IPHeader* hdr = (IPHeader *)Buffer;
      //Начинаем разбор пакета...
	strcpy(src,"Пакет: ");
	CharToOemA((LPCSTR)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 ");
	if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
	if(hdr->iph_protocol == IPPROTO_ICMP) printf("ICMP ");

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

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

  closesocket( s );
  WSACleanup();
}
Tambel вне форума Ответить с цитированием
Старый 09.06.2013, 16:46   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может твой клиент, который работает динамически открывает порт?
Т.е. сервер заранее не знает на какой порт данные посылать, клиент ему сообщает, и далее их диалог успешно минует порта, который твой снифф захватил.
не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++. проблемы с gets() Skull_psyhothik Помощь студентам 1 03.10.2012 01:10
Проблемы с while cashmail JavaScript, Ajax 4 29.06.2012 21:08
Анализ пакетов TCP или нужно разобраться с простым снифером masterbloger Помощь студентам 0 30.12.2010 16:15
проблемы с if Vergil Общие вопросы C/C++ 8 21.04.2010 21:43
проблемы с IE xakzona Помощь студентам 1 16.12.2008 21:53