Red de conocimiento informático - Material del sitio web - ¿Cómo puedo ver los paquetes de datos enviados y recibidos por mi computadora?

¿Cómo puedo ver los paquetes de datos enviados y recibidos por mi computadora?

I. Principio de implementación de la captura de paquetes de datos: ----------------------------------------- --------------------------

En términos generales, el programa de socket para comunicación de red solo puede responder a su propia dirección de hardware. o trama de datos enviada como transmisión. Para otras tramas de datos, como las que llegan a la interfaz de red pero no apuntan a esa dirección, la interfaz de red no provocará una respuesta después de verificar que la dirección de entrega no es su propia dirección, es decir, la aplicación no podrá recibir datos que no están relacionados con él.

Por lo tanto, si queremos interceptar todos los paquetes que fluyen a través del dispositivo de red, debemos tomar algunas medidas especiales:

Configurar la tarjeta de red en modo promiscuo.

Esto permite que la NIC del host capture todos los paquetes y tramas que fluyen a través de su NIC.

Pero tenga en cuenta que esta interceptación es solo una copia del paquete y no se puede truncar. Para interceptar el tráfico de la red, debe utilizar algunos métodos de nivel inferior, lo cual está más allá del alcance de este artículo.

II.Programación para capturar paquetes de datos:

1. Método de implementación del socket original--------------------- - ----------------------------------------------

A diferencia de nuestros sockets de flujo de datos y sockets de datagramas de uso común p>

DWORD cbInBuffer,

LPVOID lpvOutBuffer,

DWORD cbOutBuffer,

LPDWORD lpcbBytesReturned,

LPWSAOVERLAPPED lpOverlapped,

LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

);

Aunque parece que hay muchos parámetros, pero Nos ocupamos del segundo parámetro. Todo lo que necesitamos hacer es configurar el segundo elemento en SIO_RCVALL, todo lo que necesitamos hacer es esta línea de código, bastante simple, ¿no? ^_^

Por supuesto, también podemos especificar si queremos manejar el encabezado IP nosotros mismos, pero esto no es obligatorio.

El código completo es similar al siguiente. El código en negrita es diferente de lo que normalmente debe prestar atención:

(Para que el código sea claro de un vistazo, He eliminado el manejo de errores, lo mismo a continuación)

#include "WinSock2.h"

# define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

SOCKET SnifferSocket

WSADATA wsaData;

iFlag=WSAStartup(MAKEWORD(2,2),&. wsaData); //abre winsock.

SnifferSocket=WSASocket(AF_INET) , //crear socket sin formato

SOCK_RAW ,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED

char FAR name[128] //obtener dirección IP local

gethostname(nombre, tamaño de(nombre));

struct hostent FAR * pHostent;

pHostent = gethostbyname(nombre);

SOCKADDR_IN sa; Complete el contenido de la estructura SOCKADDR_IN

sa. sin_family = AF_INET;

sa.sin_port = htons(6000); // El número de puerto se puede cambiar a voluntad, por supuesto. no puede entrar en conflicto con el sistema

memcpy(&(sa.sin_addr),pHostent ->h_addr,pHostent->h_length

bind(SnifferSocket,(LPSOCKADDR)&(sa). ,sizeof(sa,sizeof)));

bind(SnifferSocket,(LPSOCKADDR )&(LPSOCKADDR)) amp;sa,sizeof(sa));

//Establecer ioctl para recibir todos los datos de la red, paso clave

DWORD dwBufferLen[10];

p>

DWORD dwBufferInLen = 1

DWORD dwBytesReturned = 0; >

WSAIoctl(SnifferSocket, IO_RCVALL,&dwBufferInLen, izeof(dwBufferInLen),

& ;dwBufferLen, sizeof( dwBufferLen),&dwBytesReturned , NULL , NULL

En este punto; En realidad, puede comenzar a rastrear paquetes de datos de red, y la recepción de paquetes de datos sigue siendo la misma que la de un socket normal. Lo mismo se hace a través de la función recv (). Dado que aquí se involucran diferentes modelos de socket, los métodos de recepción también son muy diferentes. , por lo que no proporcionaremos el código de recepción aquí.