-
RAW SOCKET et Ethernet
Bonjour,
je me permets de venir poster une demande d'information car je bloque un peu. Depuis quelques jours je cherche sur internet comment créer un socket pour forger des paquets Ethernet. Le programme que je veux faire, je veux le rendre compatible sous Windows et GNU/Linux. Mais voilà je rencontre un problème au niveau de la création du socket.
J'ai vu beaucoup de personnes demandé de l'aide pour pouvoir créer un paquet ARP et l'envoyer, à partir de Windows, et souvent la réponse donné est : pas possible, regarde du côté de WinpCap. Mais j'ai aussi vue quelques fois une réponse qui disait : Sous Windows on ne peut pas, de base, avec les sockets, créer un paquet Ethernet, mais si tu construits ton en-tête Ethernet, et avec les "raw socket" tu pourra.
Donc j'ai créé mes structures représentants mes en-têtes, et quand je veux créer un socket je ne vois pas comment le configurer.
int socket(int domain, int type, int protocol);
Pour le type, j'ai compris que je devais faire un : SOCK_RAW
Pour le domain .. Je ne vois pasce que je dois spécifier... Sous GNU/Linux j'ai vu qu'on pouvait mettre : PF_PACKET pour créer des paquets bas-niveau. Mais sous Windows je n'ai pas trouvé d'équivalent.
Pour le protocol, pareil, je ne vois pas le quel spécifier, car dans la doc je ne vois que protocol lié à IP.
Donc je ne vois pas trop comment créer mon socket.
Si quelqu'un à des indices à me donner, une direction à prendre, je suis preneur.
Merci,
Cordialement,
Reverse_
-
Hello,
je n'ai jamais cree de tel socket, mais la syntaxe pourrait etre socket(AF_INET, SOCK_RAW, IPPROTO_RAW);.
Pour le protocol, tu peux passer 0 et il devrait deduire le bon des autres parametres.
J'ai un bouquin au boulot avec plus d'infos, si jamais lundi t'es toujours bloque fais-le savoir :)
-
Merci pour ta réponse,
mais j'avoue ne pas trop comprendre pourquoi pour le domain je dois mettre : AF_INET, alors que dans le man il est dit que c'est pour les protocoles Internet IPv4.
Est-ce parce la transmission de ma trame Ethernet va se faire par le support du protocole IP ?
-
Bonjour,
La famille AF_INET permet d'utiliser des raw sockets avec SOCK_RAW tout en restant dans le domaine Internet, c'est-à-dire que le contenu de ton paquet sera quand même contenu à l'intérieur d'un paquet IP. Concrètement, dans cette famille, SOCK_STREAM est résolu en TCP, SOCK_DGRAM est résolu en UDP, tout en laissant le champ protocol à zéro pour laisser le système choisir le protocole le plus adapté dans sa catégorie. En IP, la question ne se pose pas parce qu'on n'utilise que deux protocoles de transports, mais il pourrait très bien y en avoir plus et, donc, plusieurs protocoles de type stream ou datagram disponibles.
Dans ce cadre, SOCK_RAW te permet d'implémenter ton propre protocole au dessus d'IP, et le champ protocol va aller directement remplir le champ « protocol » homologue de l'entête IPv4 : https://tools.ietf.org/html/rfc791#section-3.1
C'est utile par exemple pour implémenter en user space, à l'aide d'une bibliothèque ou d'un dæmon, les nouveaux protocoles qui n'étaient pas encore disponibles au moment du déploiement du système d'exploitation qui fait tourner le programme (c'est d'ailleurs exactement comme cela que c'est présenté dans la man page) ou pour pouvoir faire des raw sockets « partiels » sans avoir à tout réécrire depuis la base.
Si c'est ARP qui t'intéresse, c'est ce qu'il te faut, mais il est préférable de demander au système d'exploitation de le faire via les services en place. Si tu travailles en IPv6, il vaut mieux se tourner vers NDP.
Si tu veux vraiment forger un paquet au dessus d'Ethernet mais indépendamment de l'IP ou de tout autre protocole de transport, il faut descendre plus bas : AF_PACKET.
Voir :
- man 7 ip
- man 7 ipv6
- man 7 raw
et
… pour les sockets de vraiment bas niveau (au niveau des paquets eux-mêmes).
-
Merci pour ces informations, ça confirme ce que j'avais un peu lu sur internet.
Et justement mon soucis vient de AF_PACKET qui n'est pas implémenter sous windows, et je cherchais donc quel équivalent prendre.
Merci,