#include "h/pcap.h"
struct lan_ad // структура для хранения адаптеров
{
char *adapter; //описание адаптера
char *name; //имя адаптера
bpf_u_int32 mask,Net;
};
pcap_t *fp;
char *data;
char error[PCAP_ERRBUF_SIZE];
int len;
struct lan_ad net[5];
void packetHandler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) //обработка принятых пакетов
{
head=header->len;
}
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) //при загрузке формы получаем имена и информацию про адаптеры
{
pcap_if_t *alldevs,*d;
int inum=0,i;
i=pcap_findalldevs(&alldevs,error);
ComboBox1->Clear();
for(d=alldevs;d;d=d->next) // выводим информацию на экран
{
net[inum].name=d->name;
net[inum].adapter=d->description;
pcap_lookupnet(d->name,&net[inum].Net,&net[inum].mask,error);
ComboBox1->Items->Add(net[inum].adapter);
inum++;
}
len=inum;
}
void __fastcall TForm1::Button1Click(TObject *Sender) //получаем пакеты
{
char *filter=NULL;
struct bpf_program fcode;
fp=pcap_open_live(net[ComboBox1->ItemIndex].name,0,1,20,error);
pcap_loop(fp,1,packetHandler,NULL);
}
Работа с драйвером WinPCap
У меня в программе уже есть определение сетевыех картб перевод карты в реждим чтения всех пакетов и получение длины пакета, но самого пакета нету, я делаю таким образом
Код:
в функцие packetHandler третий параметр это ссылка на пакет. Для того чтобы получить пакет его необходимо конвертирвоать в структуру, а есть ли какойто способ получить просто пакет потоком в виде:
Код:
00 18 f3 5b f4 b9 00 e0 4e 09 c3 d4 08 00 45 00
00 28 d2 c1 40 00 80 06 cd dc ac 0a 01 0f ac 0a
01 0e 1f 90 06 aa f7 ca f6 92 e6 42 ce 47 50 10
fb b4 90 cb 00 00 00 00 00 00 00 00
00 28 d2 c1 40 00 80 06 cd dc ac 0a 01 0f ac 0a
01 0e 1f 90 06 aa f7 ca f6 92 e6 42 ce 47 50 10
fb b4 90 cb 00 00 00 00 00 00 00 00
как можно получить это с помощью вышеописанной функции или каким либо другим способом, используя только компоненты winpcap
P.S. Для разработки использую CodeGear Rad Studio 2007 c++
Я сейчас точно тебе не скажу, если надо могу завтра выложить, выходные, все осталось на работе:-) Но, насколько я помню, когда скачиваешь исходники WinPCap, там должны быть примеры перехвата пакетов. В одном из тех примеров, будет показано как получить пакет в 16ричном ф-те...Посмотри внимательно.
Качал я отсюда. там хидеры либы и примеры с документацией, просматривая документацию и примеры я просто ненашел, так акк незнаю даже как должно выглядеть
Код:
void dispatcher_handler(u_char *temp1,
const struct pcap_pkthdr *header,
const u_char *pkt_data)
{
u_int i=0;
/*
* unused variable
*/
(VOID*)temp1;
/* print pkt timestamp and pkt len */
printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len);
/* Print the packet */
for (i=1; (i < header->caplen + 1 ) ; i++)
{
printf("%.2x ", pkt_data[i-1]);
if ( (i % LINE_LEN) == 0) printf("\n");
}
printf("\n\n");
}
const struct pcap_pkthdr *header,
const u_char *pkt_data)
{
u_int i=0;
/*
* unused variable
*/
(VOID*)temp1;
/* print pkt timestamp and pkt len */
printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len);
/* Print the packet */
for (i=1; (i < header->caplen + 1 ) ; i++)
{
printf("%.2x ", pkt_data[i-1]);
if ( (i % LINE_LEN) == 0) printf("\n");
}
printf("\n\n");
}