poporiding
Messages postés23Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 juin 2006
-
23 mai 2006 à 14:49
Bel0
Messages postés71Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention14 septembre 2007
-
26 mai 2006 à 21:01
bonjour tout le monde.
Je me galère vraiment sur la création d'un programme qui
envoie des socket en mode RAW.
j'ai un ensemble d'erreur, capturé avec WSAGetLastError(),
et je ne comprend pas leur signification car c'est un nombre ==> 10065
(Windows 2000 sp4). note : le meme code exécuté sur un autre ordi me donne
l'erreur 10004 (windows XP sp2) !!
Ces erreurs sont récupérées apres l'envoi d'un message via
la socket (sendto());
voila un bout de code qui vous montrera comment je cré et
déclare mes sockets.
pPaquet est une structure composée de deux autres structures
formant l'entete IP et l'entete ICMP.
struct IP_HEADER
{
unsigned
char ip_hl:4; // 4
bits("Internet header lengh") représentant la taille de l'entête IP
unsigned
char ip_v:4; // ip_v la version
(pour le moment version 4 de IP)
unsigned
char ip_tos; // "Type Of
Service" est codé sur 8 bits.
unsigned
short ip_len; // Le champ Longueur
totale est codé sur 16 bits et représente la longueur du paquet incluant
l'entête IP et les Data associées
unsigned
short ip_id; // Le champ
Identification est codé sur 16 bits et constitue l'identification utilisée pour
reconstituer les différents fragments.
unsigned
short ip_off; // Codé sur ce bits
cette valeur comporte le flag (3 bits indiquant l'état de la fragmentation) et
le champ Position fragment (13 bits indiquant la position du fragment par
rapport à la première trame)
unsigned
int ip_ttl; // Time To Live : la
durée de vie du socket.
unsigned
int ip_proto; // Le protocol
utilisé pour transporter les données. Peut être tcp(6), udp(17), icmp(1)
unsigned
short ip_sum; // Le checksum du
datagram
unsigned
int ip_src; //Adresse IP source
unsigned
int ip_dst; // Adresse IP
destination
};
struct ICMP_HEADER
{
unsigned
char icmp_type; // Permet
d'identifier le type de message envoyé ou recu (0 Echo Reply, 8 Echo
Request, 11 = TTL exceeded)
unsigned
char icmp_code; // Associé au
champ type il représente la définition de message d'erreur.
unsigned
short icmp_cksum; // Le champ
Checksum est codé sur 16 bits et représente la validité du paquet de la couche
3 ICMP
unsigned
short icmp_id; // 16 bits
définissant l’identifiant de l’émetteur
unsigned short icmp_seq; // 16 bits permettant au
récepteur d’identifier si il manque un paquet
};
Si quelqu'un a une idée sur mon problème, je suis preneur.
si vous souhaitez voir mon code plus en détail ou s'il n'y a pas assé de
détails je suis à l'écoute.
Bel0
Messages postés71Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention14 septembre 2007 23 mai 2006 à 16:00
Site de microsoft (MSDN):
WSAEINTR - 10004
Interrupted function call.
A blocking operation was interrupted by a call to WSACancelBlockingCall.
-> C'est consitant avec ce que je me rappelais d'avoir lu sur les changements de la stack IP sous XP. Il n'y a plus moyen d'envoyer de packet sur des sockets de type raw sous XP. Si on essaye, l'os empêche que l'appel système réussisse.
WSAEHOSTUNREACH - 10065
No route to host.
A socket operation was attempted to an unreachable host. See WSAENETUNREACH.
-> Sous w2k, c'est toujours possible il me semble. Si tu veux continuer, c'est sous cet OS qu'il faudra le faire. D'après l'erreur fournie, il s'agit peut-être d'un problème d'initialisation de l'adresse de destination du paquet. Vérifie un peu tout ça et si ca ne va toujours pas, copie le code ici et on jettera un coup d'oeil.
poporiding
Messages postés23Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 juin 2006 24 mai 2006 à 12:07
Merci Bel0 pour tes précision,
je viens de passer sous 2000 pro et la je compil et je lance mon programme. tout va bien (ou du moins on a l'impression)!!
quand j'analyse avec ethereal je me rend compte qu'il (le programme) ne prned pas les bonnes valeurs.
je me lance donc dans un degeugage et la je vois que quand je donne la valeur va a mon ip header, il le prend comme 4.
voila comment est déclarer le champ header lenght de mon entete ip qui est une strcuture:
struct IP_HEADER
{
unsigned char ip_hl:4; // 4 bits("Internet header lengh") représentant la taille de l'entête IP
unsigned char
ip_v:4; // ip_v la version (pour le moment version 4
de IP)
unsigned char
ip_tos; // "Type Of Service" est codé sur 8 bits.
unsigned short
ip_len; // Le champ Longueur totale est codé sur 16
bits et représente la longueur du paquet incluant l'entête IP et les
Data associées
unsigned short
ip_id; // Le champ Identification est codé sur 16
bits et constitue l'identification utilisée pour reconstituer les
différents fragments.
unsigned short
ip_off; // Codé sur ce bits cette valeur comporte le
flag (3 bits indiquant l'état de la fragmentation) et le champ Position
fragment (13 bits indiquant la position du fragment par rapport à la
première trame)
unsigned int
ip_ttl; // Time To Live : la durée de vie du socket.
unsigned int
ip_proto; // Le protocol utilisé pour transporter
les données. Peut être tcp(6), udp(17), icmp(1)
unsigned short ip_sum; // Le checksum du datagram
unsigned int ip_src; //Adresse IP source
unsigned int ip_dst; // Adresse IP destination
};
maniere dont je l'initialise :
struct IP_HEADER ip;
ip.ip_hl = 20;
et quand je debeug je vois une valeur différente sur ce champ:
Bel0
Messages postés71Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention14 septembre 2007 24 mai 2006 à 16:11
Une chose me choque dans ce que tu écris. Tu dis que ip_hl est sur 4bits .. on est d'accord et puis tu essayes de stocké la valeur 20 dans ces 4 bits ... un petit problème sur 4 bits, on ne peut stocké que des valeurs de 0 à 15.
Je fais un peu de recherche, je posterais ici ce que j'ai trouvé.
Bel0
Messages postés71Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention14 septembre 2007 24 mai 2006 à 16:17
Voilà la réponse !
La taille du paquet ip complet est donné BYTE et codé sur 16bits.
La taille du header est donné en mot de 32bits (en int si on veut). Comme un header ip standard fait 20bytes, tu dois mettre 5 comme taille (5*32 160bits 20bytes).
struct IP_HEADER ip;
ip.ip_v = 4;
ip.ip_hl = 5;
Le code hexa du char constitué de la version et de la taille du header doit donc être 0x45 ou 69 en base 10, c'est-à-dire le caractère 'E'.
Au passage, dans un header ip, on donne d'abord le numéro de version et ensuite la taille du header. N'oublies pas d'inverser ces deux champs dans ta structure !!
Belo
Vous n’avez pas trouvé la réponse que vous recherchez ?
poporiding
Messages postés23Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 juin 2006 24 mai 2006 à 17:35
Tu avais raison pour la taille de l'ip Header, il fallait bien mettre
5, une erreur de ma part (une de plus). cependant quand je lance
mon programme, j'ai toujours le meme problème!!!
Il initialise la taille de l'ip header a 16 et ethereal m'inidque le
message suivant : Bogus IP header length (16, must be at least 20)
Bel0
Messages postés71Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention14 septembre 2007 24 mai 2006 à 17:38
Au passage, dans un header ip, on donne d'abord le numéro de version et ensuite la taille du header. N'oublies pas d'inverser ces deux champs dans ta structure !!