first commit
This commit is contained in:
commit
5772fd26b8
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
compila
|
||||||
|
ifdmp
|
||||||
|
ifdmp.o
|
||||||
|
|
416
ifdmp.c
Normal file
416
ifdmp.c
Normal file
|
@ -0,0 +1,416 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
File : ifdmp.c
|
||||||
|
Progetto :
|
||||||
|
Inizio : xx.11.2004
|
||||||
|
Fine :
|
||||||
|
Autore/i : Giorgio D.Plescan
|
||||||
|
Commento :
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
Include
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
# include <string.h>
|
||||||
|
# include <time.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
# include <errno.h>
|
||||||
|
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/time.h>
|
||||||
|
# include <sys/socket.h>
|
||||||
|
# include <sys/select.h>
|
||||||
|
# include <sys/utsname.h>
|
||||||
|
|
||||||
|
# include <asm/types.h>
|
||||||
|
|
||||||
|
# include <linux/if_packet.h>
|
||||||
|
# include <linux/if_ether.h>
|
||||||
|
# include <linux/if_arp.h>
|
||||||
|
# include <linux/filter.h>
|
||||||
|
|
||||||
|
# include <arpa/inet.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user