commit 5772fd26b832f60f05753304a524755ccb63c3ff Author: Pippo Date: Wed Oct 18 20:04:21 2017 +0200 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fada147 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +compila +ifdmp +ifdmp.o + diff --git a/ifdmp.c b/ifdmp.c new file mode 100644 index 0000000..ee7e1bc --- /dev/null +++ b/ifdmp.c @@ -0,0 +1,416 @@ + +/* +------------------------------------------------------------------------------ +File : ifdmp.c +Progetto : +Inizio : xx.11.2004 +Fine : +Autore/i : Giorgio D.Plescan +Commento : +------------------------------------------------------------------------------ +*/ + +/* +------------------------------------------------------------------------------ +Include +------------------------------------------------------------------------------ +*/ + +# include +# include +# include +# include +# include +# include + +# include +# include +# include +# include +# include +# include + +# include + +# include +# include +# include +# include + +# include + +/* +------------------------------------------------------------------------------ +Define +------------------------------------------------------------------------------ +*/ + +# ifndef TRUE +# define TRUE 1 +# endif + +# ifndef FALSE +# define FALSE 0 +# endif + +# ifndef MAX +# define MAX(x,y) (((x) > (y))? (x): (y)) +# endif + +# ifndef MIN +# define MIN(x,y) (((x) < (y))? (x): (y)) +# endif + +# ifndef ABS +# define ABS(x) (((x) < 0)? -(x): (x)) +# endif + +/* +--------------------------------------------------------------------------- +Funzioni +--------------------------------------------------------------------------- +*/ + +void print_buffer (char * buf, short buflen); +int main (int ac, char ** av); + +/* +--------------------------------------------------------------------------- +Funzione : print_buffer +Input : char * +Output : short +Commento : +--------------------------------------------------------------------------- +*/ + +void print_buffer (char * buf, short buflen) +{ + + char + linea [200], + num [5]; + short + byte = 0, + i = 0, + j = 0, + k = 0; + + if (buf == NULL) + return; + + if (buflen == 0) + return; + + memset (linea, 0x20, sizeof (linea)); + + linea [74] = 0; + k = 0; + i = 0; + + for (j = 0; j < buflen; j++) + { + + if ((j > 0) && ((j % 16) == 0)) + { + + printf ("%04x %s\n", i, linea); + memset (linea, 0x20, sizeof (linea)); + + linea [74] = 0; + k = 0; + i += 16; + + } + + byte = (short)(buf [j] & 0x00ff); + + sprintf (num, "%02x ", byte); + + linea [k * 3] = num[0]; + linea [(k * 3) + 1] = num[1]; + linea [(k * 3) + 2] = num[2]; + + if ((byte > 32) && (byte < 128)) + linea [50 + k] = buf [j]; + else + linea [50 + k] = '.'; + + k++; + + } + + if (k > 0) + printf ("%04x %s\n", i, linea); + else + printf ("\n"); + +} + +/* +--------------------------------------------------------------------------- +Funzione : main +Input : int + : char ** +Output : int +Commento : +--------------------------------------------------------------------------- +*/ + +int main (int ac, char ** av) +{ + + char + * AppName = "ifdmp", + * Credits = "LEP FreeSoft by GioDim", + * Version = "ver 1.1", + if_device [20] = "eth1", + if_address [40], + buffer [2000]; + int + i = 0, + if_index = -1, + sa_family = -1, + err = 0, + len = 0, + nfds = 0, + ret = -1, + fdsock = -1; + long + packet_num = 0L; + time_t + adesso; + fd_set + in_set; + socklen_t + errlen = sizeof (err); + struct tm + * oggi = NULL; + struct sockaddr_ll + sll; + struct ifreq + ifr; + struct packet_mreq + mr; + //struct sock_filter + // total_insn = BPF_STMT(BPF_RET | BPF_K, 0), + // gio_insn[] = {BPF_STMT(BPF_RET+BPF_K, BPF_LEN)}; + //struct sock_fprog + // total_fcode = { 1, &total_insn }, + // gio_fcode = { 1, gio_insn }; + + if (ac > 1) + strcpy (if_device, av[1]); + + /* open socket */ + + if ((fdsock = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL))) == -1) + { + + fprintf (stderr, "%s - socket() : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + /* get if address */ + + memset (&ifr, 0x00, sizeof (ifr)); + strncpy (ifr.ifr_name, if_device, sizeof (ifr.ifr_name)); + + if (ioctl (fdsock, SIOCGIFADDR, &ifr) == -1) + { + + fprintf (stderr, "%s - ioctl(SIOCGIFADDR) : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + strncpy (if_address, inet_ntoa (((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr), 15); + + /* get if index */ + + memset (&ifr, 0x00, sizeof (ifr)); + strncpy (ifr.ifr_name, if_device, sizeof (ifr.ifr_name)); + + if (ioctl (fdsock, SIOCGIFINDEX, &ifr) == -1) + { + + fprintf (stderr, "%s - ioctl(SIOCGIFINDEX) : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + if_index = ifr.ifr_ifindex; + + + /* get if hardware type */ + + memset (&ifr, 0x00, sizeof (ifr)); + strncpy (ifr.ifr_name, if_device, sizeof (ifr.ifr_name)); + + if (ioctl (fdsock, SIOCGIFHWADDR, &ifr) == -1) + { + + fprintf (stderr, "%s - ioctl(SIOCGIFHWADDR) : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + sa_family = ifr.ifr_hwaddr.sa_family; + + + /* get if index */ + + memset (&ifr, 0x00, sizeof (ifr)); + strncpy (ifr.ifr_name, if_device, sizeof (ifr.ifr_name)); + + if (ioctl (fdsock, SIOCGIFINDEX, &ifr) == -1) + { + + fprintf (stderr, "%s - ioctl(SIOCGIFINDEX) : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + if_index = ifr.ifr_ifindex; + + + /* bind if */ + + memset (&sll, 0x00, sizeof (sll)); + + sll.sll_family = AF_PACKET; + sll.sll_protocol = htons (ETH_P_ALL); + sll.sll_ifindex = if_index; + sll.sll_pkttype = PACKET_HOST; + + if (bind (fdsock, (struct sockaddr *)&sll, sizeof (sll)) == -1) + { + + fprintf (stderr, "%s - bind() : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + /* get error */ + + if (getsockopt (fdsock, SOL_SOCKET, SO_ERROR, &err, &errlen) == -1) + { + + fprintf (stderr, "%s - getsockopt() : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + if (err > 0) + { + + fprintf (stderr, "%s - bind() : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + + /* set promisc mode */ + + memset (&mr, 0, sizeof (mr)); + + mr.mr_ifindex = if_index; + mr.mr_type = PACKET_MR_PROMISC; + + if (setsockopt (fdsock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof (mr)) == -1) + { + + fprintf (stderr, "%s - setsockopt() : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + +# ifdef USE_FILTER + /* set filter */ + + if (setsockopt (fdsock, SOL_SOCKET, SO_ATTACH_FILTER, &total_fcode, sizeof (total_fcode)) == -1) + { + + fprintf (stderr, "%s - setsockopt() : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + if (setsockopt (fdsock, SOL_SOCKET, SO_ATTACH_FILTER, &gio_fcode, sizeof (gio_fcode)) == -1) + { + + fprintf (stderr, "%s - setsockopt() : Errno=%1d\n", errno, AppName); + exit (-1); + + } +# endif + + /* capture loop */ + + printf ("%s - %s - %s : Listening on %s (%s)\n", AppName, Version, Credits, if_device, if_address); + + memset (&in_set, 0x00, sizeof (in_set)); + + nfds = MAX(nfds,fdsock); + + for (;;) + { + + FD_ZERO (&in_set); + FD_SET (fdsock, &in_set); + + if ((ret = select (nfds + 1, &in_set, NULL, NULL, NULL)) == -1) + { + + fprintf (stderr, "%s - select() : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + adesso = time (NULL); + oggi = localtime (&adesso); + + for (i = 0; i < ret; i++) + { + + if (FD_ISSET (fdsock, &in_set) == TRUE) + { + + FD_CLR (fdsock, &in_set); + memset (buffer, 0x00, sizeof (buffer)); + + if ((len = recvfrom (fdsock, buffer, sizeof (buffer), MSG_TRUNC, NULL, NULL)) == -1) + { + + fprintf (stderr, "%s - recvfrom() : Errno=%1d\n", AppName, errno); + exit (-1); + + } + + packet_num++; + + printf ("\n%4d.%02d.%02d %02d:%02d:%02d - Packet# %4ld - %3d byte(s) on %s (%s)\n", + oggi->tm_year + 1900, + oggi->tm_mon + 1, + oggi->tm_mday, + oggi->tm_hour, + oggi->tm_min, + oggi->tm_sec, + packet_num, + len, + if_device, + if_address); + + print_buffer (buffer, len); + + + } + + } + + } + + return 0; + +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..8352327 --- /dev/null +++ b/makefile @@ -0,0 +1,19 @@ +# +# +# + +GCC=gcc +RM=rm -rf +CFLAGS=-Wall -c +LDFLAGS= -o + +all:ifdmp + +ifdmp:ifdmp.o + $(GCC) ifdmp.o $(LDFLAGS) ifdmp + +ifdmp.o:ifdmp.c + $(GCC) $(CFLAGS) ifdmp.c + +clean: + $(RM) *.o ifdmp