Red de conocimiento informático - Material del sitio web - Cómo capturar paquetes DNS con winpcap

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)

}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>

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;

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

}

);