troxa
Сообщений: 50
Оценки: 0
Присоединился: 2005-03-31 22:19:26
|
простенький снифер на winpcap (winsock глючит): #include <stdio.h>
#include <pcap.h> #include <remote-ext.h>
#define fatal(x) {printf("%s\n",x); exit(-1);}
void packet_handler(u_char*, const struct pcap_pkthdr*, const u_char*);
void main(void){ pcap_if_t *alldevs, *d; pcap_t *dev; char errbuf[PCAP_ERRBUF_SIZE]; char filter[] = ""; u_int i, n;
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,0,&alldevs,errbuf)==-1) fatal("pcap_findalldevs_ex failed\n");
for(d=alldevs,i=1; d; d=d->next,i++){ printf("%i %s\n", i, d->name); if(d->deSсгiрtion) printf("%s\n",d->deSсгiрtion); else printf("no deSсгiрtion available\n"); } n=i-1; printf("adapter: "); scanf("%u",&i); if ((i<1)||(i>n)) fatal("out of range");
for(d=alldevs; i!=1; d=d->next, i–); if(!(dev = pcap_open(d->name, 65536, PCAP_OPENFLAG_PROMISCUOUS,1000,0,errbuf))) fatal("pcap_open failed");
u_int netmask; struct bpf_program fcode;
if(d->addresses) netmask = ((sockaddr_in*) (d->addresses->netmask))->sin_addr.s_addr; else netmask = 0xffffffff;
//compile the filter printf("compiling the filter…\n"); if (pcap_compile(dev, &fcode, filter, 1, netmask) < 0) { fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n"); // Free the device list pcap_freealldevs(alldevs); return; } //set the filter printf("setting the filter…\n"); if (pcap_setfilter(dev, &fcode) < 0) { fprintf(stderr,"\nError setting the filter.\n"); // Free the device list pcap_freealldevs(alldevs); return; }
printf("listening on %s…\n",d->name); pcap_freealldevs(alldevs);
pcap_loop(dev, 0, packet_handler, 0); }
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { struct tm *ltime; char timestr[16]; u_int i;
ltime=localtime(&header->ts.tv_sec); strftime( timestr, sizeof timestr, "%H:%M:%S", ltime); printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len); for(i=0; i<header->caplen; i++) printf("%X ",pkt_data);<BR> printf("\n");<BR><BR>}<BR><BR><BR>проблема в следующем-<BR>я не вижу ppp фреймы(которые всегда начинаются с 7E FF 03)<BR>хотя подключаюсь через модем<BR><BR>если верить разработчикам winpcap<BR>то снифер получает пакеты с самого<BR>низкого уровня т е приходят даже не датаграммы(IP)<BR>а фреймы(PPP, Ethernet…)<BR><BR>вместо фреймов PPP я вижу набор байт<BR>похожих на фреймы Ethernet но очень странные<BR>в которых MAC адрес отправителя == MAC получателя<BR>(что за черт? какой MAC адрес при модемном соединении?)<BR><BR>самое интересное что в поле типа пакета(IP, ARP, RARP и т д)<BR>стоят константы для PPP т е<BR>0021 - IP датаграмма<BR>C021 - управляющая информация канала<BR>8021 - сетевая управляющая информация<BR><BR>windump (tcpdump для win использующий winpcap) показывает то же <BR>если использовать windump то фреймы<BR>он распознает как Ethernet и пишет<BR>unknown ethertype C021<BR>unknown ethertype 8021 и т д<BR><BR>работаю на winxp sp2<BR>че за хрень? где PPP фреймы?
|