voila j'arrive a faire mes packets udp mais ce que je n'arrive pas a trouver c'est comment faire le checksum de la couche udp
car juste envoyer le packet qui est pour 192.168.2.1:521 de moi -> 192.168.2.101:48605 sans données wireshark me dit le checksum du packet c'est
ça fait 2 jours que j'essaye de faire cette somme de contrôle mais je n'y arrive pas! POUVEZ VOUS M'AIDER???

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <errno.h>
 
#define PORT 521
#define IP "192.168.2.1"
#define Source_IP "192.168.2.101"
#define Source_Port 48605
 
 
int winsock_err(int quit) {
  char    *error;
  char err_resu[2000];
  int l=0;
  l=WSAGetLastError();	
  switch(l) {
    case 10004: error = "Appel systeme interrompu"; break;
    case 10009: error = "Numero de fichier incorrect"; break;
    case 10013: error = "Permission refusee"; break;
    case 10014: error = "Adresse incorrecte"; break;
    case 10022: error = "Argument non valide"; break;
    case 10024: error = "Trop de fichiers ouverts"; break;
    case 10035: error = "L'operation serait bloquee"; break;
    case 10036: error = "Operation en cours. Cette erreur est renvoyee si une fonction d'API Windows Sockets est appelee alors qu'une fonction bloquante est en cours";break;
    case 10037: error = "Operation deja en cours"; break;
    case 10038: error = "Operation Socket sur non-socket"; break;
    case 10039: error = "Adresse de destination nécessaire"; break;
    case 10040: error = "Message trop long"; break;
    case 10041: error = "Type de protocole incorrect pour le socket"; break;
    case 10042: error = "Protocole non disponible"; break;
    case 10043: error = "Protocole non pris en charge"; break;
    case 10044: error = "Type de socket non pris en charge"; break;
    case 10045: error = "Opération non prise en charge sur le socket"; break;
    case 10046: error = "Famille de protocoles non prise en charge"; break;
    case 10047: error = "Famille d'adresses non prise en charge par la famille de protocoles"; break;
    case 10048: error = "Adresse deja en cours d'utilisation"; break;
    case 10049: error = "Impossible d'allouer l'adresse demandee"; break;
    case 10050: error = "Reseau hors service. Cette erreur peut etre signalée a tout moment si l'implementation Windows Sockets detecte un echec sous-jacent."; break;
    case 10051: error = "Le reseau n'est pas accessible"; break;
    case 10052: error = "Le reseau a abandonne la connexion lors de la reinitialisation"; break;
    case 10053: error = "Le logiciel a entraine l'abandon de la connexion"; break;
    case 10054: error = "Connexion reinitialisée par un poste"; break;
    case 10055: error = "Pas d'espace disponible dans la memoire tampon"; break;
    case 10056: error = "Le socket est deja connecte"; break;
    case 10057: error = "Le socket n'est pas connecte"; break;
    case 10058: error = "Envoi impossible après l'arrêt du socket"; break;
    case 10059: error = "Trop de références : impossible de raccorder"; break;
    case 10060: error = "Delai de connexion depasse"; break;
    case 10061: error = "Connexion refusee"; break;
    case 10062: error = "Trop de niveaux de liens symboliques"; break;
    case 10063: error = "Nom de fichier trop long"; break;
    case 10064: error = "Le serveur hôte ne fonctionne plus"; break;
    case 10065: error = "Pas d'itineraire pour le serveur hote"; break;
    case 10066: error = "Dossier n'est pas vide"; break;
    case 10067: error = "Trop de processus"; break;
    case 10068: error = "Trop d'utilisateurs"; break;
    case 10069: error = "Le Qouta du disc est depasse"; break;
    case 10070: error = "Stale NFS file handle"; break;
   	case 10071: error = "Too many levels of remote in path"; break;
    case 10091: error = "Renvoye par l'appel WSAStartup() ; indique que le sous-systeme du reseau est inutilisable"; break;
    case 10092: error = "Renvoye par l'appel WSAStartup() ; indique que les DLL de Windows Sockets ne peuvent pas prendre en charge cette application"; break;
    case 10093: error = "Winsock non initialise. Ce message est renvoye par n'importe quelle fonction à l'exception de l'appel WSAStartup() ; indique qu'un appel WSAStartup() reussi n'a pas encore ete realise"; break;
    case 10101: error = "Deconnexion"; break;
    case 11001: error = "Hôte introuvable. Ce message indique que la cle (nom, adresse, etc.) est introuvable"; break;
    case 11002: error = "Serveur hote non decisionnaire introuvable. Cette erreur pourrait indiquer que le service de nom lui-meme ne fonctionne pas"; break;
    case 11003: error = "Erreur non récupérable. Cette erreur peut indiquer que le service de nom lui-même ne fonctionne pas"; break;
    case 11004: error = "Nom valide, aucune donnée du type demande enregistree. Cette erreur indique que la cle (nom, adresse, etc.) est introuvable"; break;
    default: error ="Erreur inconnue"; break;
    }
 
    sprintf(err_resu, "[!]Erreur! Code : %d\n  %s", error);
    printf("\n%s\n",err_resu);
    system("pause");
    if (quit)
      exit(1);
    else 
      return l;
} 
 
 
typedef struct udphdr {
    unsigned short srcport;
    unsigned short dstport;
    unsigned short length;
    unsigned short checksum;
} UDP_HDR;
 
 
 
 
unsigned short in_cksum(u_short * addr, int len) {
  register int nleft = len;
  register u_short *w = addr;
  register int sum = 0;
 
  u_short answer = 0;
 
  while (nleft > 1) {
    sum += *w++;
	nleft -= 2;
  }
  if (nleft == 1) {
    *(u_char *) (&answer) = *(u_char *) w;
	sum += answer;
  }
  sum = (sum >> 16) + (sum & 0xffff);
  sum += (sum >> 16);
  answer = ~sum;
 
  return (answer);
}
 
 
int main(int argc, char *argv[]){ 
  printf("[+]initialisation des varibles");
  struct udphdr *udp;
  unsigned short sizeofPacket;
  char *packet = NULL, *ptr = NULL;
  int len_sin;        
  SOCKET sock;
  SOCKADDR_IN sin;
  WSADATA data;
  printf("   OK\n");
  printf("[+]WSAStartup");  
  if( (WSAStartup(MAKEWORD(2,0), &data)) != 0)
     winsock_err(1);    
   printf("   OK\n[+]Création du socket");
  if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP))==INVALID_SOCKET )
      winsock_err(1);   
 
  printf("   OK\n[+]Allocation mémoire");    
 
  udp = (struct udphdr *) malloc(sizeof(struct udphdr));
  memset(udp, 0x0, sizeof(struct udphdr));
 
  printf("   OK\n[+]Construction de la partie du packet UDP"); 
 
  udp->srcport = htons(Source_Port);
  udp->dstport = htons(PORT);
  udp->length  = htons(sizeof(struct udphdr));
  udp->checksum = 0;
 
  printf("   OK\n[+]Construction du packet"); 
  sizeofPacket = sizeof(struct udphdr);
  packet = (char *) malloc(sizeofPacket);
  memset(packet, 0x0, sizeofPacket);
  ZeroMemory(packet, sizeofPacket);
  ptr = packet;
  memcpy(ptr, udp, sizeof(struct udphdr));
  ptr += sizeof(struct udphdr);
 
  printf("   OK\n[+]Initialisation de la destination"); 
 
  sin.sin_family = AF_INET;
  sin.sin_addr.s_addr = inet_addr(IP);
  sin.sin_port=htons(PORT); 
  len_sin=sizeof(sin);
 
  printf("   OK\n[+]Envois des données"); 
 
  if (sendto(sock, packet, sizeofPacket, 0x0, (struct sockaddr *) &sin,len_sin) == SOCKET_ERROR)
      winsock_err(1); 
  printf("   OK\n[+]TOUT C'est bien deroule\n"); 
  closesocket(sock);              
  WSACleanup(); 
  system("PAUSE");	
  return 0;
}