Problème avec Winpcap sur les adresses IP ARP

Nathan -  
 Nathan -
Bonjour a tous,

Voila, j'essaie de faire un programme qui envoie des paquet ARP grâce a Winpcap.
Ce programme est fais en C++ avec Qt.
Voici la fonction que j'ai codé qui n'a pas l'aire de fonctionner.

void envoie_ARP(pcap_t *pointeur_interface, QTextEdit *event, unsigned char mac_source_ether[6], unsigned char mac_destination_ether[6], unsigned long ip_source_arp, unsigned long ip_destination_arp, unsigned char mac_source_arp[6], unsigned char mac_destination_arp[6], short op_arp) 
{ 

    struct ETHERNET couche_ethernet; 
    struct ARP couche_arp; 
    unsigned char trame[65535]; 
    unsigned short taille=0; 


    qDebug() << mac_source_ether[0] << mac_destination_arp[0]; 

    //Couche ETHERNET 
    couche_ethernet.destination[0] = mac_destination_ether[0]; 
    couche_ethernet.destination[1] = mac_destination_ether[1]; 
    couche_ethernet.destination[2] = mac_destination_ether[2]; 
    couche_ethernet.destination[3] = mac_destination_ether[3]; 
    couche_ethernet.destination[4] = mac_destination_ether[4]; 
    couche_ethernet.destination[5] = mac_destination_ether[5]; 

    couche_ethernet.source[0] = mac_source_ether[0]; 
    couche_ethernet.source[1] = mac_source_ether[1]; 
    couche_ethernet.source[2] = mac_source_ether[2]; 
    couche_ethernet.source[3] = mac_source_ether[3]; 
    couche_ethernet.source[4] = mac_source_ether[4]; 
    couche_ethernet.source[5] = mac_source_ether[5]; 

    couche_ethernet.type = htons(2054); 

    //Couche ARP 
    couche_arp.mac_type = htons(1); 
    couche_arp.protocol_type = htons(2048); 
    couche_arp.mac_taille = 6; 
    couche_arp.protocol_taille = 4; 
    couche_arp.ip_destination = ip_destination_arp; 
    couche_arp.ip_source = ip_source_arp; 

    couche_arp.mac_destination[0] = mac_destination_arp[0]; 
    couche_arp.mac_destination[1] = mac_destination_arp[1]; 
    couche_arp.mac_destination[2] = mac_destination_arp[2]; 
    couche_arp.mac_destination[3] = mac_destination_arp[3]; 
    couche_arp.mac_destination[4] = mac_destination_arp[4]; 
    couche_arp.mac_destination[5] = mac_destination_arp[5]; 

    couche_arp.mac_source[0] = mac_source_arp[0]; 
    couche_arp.mac_source[1] = mac_source_arp[1]; 
    couche_arp.mac_source[2] = mac_source_arp[2]; 
    couche_arp.mac_source[3] = mac_source_arp[3]; 
    couche_arp.mac_source[4] = mac_source_arp[4]; 
    couche_arp.mac_source[5] = mac_source_arp[5]; 

    couche_arp.opocode = op_arp; 

    //Construction de la trame 
    memcpy(trame,(unsigned short *)&couche_ethernet,sizeof(struct ETHERNET)); 
    memcpy(trame+sizeof(struct ETHERNET),(unsigned short *)&couche_arp,sizeof(struct ARP)); 

    taille = sizeof(struct ETHERNET)+sizeof(struct ARP); 

    if(pcap_sendpacket(pointeur_interface, trame, taille) != 0) 
    { 
        afficher_message(event, 1, "Erreur lors de l'envoie de la requête ARP"); 
    } 

    else 
    { 
        afficher_message(event, 2, "Requête ARP envoyée"); 
    } 

}


Voila, je récupère le tout en paramètre de la fonction et ensuite je construit et j'envoie la trame.

Le problème surviens avec les adresse IP source et destinataire de mon paquet.
Voici l'appelle de la fonction :

    unsigned char broadcast[6]; 
    broadcast[0] = 255; 
    broadcast[1] = 255; 
    broadcast[2] = 255; 
    broadcast[3] = 255; 
    broadcast[4] = 255; 
    broadcast[5] = 255; 
    unsigned char local[6]; 
    local[0] = 0; 
    local[1] = 0; 
    local[2] = 0; 
    local[3] = 0; 
    local[4] = 0; 
    local[5] = 0; 
    envoie_ARP(pointeur_interface, accesseur, local, broadcast, (unsigned long)inet_addr("192.168.0.1"), (unsigned long)inet_addr("192.168.0.182"), local, broadcast, htons(1)); 


On voit bien que je fais un inet_addr des adresses IP 192.168.0.1 et 192.168.0.182

Pourtant le résultat obtenus avec Wireshark est :

http://img15.hostingpics.net/pics/630723trame.png

Je ne comprends pourquoi j'obtiens ces adresses IP... :/

Pour info le QTextEdit passé en paramètre de ma fonction c'est juste un pointeur sur une zone de texte qui me permets d'afficher les évènements effectué par mon programme.
Ce n'est pas cette partie qui pose problème...

Merci d'avance pour votre aide,

A voir également:

5 réponses

Utilisateur anonyme
 
Bonjour

Une simple suggestion: je ne saias pas comment sont définies tes structures de données, mais ça ressemble beaucoup à un problème d'alignement. Sans option particulières, les compilateurs alignent les champs des structures sur des multiples de 4 ou 8 octets (ou autre, selon l'architecture).
Comme ton champ sender mac address ne fait que 6 octets, il est peut être complété par 2 octets inutilisés pour arriver à 8, le champ sender ip address se retrouve alors décalé de 2 octets.

Des précisions ici (entre autres) :
https://www.augias.org/paercebal/tech_doc/doc.fr/cpp.advanced.struct_alignement.html

Si c'est bien ça le problème, ce dont je ne suis absolument pas sûr, yaka trouver la bonne option de compilation pour que la structure qui contient le datagrame soit compacte.
0
Nathan
 
Je te remercie de ton aide.

Voici mes structures :

struct ETHERNET
{
    unsigned char destination[6];
    unsigned char source[6];
    unsigned short type;
};

struct ARP
{
    unsigned short mac_type;
    unsigned short protocol_type;
    unsigned char mac_taille;
    unsigned char protocol_taille;
    unsigned short opocode;
    unsigned char mac_source[6];
    unsigned long ip_source;
    unsigned char mac_destination[6];
    unsigned long ip_destination;
};


Je débute avec la Winpcap. Et je n'avais jamais rencontré ce type de problème avant.

Si j'ai bien compris ce que tu m'a dis.
Mon adresse sender MAC adress est égal à : 00 00 00 00 00 00
Mais mon compilateur (qtcreator) rajoute deux octets pour faire 8 a mon adresse donc : 00 00 00 00 00 00 00 00
En réalité ces deux derniers octets sont rajoutés en début du champ sender IP adress d'où mon adresse IP qui est égal a : 0.0.192.168
Après je suppose que sa décale encore plus les champs qui sont positionné après...

En tout cas, merci de ton aide, je comprend mieux mon problème.

Par contre je ne vois pas trop comment paramétrer mon compilateur pour gérer ce problème d'alignement. Je vais faire quelques recherches...
0
Nathan
 
Afin d'éviter ce problème, la ligne a mettre en début de fichier serait :
#pragma pack(push,1)
0
Utilisateur anonyme
 
Je ne sais pas quelle est la bonne directive pour ton compilateur, mais il faut évidemment l'appliquer partout sous peine d'avoir des incohérences dans les structures entre plusieurs modules.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nathan
 
Oui c'est bon sa fonctionne :)
Merci.
Ba j'ai un header dans le quel je mes toutes mes structures...
0