низкоуровневые сокеты (пишу программу, которая перхватывает все пакеты, проходящие через хост)

Модератор: Модераторы разделов

Аватара пользователя
netelis
Сообщения: 95
ОС: Debian Wheezy i686

низкоуровневые сокеты

Сообщение netelis »

Пишу программу вроде tcpdump, чтобы перехватывала все пакеты в сети, используя низкоуровневые сокеты. Знаю, что её можно написать проще, используя libpcap, но я хочу разобраться с SOCK_RAW. Первое, что у меня не получается - это при вызове функции ss=socket(AF_INET,SOCK_RAW,IPPROTO_IP); выводит ошибку, что протокол IPPROTO_IP не поддерживается.

Код:

#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <time.h> #include <stdlib.h> #include <arpa/inet.h> #include <string.h> #include <fcntl.h> #include <pthread.h> #include <signal.h> typedef struct IPHeader { unsigned char iph_verlen; unsigned char iph_tos; unsigned short iph_length; unsigned short iph_id; unsigned short iph_offset; unsigned char iph_ttl; unsigned char iph_protocol; unsigned short iph_xsum; unsigned long iph_src; unsigned long iph_dest; }IPHeader; int read_sock(char *buf,int sock) { int n=0; if(buf!=NULL){ n=recv(sock,buf,100,0); }; return n; }; int ac; char **av; void *pthr1(void *); static char lhost[16]; static char buff[65536]; struct hostent *ht; struct sockaddr_in sa; int ss=0; int main(int argc,char *argv[]) { ac=argc; av=argv; if(argc<2) { printf("May be 2 arguments in command line\n"); exit(0); }; gethostname(lhost,sizeof(lhost)); ht=gethostbyname(lhost); sa.sin_family=AF_INET; sa.sin_addr.s_addr= ((struct in_addr*)ht->h_addr_list[0])->s_addr; ss=socket(AF_INET,SOCK_RAW,IPPROTO_IP); if(ss==-1){ perror("socket"); exit(0); }; bind(ss,(struct sockaddr*)&sa,sizeof(sa)); bool flg=true; //ioctl(ss,SIO_RCVALL,&flg);--специально закоментировал в Windows позволяет принимать все пакеты проходящие через сетевой интерфейс, а как зделать чтоб принимало все пакеты в Linux? pthread_attr_t pa1; pthread_t pt1; pthread_attr_init(&pa1); int pr=pthread_create(&pt1,&pa1,pthr1,NULL); if(pr==0) { printf("Snifer thread 1\n"); } else { perror("thread 1"); exit(1); }; return 0; }; void *pthr1(void *) { for(;;) { int i=0; if (recv(ss, buff, sizeof(buff), 0) >= sizeof(IPHeader)) { IPHeader* hdr = (IPHeader*)buff; long size=(hdr->iph_length << 8) + (hdr->iph_length >> 8); if(strcmp(av[1],"TCP")) { int fd=open("snif.txt",O_RDWR | O_CREAT); if(fd==-1){ perror("open"); exit(0); } else { write(fd, "--Packet begin--\r\n", 18); struct in_addr ia; ia.s_addr=hdr->iph_dest; char *ptarip=inet_ntoa(ia); write(fd, "To: ", 4); write(fd, ptarip,strlen(ptarip)); write(fd, "\r\n", 2); static char ssize[16]; sprintf(ssize,"%d",size); write(fd,"Packet length: ",15); write(fd,ssize,strlen(ssize)); }; }; }; }; };
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: низкоуровневые сокеты

Сообщение frp »

Поищи в инете по поводу сырых сокетов.
Если разберусь, то сообщу.
Спасибо сказали: