Cómo capturar paquetes DNS con winpcap
Intenta lo siguiente, pero no sé mucho sobre paquetes DNS y similares...
(Este programa requiere soporte para wpcap.lib y ws2_32.lib (winsock2) )
#define HAVE_REMOTE
#include "pcap.h"
/* dirección IP de 4 bytes*/
estructura typedef dirección_ip{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
} ip_address;
/* encabezado IPv4*/
typedef struct ip_header{
u_char ver_ihl; // Versión (4 bits) + longitud del encabezado (4 bits)
u_char tos; // Tipo de servicio
u_short tlen; // Longitud total (Longitud total)
u_short identificación // Identificación (Identificación)
u_short flags_fo; // Banderas (3 bits) + Desplazamiento de fragmentos (13 bits)
u_char ttl; // Tiempo de supervivencia para vivir
u_char proto; / Protocolo
u_short crc; // Suma de verificación del encabezado (Suma de verificación del encabezado)
ip_address saddr; // Dirección de origen (Dirección de origen)
ip_address daddr; Dirección de destino (Dirección de destino)
u_int op_pad; // Opciones y relleno (Opción + Relleno) p>
}ip_header;
/*Encabezado UDP*/
typedef struct udp_header{
u_short sport; // Puerto de origen (Puerto de origen)
u_short dport // Puerto de destino
u_short; len; // Longitud del paquete UDP (Longitud del datagrama)
u_short crc; // Suma de comprobación (Checksum)
}udp_header;
/* Prototipo de función de devolución de llamada* /
void paquetes_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
main()
{
int i=0;
int k;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
u_int netmask;
u_int net ;
char package_filter[] = "ip y udp";
struct bpf_program fcode;
char *dev;
dev=pcap_lookupdev(errbuf);//Obtener el nombre de la interfaz de red
pcap_lookupnet(dev,&net,&netmask,errbuf);//Obtener la red número y número de máscara
printf("netmask=%d,net=%d ",netmask,net);
/* Abrir adaptador*/
adhandle = pcap_open_live(dev, // El nombre del adaptador de escucha
65536, // Se garantiza que 65535 capturará el contenido completo de cada paquete en diferentes capas de enlace de datos
PCAP_OPENFLAG_PROMISCUOUS, // Modo varios
1000, // Tiempo de espera de lectura
// Verificación remota de la máquina
errbuf ); // Grupo de búfer de error
//Compilar filtro
if (k=pcap_compile(adhandle, &fcode, paquete_filter, 1, netmask) <0 )
{
/ El /netmask El parámetro especifica la máscara de red de la red local.
fprintf(stderr,"\nNo se puede compilar el filtro de paquetes. Verifique la sintaxis.\n");
return -1;
} p> p>
printf("Activación del filtro: %d \n",k);
//Establecer filtro
if (pcap_setfilter(adhandle, &fcode)<0 )
{
fprintf(stderr,"\nError al configurar el filtro.\n");
return -1;
}
/* Iniciar captura*/
pcap_loop(adhandle,-1, paquete_handler, NULL);
devuelve 0;
}
/* Función de devolución de llamada, libpcap la llamará cuando se reciba cada paquete de datos*/
void paquetes_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data )
{
struct tm *ltime;//Estructura para ahorrar tiempo
char timestr[35];//No se puede guardar si es demasiado pequeños datos de tiempo ltime
time_t local_tv_sec;///* Tiempo según valor total*/
ip_header *ih;
udp_header *uh;
u_int ip_len;
u_short sport,dport;
/* Convierte la marca de tiempo a un formato reconocible*/
local_tv_sec = header- >ts .tv_sec;//Obtener el valor de tiempo
ltime=localtime(&local_tv_sec);//Conversión de formato de almacenamiento de tiempo
strftime( timestr, sizeof timestr, "%H cuando %M Minutos %S segundos", ltime);//Tiempo de salida y ajustar el formato de salida
/* Imprime la marca de tiempo y la longitud del paquete de datos*/
printf("Tiempo: % s Longitud:%d\n ",timestr, header->len);
/* Obtener la posición del encabezado del paquete IP*/
ih = (ip_header *) ( pkt_data + 14); //Longitud del encabezado Ethernet
/* Obtener la posición del encabezado UDP*/
ip_len = (ih->ver_ihl & 0xf) * 4; p>
uh = (udp_header *) ((u_char*)ih + ip_len);
/* Convertir secuencia de bytes de red en secuencia de bytes de host*/
sport = ntohs ( uh->deporte );
dport = ntohs( uh->dport );
/*
Imprimir dirección IP y puerto UDP*/
printf("IP de origen:%d.%d.%d.%d\nPuerto de origen del host %d\nPuerto de origen de red %d\nIP de destino: %d .%d.%d.%d\nPuerto de destino del host %d\nPuerto de destino de red %d\n\n",
ih->saddr.byte1,
ih- >saddr.byte2,
ih->saddr.byte3,
ih->saddr.byte4,
deporte,
uh ->deporte,
ih->daddr.byte1,
ih->daddr.byte2,
ih->daddr.byte3,
ih->daddr.byte4,
puerto,
uh->puerto
}
);