Pequeño y simple sniffer en C
Buenas a todos, estoy aprendiendo a manejar sockets y quería hacer un mini-programa muy simple para ir aprendiendo.
Os dejo el código:
#include <netinet/in.h>
#include <netinet/ip_icmp.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <netinet/ip.h>
int main(void) {
int s;
struct sockaddr_in dir = {AF_INET, 0, 0 };
char buff[1024];
int len = sizeof(dir);
struct ip *ip1 = (struct ip* ) (buff+ sizeof (struct iphdr));
if (geteuid() != 0) {
printf("Tienes que ser root.n");
exit(0);
}
if ((s = socket(AF_INET, SOCK_RAW, 6)) < 0){
printf ("Error al crear el socket!n");
exit (0);
}
printf("Esperando paquetes...n");
while (1) {
bzero(buff, 1024);
while (recvfrom(s, buff, 1024, 0, (struct sockaddr_in*) &dir,
&len) > 0){
//long ipdr=ip1 -> ip_src;
printf ("Paquete cogido!t ip: %dn", (ip1->ip_p));
}
}
}
-----------------------------------------------------
De acuerdo, pues lo que hace el programilla es ponerme un mensaje en la consola cada vez que le llega un paquete. He intentado que al lado me muestre la IP de origen de dicho paquete, pero como podéis comprobar si ejecutáis el programita, se muestra un número, que no sé si será realmente la IP en otra notación o he hecho algo mal.
En cuaquier caso, qué podría hacer para arreglarlo o para que me mostrase la IP en la notación que estamos acostumbrados (xxx.xxx.xxx.xxx)?
Muchas gracias
Os dejo el código:
#include <netinet/in.h>
#include <netinet/ip_icmp.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <netinet/ip.h>
int main(void) {
int s;
struct sockaddr_in dir = {AF_INET, 0, 0 };
char buff[1024];
int len = sizeof(dir);
struct ip *ip1 = (struct ip* ) (buff+ sizeof (struct iphdr));
if (geteuid() != 0) {
printf("Tienes que ser root.n");
exit(0);
}
if ((s = socket(AF_INET, SOCK_RAW, 6)) < 0){
printf ("Error al crear el socket!n");
exit (0);
}
printf("Esperando paquetes...n");
while (1) {
bzero(buff, 1024);
while (recvfrom(s, buff, 1024, 0, (struct sockaddr_in*) &dir,
&len) > 0){
//long ipdr=ip1 -> ip_src;
printf ("Paquete cogido!t ip: %dn", (ip1->ip_p));
}
}
}
-----------------------------------------------------
De acuerdo, pues lo que hace el programilla es ponerme un mensaje en la consola cada vez que le llega un paquete. He intentado que al lado me muestre la IP de origen de dicho paquete, pero como podéis comprobar si ejecutáis el programita, se muestra un número, que no sé si será realmente la IP en otra notación o he hecho algo mal.
En cuaquier caso, qué podría hacer para arreglarlo o para que me mostrase la IP en la notación que estamos acostumbrados (xxx.xxx.xxx.xxx)?
Muchas gracias