#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 {char iph_verlen;char iph_tos;short iph_length;short iph_id;short iph_offset;char iph_ttl;char iph_protocol;short iph_xsum;long iph_src;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<3){printf("May be 3 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_TCP);if(ss==-1){perror("socket");exit(0);};bind(ss,(struct sockaddr*)&sa,sizeof(sa));bool flg=true;int ff=open("snif.txt",O_RDWR | O_CREAT);close(ff);//ioctl(ss,SIO_RCVALL,&flg);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);};for(;;){};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(size>=60){int fd=open("snif.txt",O_RDWR);if(fd==-1){perror("open");exit(0);} else {lseek(fd,0,SEEK_END);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));write(fd,&buff[sizeof(IPHeader)],size);};};};};};
int getifconfig (struct ifreq *ifr, char *intf, struct ifparam *ifp){int fd; //- дескриптор сокета//Создадим сокет:if (( fd= socket (AF_INET, SOCK_DGRAM, 0)) <0 ) {perror ( "socket" );return ( - 1 );}//Скопируем имя интерфейса в поле ifr_name структуры ifr:sprintf (ifr->ifr_name, "%s", intf);struct sockaddr_in s;char iphost[25];memset(iphost,0x20,sizeof(iphost));//Получим IP адрес интерфейса:if (ioctl (fd, SIOCGIFADDR, ifr) <0 ) {printf("Can't get ip address\n");perror ("ioctl");gethostname(iphost,sizeof(iphost));//ifp.ip=inet_addr(iphost);}memset(&s, 0, sizeof (struct sockaddr_in));memcpy(&s, &ifr->ifr_addr, sizeof(struct sockaddr));memcpy(&ifp->ip, &s.sin_addr.s_addr, sizeof (u_long));//Получим маску подсети:if (ioctl (fd, SIOCGIFNETMASK, ifr) <0 ) {perror ("ioctl");return (-1);}memset(&s, 0, sizeof (struct sockaddr_in));memcpy(&s, &ifr->ifr_netmask, sizeof (struct sockaddr));memcpy(&ifp->mask, &s.sin_addr.s_addr, sizeof (u_long));//Получим номер подсети:ifp->subnet = check_subnet(ifp->mask, ifp->ip);//Получим размер MTU:if (ioctl (fd, SIOCGIFMTU, ifr) <0 ) {perror ("ioctl");return (-1);}ifp -> mtu = ifr -> ifr_mtu;//Получим индекс (номер) интерфейса:if ( ioctl (fd, SIOCGIFINDEX, ifr) <0 ) {perror ("ioctl");return (-1);}ifp -> index = ifr -> ifr_ifindex;//Переведем интерфейс в неразборчивый режим. Для этого получим значение флагов интерфейса:if ( ioctl (fd, SIOCGIFFLAGS, ifr) <0 ) {perror ("ioctl");close (fd);return (-1);}//Установим флаг неразборчивого режима:ifr -> ifr_flags |= IFF_PROMISC;//Установим новое значение флагов интерфейса:if ( ioctl (fd, SIOCSIFFLAGS, ifr) <0 ) {perror ("ioctl");close (fd);return (-1);}return 1;}