Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Снифер: как определить порт назначения пакета?  (Прочитано 12832 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 31-05-2004 04:42 » 

Класический пример снифера :

Код:
#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();
}

Вопрос как определить на какой порт напрявляется пакет?
Мне нужно ловить и обрабатывать пакеты направляющиеся только на  только определннные порты. Например 80 и 8080.

Как это сделать ?
« Последнее редактирование: 28-11-2007 15:43 от Алексей1153++ » Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 31-05-2004 06:37 » 

Ты имеешь буфер, начинающийся с IP заголовка. В заголовке указан протокол вложения и длина IP заголовка. Заголовок вложенного протокола находится сразу за IP заголовком. Загляни в RFC за форматом заголовков.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 31-05-2004 07:05 » 

Номер RFC не подскажешь(вдруг на память помнишь)? (говорили мне учи )
У меня возникла проблема другого рода  

ioctlsocket(s, SIO_RCVALL, &flag);
Компилятор говорит  незнаю SIO_RCVALL
смотрю  в WINSOCK2.H  ее там дествительно нет....
Где взять определение? Или WINSOCK2.H  сней ?
Записан

Да да нет нет все остальное от лукавого.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 31-05-2004 07:13 » 

С SIO_RCVALL нашел полную версию примера
http://www.z0mbie.host.sk/rawsock.txt
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 31-05-2004 07:28 » 

RFC791 - INTERNET PROTOCOL
RFC793 - TRANSMISSION CONTROL PROTOCOL
RFC768 - User Datagram Protocol

Тут свалка RFC: http://www.incoma.ru/rfc/index_r.html
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 01-06-2004 08:47 » 

Чтото не могу вехать  убедился  что порт это следующие за заголовком 2 байта но переодически перед ним вклинивается еще один байт ...
Когда данные приходят сервера на мою машину я могу однозначно определить что если это ответ от сервера перед портом будет еще один байт .... а как определить есть ли этот байт в произвольном трафике....
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 01-06-2004 09:45 » 

PSD, в RFC все описано. Приведи hex распечатки своих пакетов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 04-06-2004 07:38 » new

Пы таюсь использовать вот такой код для подсчета тафика  в между 2 ip

Код:
	char Buffer[MAX_PACKET_SIZE]; // 64 Kb


DataWSA * pD = (DataWSA *) lpParameter;

WSADATA     wsadata;   // Èíèöèàëèçàöèÿ WinSock.
SOCKET      s;         // Cëóùàþùèé ñîêåò.
char        name[128]; // Èìÿ õîñòà (êîìïüþòåðà).
HOSTENT*    phe;       // Èíôîðìàöèÿ î õîñòå.
SOCKADDR_IN sa;        // Àäðåñ õîñòà
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;
  //DWORD d=*(DWORD*)pD->Interfase.m_IP.IP;;
//DWORD d1= ((struct in_addr *)phe->h_addr_list[0])->s_addr;;

  sa.sin_addr.s_addr = *(DWORD*)pD->Interfase.m_IP.IP;//phe->h_addr_list[0])->s_addr;
  bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));




  // Âêëþ÷åíèå promiscuous mode.
  ioctlsocket(s, SIO_RCVALL, &flag);


  // Ïðè¸ì IP-ïàêåòîâ.

  while( !pD->stopWSA  )
  {
    int count;
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    // îáðàáîòêà IP-ïàêåòà

    if( count >= sizeof(IPHeader) )
    {
      IPHeader* hdr = (IPHeader *)Buffer;
//Пробегаем по спbску IP

for (int i=0 ;i< pD->m_IP_data.GetSize();i++)
{
 
 if (
 (*(long*)hdr->src.IP==*(long*)pD->m_IP_data[i].m_IP.IP)&&
(*(long*)hdr->dest.IP==*(long*)pD->m_SrvIP.m_IP.IP)
)
{
pD->m_IP_data[i].m_Out +=count;

 }
 if (
(*(long*)hdr->dest.IP==*(long*)pD->m_IP_data[i].m_IP.IP)&&
(*(long*)hdr->src.IP==*(long*)pD->m_SrvIP.m_IP.IP)
)
{
pD->m_IP_data[i].m_In +=count;

}
} //ip

    }
  }

На w2000 (где разрабатывал) результаты похожи на правду ....
При установке на штатное место    (XP+Firewall+UserGate) программа начинает ошибаться в разы.....
« Последнее редактирование: 28-11-2007 15:44 от Алексей1153++ » Записан

Да да нет нет все остальное от лукавого.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines