forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Доработать простенький сниффер (http://forum.boolean.name/showthread.php?t=12383)

jhonyxakep 17.04.2010 15:09

Доработать простенький сниффер
 
:crazy: Драв всем....

Имеется код простого сниффера, немного подправленного, но взятого с просторов интернета:

Код:

#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();
}

Этот сниффер умеет только получать данные о принятых и отосланых пакетах, но надо научить его работать с самими пакетами, те вычислять их хеш, и тд, и тп. Дело в том что с сетью я раньше до этого не работал, понятия не имею как это делается, буду рад хотя бы направлению куда же копать... А еще лучше кодик...:rolleyes:

Randomize 19.04.2010 05:23

Ответ: Доработать простенький сниффер
 
jhonyxakep, прости пожалуйста, но для каких целей тебе это нужно?
Не пойми меня неправильно. Мы сейчас тебе расскажем что да как, а ты пойдёшь и наделаешь дел.
Начнёшь снифать всех подряд. Того гляди и в киддисы запишешься.

jhonyxakep 13.07.2010 09:23

Ответ: Доработать простенький сниффер
 
Цитата:

Сообщение от Randomize (Сообщение 145020)
jhonyxakep, прости пожалуйста, но для каких целей тебе это нужно?
Не пойми меня неправильно. Мы сейчас тебе расскажем что да как, а ты пойдёшь и наделаешь дел.
Начнёшь снифать всех подряд. Того гляди и в киддисы запишешься.

Это было надо для анализа пакетов, проходящих на машине пользователя, ради перехвата заразы... Интересно каких дел можно понаделать фонарной прослушкой? Для таких целей я бы взял чтонибудь готовое.

А вообще я просто нашел свою тему в гугле, вот и решил позырить че произошло с ней =)

Кстати мой ник вовсе не взят из соединения двух слов, а из достаточно забавной игры.


Часовой пояс GMT +4, время: 15:48.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot