Страница 1 из 1

Сниффер. Учет исходящего трафика.

Добавлено: 13 апр 2009, 08:11
Igor007
Суть в следующем... На основе rsdn.ru пишу сниффер.
Код из статьи:

Код: Выделить всё

#include <conio.h>
#include <winsock2.h>

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

void main()
{
  WSADATA     wsadata;   // Инициализация WinSock.
  SOCKET      s;         // Cлущающий сокет.
  char        name[128]; // Имя хоста (компьютера).
  HOSTENT*    phe;       // Информация о хосте.
  SOCKADDR_IN sa;        // Адрес хоста
  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( !_kbhit() )
  {
    int count;
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    // обработка IP-пакета
    if( count >= sizeof(IPHeader) )
    {
      IPHeader* hdr = (IPHeader *)Buffer;
      //что-то делаем с пакетом...
    }
  }
  // Конец работы.
  closesocket( s );
  WSACleanup();
}
Со вх. трафикам все отлично, а как быть с исх.? Я так понимаю данный код не расчитан отлавливать исх. пакеты. Хотя ioctlsocket(s, SIO_RCVALL, &flag); говорит о отлавливании всех пакетов.

Что на это скажете? Я в чем то ошибаюсь?
--------------------------------------------------------------------------------
Добавленное сообщение
--------------------------------------------------------------------------------
Значит не знаете? Хорошо. Буду копать...

Re: Сниффер. Учет исходящего трафика.

Добавлено: 14 апр 2009, 11:40
Airhand
Так у тебя только слушающий сокет. И в цикле ты делаеш recv(), т.е. только запись от входящего траффика.
Код нужно переделать под объект, а не в мэйне всё писать.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Не о чём не говорит
SOCKADDR_IN sa;
?

Re: Сниффер. Учет исходящего трафика.

Добавлено: 14 апр 2009, 17:04
Igor007
Airhand писал(а):Код нужно переделать под объект, а не в мэйне всё писать.
Код вообще не мой. Это с примера. Так как можно перехватить исх пакеты?

Re: Сниффер. Учет исходящего трафика.

Добавлено: 15 апр 2009, 12:17
Airhand
Начнём с теории: ты прочитал хоть одну книгу по winsock ?
Теория такова: для того, чтобы "ловить" весь трафик, тебе нужно создавать 2 сокета: один для входящего трафика и один - для исходящего. Вот почему я говорю засунуть это всё в объект - чтобы легче было.

Re: Сниффер. Учет исходящего трафика.

Добавлено: 16 апр 2009, 17:11
Igor007
Начнём с теории: ты прочитал хоть одну книгу по winsock ?
Согласен. В ближайшее время займусь изучением. Просто срочно понадобилось, но я уже проблему решил. Так что спасибо.
P.S. А что посоветуете почитать?

Re: Сниффер. Учет исходящего трафика.

Добавлено: 17 апр 2009, 12:19
Airhand
P.S. А что посоветуете почитать?
Я, в своё время, читал какой-то стандарт по winsock 2.0 на английском. На русском не встречал.

Re: Сниффер. Учет исходящего трафика.

Добавлено: 17 апр 2009, 16:46
WinMain
Есть неплохая книга на русском языке, называется "Программирование в сетях Microsoft Windows". К ней ещё CD с примерами на С++ прилагается.
Выглядит она так:
http://www.delphimaster.ru/books/978531800725/

Re: Сниффер. Учет исходящего трафика.

Добавлено: 17 апр 2009, 16:53
Igor007
Спасибо. Уже читаю.