Winpcap simple pregunta - cómo enviar paquetes a un IP / puerto especificado?
-
16-09-2019 - |
Pregunta
He leído los tutoriales y por eso, pero no estoy recibiendo. No deja de enviar paquetes, pero ¿cómo puede saber Winpcap dónde enviar los paquetes? ¿Hay alguna cabecera debo poner en los paquetes por lo que saber a qué IP / puerto de que transmita la verdad? Quiero decir. Imaginemos que quiero enviar algunos datos para mi MSN, como si lo hubiera escrito algo a alguien en mi lista. Puedo utilizar el sendpacket (), pero sólo a tomar el conjunto de paquetes / bytes como argumento, no especificando a qué aplicación / IP / puerto para enviarlo.
Gracias
Solución
Nunca le cuentas Winpcap dónde enviar los paquetes. Usted le dice que poner un paquete en el alambre. El conmutador de red enviará el paquete al destino correcto. La pila TCP en el extremo receptor enviará el paquete a la aplicación / servicio adecuado. Obviamente, esto significa que la información de encaminamiento tiene que estar en el propio paquete.
Para tomar su ejemplo, que había necesidad de poner la dirección IP y el puerto TCP del servidor de MSN apropiado en el paquete. Si no lo hace, el hardware de red descartará o misroute ese paquete.
Otros consejos
Esta es la forma en que envié una solicitud ARP sobre el alambre. 1. Definir las estructuras de los protocolos es decir, si desea enviar paquetes ARP se necesita una estructura que contendrá la capa de enlace de datos (cabecera Ethernet) y la capa de red (ARP Header). De manera correspondiente, si desea enviar un paquete TCP sobre IP se necesita una estructura de datos para la cabecera cabecera Ethernet, encabezado IP y TCP.
-
Una vez que ha definido las estructuras, inicializar una instancia de la estructura con los valores que desea es decir, si desea que el paquete a ir a todas las máquinas en la red constituida el valor MAC de destino de la cabecera Ethernet a FF: FF: FF: FF: FF: FF si desea enviar el paquete a la máquina con X (dirección IP 192.168.0.88) a continuación, la dirección de destino en la capa IP a ese valor.
-
Una vez hecho esto se tendrá que declarar una matriz de caracteres * y copiar todas las estructuras a la char * matriz para crear una secuencia de bytes y enviarlo a través del cable.
// Sólo para mostrar lo que quiero decir mediante la definición de las estructuras no // relacionarse con el resto del fragmento de código
typedef struct IP_header
{
u_char VersionNInternetHeaderLength; // Version (4 bits) + Internet header length (4 bits)
/*u_char version:4;
u_char HeaderLength:4;*/
u_char Type; // Type of service
u_short TotalLength; // Total length
u_short Identification; // Identification
u_char rsv : 1;
u_char df : 1;
u_char mf : 1;
u_char FragmentOffset1 : 5;
u_char FragmentOffset2;
//u_short Flags_fo; // Flags (3 bits) + Fragment offset (13 bits)
u_char TimeToLive; // Time to live
u_char Protocol; // Next level Protocol of the encapsulated payload
u_short Checksum; // Header checksum
IP_address SourceAddress; // Source address
IP_address DestinationAddress; // Destination address
u_int OptionNPadding; // Option + Padding
IP_header()
{
mf = 0;
rsv = 0;
df = 0;
FragmentOffset1 = 0;
FragmentOffset2 = 0;
TimeToLive = 128;
TotalLength = sizeof(IP_header);
Identification = 0xABCD;
Checksum = 0xABCD;
OptionNPadding = 0;
}
}IP_header;
Ethernet_header EthernetHeader;// = (Ethernet_header*)malloc(sizeof(Ethernet_header));
ARP_header ARPHeader ;//= (ARP_header*)malloc(sizeof(ARP_header));
ARPHeader.HardwareType = htons(1);
ARPHeader.ProtocolType = htons(0x800);
ARPHeader.OPCODE = htons(1);
ARPHeader.HeaderLength = 6;
ARPHeader.ProtocolLength = 4;
ARPHeader.SenderMAC = MY_FAKE_MAC;
ARPHeader.SenderIP = MY_IP;
ARPHeader.TargetMAC = MAC_address();
ARPHeader.TargetIP = Whose;
EthernetHeader.DestinationMAC = BROADCASTMAC;
EthernetHeader.SourceMAC = MY_FAKE_MAC;
EthernetHeader.EtherType = htons(0x806);
u_char* packet = (u_char*)malloc(sizeof(EthernetHeader) + sizeof(ARPHeader));
memcpy(packet, &EthernetHeader, sizeof(EthernetHeader));
memcpy(packet + sizeof(EthernetHeader), &ARPHeader, sizeof(ARPHeader));
SendPacket(packet);