¿Pueden los sockets sin formato enviar y recibir mensajes tcp en Windows?
Socket sin procesar: socket sin formato
Se puede utilizar para enviar y recibir paquetes sin procesar por encima de la capa IP, como ICMP, TCP, UDP...
int sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
Esto creará un socket sin formato
Sniffer: sniffer
Respecto al principio de sniffer, creo que la mayoría de la gente sabe cómo sniffer
1. p>1. Poner la tarjeta de red en modo promiscuo;
2. p>3. Analizar paquetes de datos.
Pero no mucha gente conoce el método de implementación específico. Bien, ahora hagamos nuestro propio Sniffer usando Raw Socket. Ponga la tarjeta de red en modo promiscuo
En circunstancias normales, la interfaz de red solo debe responder a dos tipos de tramas de datos:
Marcas de datos que coinciden con su propia dirección de hardware
Transmisión de cuadros de datos a todas las máquinas
Si la tarjeta de red va a recibir todos los datos que pasan a través de ella, independientemente de si los datos están destinados a ella, entonces debe colocarse en modo promiscuo. Es decir, debe estar en modo mixto, lo que significa que debe estar ofuscado y no funcionar de forma normal. El código para usar Raw Socket para implementar esta función es el siguiente:
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag); //establecer opciones de operación del encabezado IP
bind(sockRaw, ( PSOCKADDR)& addrLocal, sizeof(addrLocal); //Enlaza sockRaw a la NIC local
ioctlsocket(sockRaw, SIO_RCVALL, &dwValue); //Permite que sockRaw acepte todos los datos.
El indicador se utiliza para configurar la operación del encabezado IP, es decir, manejar el encabezado IP personalmente: bool flag = ture;
addrLocal es la dirección local: SOCKADDR_IN addrLocal ;
dwValue es el parámetro de entrada/salida, ejecutado cuando es 1, cancelado cuando es 0: DWORD dwValue es un parámetro de entrada/salida, ejecutado cuando es 1, cancelado cuando es 0: DWORD dwValue es un parámetro de salida DWORD dwValue = 1;
No esperaba que fuera tan simple
3. Capturar paquetes
¿Tu sockRaw ahora es? funcionando correctamente, por lo que puede usar la herramienta de detección Sniffer en otras computadoras en la LAN Pruébela para ver si la tarjeta está en modo promiscuo (como ARPKiller de DigitalBrain)
¡No deje que desperdicie recursos capturando paquetes!
recv(sockRaw, RecvBuf, BUFFER_SIZE, 0); //Aceptar cualquier paquete
#define BUFFER_SIZE 65535
char RecvBuf[BUFFER_SIZE];
Cada vez más, Sniffer se vuelve tan simple. Sniffer es tan simple que una función completa la tarea de capturar paquetes
4. y los sockets de uso común. El paquete recibido no es lo mismo. Contiene información sin procesar como IP y TCP. Para analizarlo, es necesario comprender su estructura.
Estructura general del paquete de datos:
------------------------------ -- ----------------
| encabezado IP | encabezado TCP (o encabezado X) |
---- -- ----- ----------------------------------
Encabezado IP estructura :
4 8 16 32 bits
|--------|--------|---------- -----|----------------------|
| Ver |DIH |Tipo de servicio|Longitud total|
|--------|--------|----------------| ------------- ---------|
| Identidad| Desplazamiento de fragmento| ----|--------|-------------|-------------- ---------------- -------|
| Tiempo de vida| Protocolo| Suma de comprobación del encabezado|
>--------|-------- |----------------|------------- ------------------|
| Dirección de origen|
|--------|-- ------|------------- ---|-------------------------- ------|
| Dirección de destino| p>
|----- ---|--------|------ ----------|--------- -----------------------|
> Opciones+Relleno|
|------ --|--------|----------------|- -------------------- --------------|
| Datos|
| --------|-------- |----------------|--------------- ----------------- -|
Estructura del encabezado TCP:
16 32 bits
|--- ---------------- ----------|-------------------- ------------|
|Puerto de origen|Puerto de destino|
|--------------- ------------------| -------------------------------- |
| Número de serie|
|--------- --------------------- --|--------------- -----------------|
| Número de confirmación|
|------------- -------------------|----------- ------------------- -|
| Desplazamiento| Reservar |U|A|P|R|S|F| ------------------|---------- ------- -------------- -|
| Suma de comprobación| Puntero de emergencia|
|---- ----------------------- ---
---|--------------------------------|
| Opciones + Relleno|
|--------------------------------|---------- --- --------------------|
| Datos|
|--------- -- -------- ------------|-------------------------- --- ---|
V. Implementar Sniffer
¡Bien!
Ahora todo está claro, ¿a qué estás esperando?
El siguiente es el código de un rastreador simple que escribí usando BCB6, solo como referencia.
(Necesita agregar el archivo WS2_32.LIB a los archivos de su proyecto)
//