помогите со sniffer разобраться
Текст юнита такой:
#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,"Ïàêåò: ");
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
много чего написано многое читал.почему то не запускаеться выдает ошибку.
Текст юнита такой:
Хм. Черным по белому вроде написано:
Do not use this function in Win32 GUI applications
К сведенью - если использовать билдеровские формы, кнопки то это и есть Win32 GUI applications.
Для того что бы найти данную ошибку - вполне можно поставить точку останова на вызов функции и посмотреть где генерируется исключение.
В дополнение - раз уж у тебя возникли проблемы и ты решил выложить сюда свой замечательный код - не понятно зачем (в расчете что ктото будет за тебя с ним разбираться?)- потрудись его прокоментировать его как следует.
Хм. Черным по белому вроде написано:
К сведенью - если использовать билдеровские формы, кнопки то это и есть Win32 GUI applications.
Для того что бы найти данную ошибку - вполне можно поставить точку останова на вызов функции и посмотреть где генерируется исключение.
В дополнение - раз уж у тебя возникли проблемы и ты решил выложить сюда свой замечательный код - не понятно зачем (в расчете что ктото будет за тебя с ним разбираться?)- потрудись его прокоментировать его как следует.
я не часто прошу помощи . не знаю как надо.Извиняюсь.
#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()?
я не часто прошу помощи . не знаю как надо.Извиняюсь.
....
компелируется. но когда жму кнопку на выполнение этой функции вылазиет ошибка.
и чем заменить kbhit()?
Гы. Приколол :)
Как пишутся снифферы - я знаю - мне не понятно - где ты вводишь имя хоста например?
Вынеси функции сниффера в отдельный поток и обрабатывай данные там - тогда при необходимости ты можешь его легко завершить. Иначе твоя программа просто глухо повиснет и не будет реагировать ни на что. Или создавай консольное приложение. Там ты сможешь использовать функцию.
З.Ы. Не кричи - не дома. И дома не кричи :)
Гы. Приколол :)
Как пишутся снифферы - я знаю - мне не понятно - где ты вводишь имя хоста например?
Вынеси функции сниффера в отдельный поток и обрабатывай данные там - тогда при необходимости ты можешь его легко завершить. Иначе твоя программа просто глухо повиснет и не будет реагировать ни на что. Или создавай консольное приложение. Там ты сможешь использовать функцию.
З.Ы. Не кричи - не дома. И дома не кричи :)
В консоли работает. СПАСИБО!
а зачем имя хоста вводить?
вроде есть это:
gethostname(name, sizeof(name));
phe = gethostbyname( name );
или ты имел ввиду другое?
а как вынести в отдельный поток?
В консоли работает. СПАСИБО!
а зачем имя хоста вводить?
вроде есть это:
gethostname(name, sizeof(name));
phe = gethostbyname( name );
или ты имел ввиду другое?
Зарапортовался :)
Поток создать и выполнять тоже что у тебя происходит в цикле - но не ожидая нажатия клавиши, а в цикле потока.