Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

помогите со sniffer разобраться

12K
14 мая 2006 года
warlocklex
15 / / 14.01.2006
много чего написано многое читал.почему то не запускаеться выдает ошибку.
Текст юнита такой:
Код:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>

//#connet        "ws2_32.lib"
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
char Buffer[MAX_PACKET_SIZE]; // 64 Kb


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;      
  ULONG   iph_dest;    
} IPHeader;

char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;

void sniff()
{
  WSADATA     wsadata;  
  SOCKET      s;        
  char        name[128]; .
  HOSTENT*    phe;      
  SOCKADDR_IN sa;      
  IN_ADDR sa1;        
  unsigned long        flag = 1;  
 
  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));
 
 
  ioctlsocket(s, SIO_RCVALL, &flag);

 
  while( !kbhit() )
  {
    int count;
    count = recv( s, Buffer, sizeof(Buffer), 0 );
   
    if( count >= sizeof(IPHeader) )
    {
      IPHeader* hdr = (IPHeader *)Buffer;
     

    strcpy(src,"&#207;&#224;&#234;&#229;&#242;: ");
    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));

   
    printf(" Prot: ");
    if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
    if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");

   
    printf("Size: ");
    lowbyte = hdr->iph_length>>8;
    hibyte = hdr->iph_length<<8;
    hibyte = hibyte + lowbyte;
    printf("%s",itoa(hibyte,"",10));

   
    printf(" TTL:%s",itoa(hdr->iph_ttl,"",10));
    printf("\n");

    }
  }

  closesocket( s );
  WSACleanup();
}
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
sniff();
}
//---------------------------------------------------------------------------


ws2_32.lib-эту бибилиотеку кидаю в папку с проектом.
ошибка такая:
Access violation at adress 00455CC5 in module'Project1.exe'.Read adress 000000000
1
14 мая 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by warlocklex
много чего написано многое читал.почему то не запускаеться выдает ошибку.
Текст юнита такой:
 
Код:
while( !kbhit() )



Хм. Черным по белому вроде написано:

Цитата:
Note:
Do not use this function in Win32 GUI applications


К сведенью - если использовать билдеровские формы, кнопки то это и есть Win32 GUI applications.
Для того что бы найти данную ошибку - вполне можно поставить точку останова на вызов функции и посмотреть где генерируется исключение.
В дополнение - раз уж у тебя возникли проблемы и ты решил выложить сюда свой замечательный код - не понятно зачем (в расчете что ктото будет за тебя с ним разбираться?)- потрудись его прокоментировать его как следует.

12K
14 мая 2006 года
warlocklex
15 / / 14.01.2006
Цитата:
Originally posted by kot_
Хм. Черным по белому вроде написано:

К сведенью - если использовать билдеровские формы, кнопки то это и есть Win32 GUI applications.
Для того что бы найти данную ошибку - вполне можно поставить точку останова на вызов функции и посмотреть где генерируется исключение.
В дополнение - раз уж у тебя возникли проблемы и ты решил выложить сюда свой замечательный код - не понятно зачем (в расчете что ктото будет за тебя с ним разбираться?)- потрудись его прокоментировать его как следует.


я не часто прошу помощи . не знаю как надо.Извиняюсь.

Код:
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>

//#connet        "ws2_32.lib"
#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;

void sniff()
{
  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( !kbhit() )
  {
    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 ");
    if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");

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

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

    }
  }

  closesocket( s );
  WSACleanup();
}


компелируется. но когда жму кнопку на выполнение этой функции вылазиет ошибка.
и чем заменить kbhit()?
12K
14 мая 2006 года
warlocklex
15 / / 14.01.2006
И ЕЩЁ ЗАБЫЛ ЭТОТ ТЕКСТ В ОТКРЫТУЮ ЛЕЖИТ В И-НЕТЕ.
1
14 мая 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by warlocklex
я не часто прошу помощи . не знаю как надо.Извиняюсь.
....
компелируется. но когда жму кнопку на выполнение этой функции вылазиет ошибка.
и чем заменить kbhit()?


Гы. Приколол :)
Как пишутся снифферы - я знаю - мне не понятно - где ты вводишь имя хоста например?
Вынеси функции сниффера в отдельный поток и обрабатывай данные там - тогда при необходимости ты можешь его легко завершить. Иначе твоя программа просто глухо повиснет и не будет реагировать ни на что. Или создавай консольное приложение. Там ты сможешь использовать функцию.
З.Ы. Не кричи - не дома. И дома не кричи :)

12K
14 мая 2006 года
warlocklex
15 / / 14.01.2006
Цитата:
Originally posted by kot_
Гы. Приколол :)
Как пишутся снифферы - я знаю - мне не понятно - где ты вводишь имя хоста например?
Вынеси функции сниффера в отдельный поток и обрабатывай данные там - тогда при необходимости ты можешь его легко завершить. Иначе твоя программа просто глухо повиснет и не будет реагировать ни на что. Или создавай консольное приложение. Там ты сможешь использовать функцию.
З.Ы. Не кричи - не дома. И дома не кричи :)


В консоли работает. СПАСИБО!

а зачем имя хоста вводить?
вроде есть это:
gethostname(name, sizeof(name));
phe = gethostbyname( name );
или ты имел ввиду другое?

а как вынести в отдельный поток?

1
15 мая 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by warlocklex
В консоли работает. СПАСИБО!

а зачем имя хоста вводить?
вроде есть это:
gethostname(name, sizeof(name));
phe = gethostbyname( name );
или ты имел ввиду другое?


Зарапортовался :)
Поток создать и выполнять тоже что у тебя происходит в цикле - но не ожидая нажатия клавиши, а в цикле потока.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог