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 p>
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); p>
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.