question Winpcap simple - comment envoyer des paquets à une adresse IP spécifiée / port?
-
16-09-2019 - |
Question
Je lis les tutoriels et ainsi, mais je ne suis pas l'obtenir. Il vous envoie des paquets, ne laisse, mais comment pouvez-vous dire Winpcap où envoyer ces paquets? Y at-il la tête que je devrais mettre sur les paquets de sorte qu'il saura que son IP / port de le transmettre? Je veux dire. Imaginons que je veux envoyer des données à mon MSN, comme si je l'avais écrit quelque chose à quelqu'un sur ma liste. Je peux utiliser le sendPacket (), mais il ne prendra le tableau paquet / octet comme argument, et non specifing auquel app / ip / port pour l'envoyer.
Merci
La solution
Vous ne dites pas Winpcap où envoyer des paquets. Vous dites de mettre un paquet sur le fil. Le commutateur de réseau envoie le paquet à la bonne destination. La pile TCP sur l'extrémité de réception envoie le paquet à la bonne application / service. De toute évidence, cela signifie que les informations de routage doit être dans le paquet lui-même.
Pour prendre votre exemple, vous avez besoin de mettre l'adresse IP et le port TCP du serveur MSN approprié dans le paquet. Si vous ne le faites pas, votre matériel réseau rejettera ou ce paquet mal acheminer.
Autres conseils
Voici comment j'ai envoyé une requête ARP sur le fil. 1. Définir des structures pour les protocoles i.e. si vous voulez envoyer des paquets ARP vous aurez besoin d'une structure qui contiendra la couche de liaison de données (en-tête Ethernet) et la couche réseau (ARP-tête). Si vous voulez en conséquence d'envoyer un paquet tcp sur IP, vous aurez besoin d'une structure de données pour l'en-tête Ethernet, en-tête IP et en-tête tcp.
-
une fois que vous avez défini les structures, initialiser une instance de la structure avec les valeurs que vous voulez dire si vous voulez que le paquet pour aller à toutes les machines du réseau définissent la valeur MAC de destination de l'en-tête Ethernet et suivants: ff: ff: ff: ff: ff si vous voulez envoyer le paquet à la machine X avec (adresse IP 192.168.0.88) puis définissez l'adresse de destination dans la couche IP à cette valeur.
-
Une fois terminé, vous devrez déclarer un tableau char * et copier toutes les structures au tableau char * pour créer une séquence d'octets et l'envoyer sur le fil.
// Juste pour vous montrer ce que je veux dire en définissant les structures // ne se rapportent au reste de l'extrait de code
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);