Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo utilizar vc para implementar un rastreador de red. ¿Cómo crear este software rastreador?

Cómo utilizar vc para implementar un rastreador de red. ¿Cómo crear este software rastreador?

1. Busque "Principios de rastreo" en Baidu; comprenda los principios básicos de comunicación informática, encapsulación de datos, protocolos de transmisión Ethernet (como el modelo OSI de siete capas, protocolo RAW), tramas de transmisión...

2. Aprenda a configurar el modo de funcionamiento de la tarjeta de red en: modo mixto y finalmente comience a diseñar el software:

============ Lo siguiente. es el contenido reimpreso, el análisis es bueno, cópielo directamente Pegar, jaja ~·====================

Código (reimpreso):

/***** *******************Tcp_sniff_2.c*************** *********/

1.#incluir

2.#incluir

3.#incluir

4.#incluir

5.#incluir

6.#incluir

7.#incluir

8.#incluir

p>

9.#include "headers.h"

#define INTERFAZ "eth0"

/*Área de prototipo*/

10.int Open_Raw_Socket(void);

11.int Set_Promisc( char *interfaz, int calcetín

12.int main() {

13.int calcetín); , bytes_recieved, fromlen;

14.char buffer[ 65535];

15.struct sockaddr_in from

16.struct ip *ip; >

17.struct tcp *tcp;

18.sock = Open_Raw_Socket();

19. while(1)

22. {

p>

23. fromlen = tamaño de

24. , 0, (struct sockaddr *)amp; from, amp; fromlen);

25. 26. printf("Dirección de origen::: s\n", inet_ntoa(from. sin_addr));

27. ip = (struct ip *)buffer; Vea si este es un paquete TCP*/

28. if (ip-gt;;ip_protocol == 6)

{

29. printf("Longitud del encabezado IP::: d\n",ip-gt;;ip_length);

30. n", ip-gt; ip_protocol);

31. tcp = (struct tcp *)(buffer (4*ip-gt; ip_length));

32. printf( "Puerto de origen:::d\n",ntohs(tcp-gt;;tcp_source_port));

33. printf("Puerto de destino:::d\n",ntohs(tcp- gt; ;tcp_dest_port));

34. }

35 }

36.}

37.int Open_Raw_Socket() {  

38. int calcetín;

39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) lt; 0) {

/* Entonces el El socket no se creó correctamente y debe morir*/

40. perror("El socket sin formato no se creó";

41. exit(0);

42. };

43. retorno(calcetín);

44. }

45.int Set_Promisc(char *interfaz, int calcetín) {

46. struct ifreq ifr;

47. strncpy(ifr.ifr_name, interfaz, strnlen(interfaz)

48. sock, SIOCGIFFLAGS, amp; ifr) == -1)) {

/*No se pudieron recuperar los indicadores para la interfaz*/

49. la interfaz";

50. exit(0);

51. } 

52. printf("La interfaz es::: s\ n" , interfaz);

53. perror("Banderas recuperadas de la interfaz correctamente";

54. ifr.ifr_flags |= IFF_PROMISC;

55. if ( ioctl (sock, SIOCSIFFLAGS, amp; ifr) == -1 ) {

/*No se pudieron configurar los indicadores en la interfaz */

56.

perror("No se pudo establecer el indicador PROMISC:";

57. exit(0);

58. }

59. printf("Configuración de la interfaz ::: s ::: to promisc", interfaz);

60. return(0);

61. }

/**** *******************EOF****************************** ****/

Hay notas muy detalladas en el programa anterior, pero creo que es necesario hablar de ello antes que nada

. Línea No. 10 --int Open_Raw_Socket(void); es nuestra función personalizada, el contenido específico es el siguiente:

37.int Open_Raw_Socket() {  

38.

39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) lt; 0) {

/*Entonces el socket no se creó correctamente y debe morir*/

40. perror("El socket sin formato no fue creado";

41. exit(0);

42. };

43. return (calcetín);

44.

Línea 39 if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) lt; 0) {

Aquí llamamos a la función socket para crear un socket sin formato para que pueda recibir paquetes de información TCP/IP.

La siguiente línea 11 - int Set_Promisc(char *interface, int sock), esta también es nuestra función personalizada,

El propósito es poner la tarjeta de red en modo promiscuo, específico contenido de la siguiente manera:

45.int Set_Promisc(char *interface, int sock) {

46. struct ifreq ifr; ifr_name, interfaz, strnlen(interfaz) 1);

48. if((ioctl(sock, SIOCGIFFLAGS, amp;ifr) == -1)) {

/*Podría no recuperar indicadores para la interfaz*/

49. perror("No se pudieron recuperar indicadores para la interfaz";

50. exit(0);

51. } 

52. printf("La interfaz es::: s\n", interfaz);

53. p>

54. ifr.ifr_flags |= IFF_PROMISC;

55. if (ioctl (calcetín, SIOCSIFFLAGS, amp; ifr) == -1 ) {

/* No se pudieron configurar los indicadores en la interfaz */

56 perror("No se pudo configurar el indicador PROMISC:";

57. exit(0);

58. }

59. printf("Configuración de interfaz:::s:::to promisc", interfaz

60. >

61. }

Primero, struct ifreq ifr; determina la estructura ifr de ifrreg, y luego

strncpy(ifr.ifr_name, interface, strnlen(interface) 1) ; , es decir, completando el nombre de nuestro dispositivo de red en la estructura ifr, aquí #define INTERFACE "eth0", miremos hacia abajo,

ioctl(sock, SIOCGIFFLAGS , amp; ifr), los SIOCGIFFLAGS. La solicitud indica que es necesario obtener el indicador de la interfaz. Ahora hemos llegado a la línea 54. Después de obtener con éxito el indicador de la interfaz, lo configuramos en modo mixto

ifr .ifr_flags |= IFF_PROMISC;ioctl(sock. , SIOCSIFFLAGS, amp;ifr). Bien, ahora de qué estamos hablando

Se ha completado el primer paso: poner la tarjeta de red en modo promiscuo.

Ahora ingresa al segundo paso, capturar el paquete de datos.

A partir de la línea 20, ingresamos a un bucle infinito, while(1), en la

línea 24, recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr *)amp; from, amp; fromlen ),

Lo que hace esta función es recibir datos y poner los datos recibidos en el buffer. Es así de simple y nuestra tarea de capturar paquetes se ha completado.

En el tercer paso, analiza el paquete de datos. Línea 27, ip = (struct ip *)buffer, hace que nuestra estructura IP en el archivo de encabezado

corresponda a los datos recibidos y luego determina si se utiliza el protocolo TCP en la capa de red,

if(ip-gt;ip_protocol == 6), si la respuesta es, el paquete tcp proviene de todo el buffer de paquetes IP/TCP (4*ip-gt;ip_length)

< Comienza en la dirección p>, por lo que la línea 31 tcp = (struct tcp *)(buffer (4*ip-gt;;ip_length)) y luego genere la información que necesita correspondiente a la estructura

.

/************************headers.h*************** * ***********/

/*estructura de un encabezado ip*/

struct ip {

unsigned int ip_length : 4; /*little-endian*/

unsigned int ip_version: 4;

unsigned char ip_tos

unsigned short ip_total_length

ip_id corto sin firmar;

ip_flags cortos sin firmar

ip_ttl de caracteres sin firmar;

unsigned int ip_source; unsigned int ip_dest;

};

/* Estructura de un encabezado TCP */

struct tcp {

tcp_source_port corto sin firmar

tcp_dest_port corto sin firmar

int tcp_seqno sin firmar

tcp_ackno sin firmar; > unsigned int tcp_res1: 4, /*little-endian*/

tcp_hlen: 4,

tcp_fin: 1,

tcp_syn: 1,

tcp_rst: 1,

tcp_psh: 1,

tcp_ack: 1,

tcp_urg: 1,

tcp_res2: 2 ;

tcp_winsize corto sin firmar

tcp_cksum corto sin firmar

tcp_urgent corto sin firmar

}; > /************************EOF************************ ******* ********/

============================ =

Agrega los demás tú mismo, ¡este es solo el principio! ===

============================

Del análisis anterior Se puede entender claramente que conocer un SNIFF requiere una comprensión detallada del protocolo TCP/IP.

De lo contrario, no podrá encontrar la información que necesita. Con la base anterior, usted mismo puede crear el SNIFF que necesita.