Ip et udp checksum dans packet UDP

themaste Messages postés 130 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 8 juillet 2008 - 1 nov. 2004 à 14:59
themaste Messages postés 130 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 8 juillet 2008 - 3 nov. 2004 à 20:20
Bonjour à tous!
Je suis en train d'esssayer de faire une application permettant de modifier un packet UDP destiné à un broadcast sur une ip en particulier.
Je suis pas loin du but, mais j'ai un problème avec les checksum, ip et udp.
Je capture avec ethereal les trames, mais a chaque fois que la mienne est envoyé, il me marque que les checksum sont incorrect.

J'ai essayer plusieurs fonctions pour calculer le CRC de l'ip header, mais a chaque fois, ca marche pas. Je ne comprds pas non plus exactement comment c'est calculer.

Est-ce que qqu'un pourrait m'aider? je ne sais plus quoi faire!

Merci

3 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
1 nov. 2004 à 16:19
Salut,
voici la fonction utilisée pour calculer la checksum d'un header ip, le champ checksum doit etre a 0 avant le calcul (et je précise que cette fonction n'est pas de moi):

// Description:
// This function calculates the 16-bit one's complement sum
// for the supplied buffer.
//
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;

while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);

return (USHORT)(~cksum);
}

Pour la checksum udp, je crois (à verifier) que tu peux mettre 0 dans le champ checksum sans que ca pose probleme.
0
themaste Messages postés 130 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 8 juillet 2008 2
1 nov. 2004 à 20:44
je craque!!!
merci pour ta fonction, mais malheureusement, comme toutes les otres, ca ne marche pas. Voici mes lignes de codes pour cette partie, car du coup, je pense vraiment que je passe à coté d'un truc, c pas possible. Et ainsi, vous aurez une meilleur idée..j'espere!! (PS: j'utilise winpcap)
--------------------------------------------------------
/* IPv4 header */
typedef struct ip_header{
    u_char  ver_ihl;        // Version (4 bits) + Internet header length (4 bits)
    u_char  tos;            // Type of service 
    u_short tlen;           // Total length 
    u_short identification; // Identification
    u_short flags_fo;       // Flags (3 bits) + Fragment offset (13 bits)
    u_char  ttl;            // Time to live
    u_char  proto;          // Protocol
    u_short crc;            // Header checksum
    ip_address  saddr;      // Source address
    ip_address  daddr;      // Destination address
    u_int   op_pad;         // Option + Padding
}ip_header;

//Packet message
unsigned char * sPacketMessage;
//////////////////////////

/*---------------------------------------------------------------------------------------
getPacket: Récupère les packets
---------------------------------------------------------------------------------------*/
int getPacket(unsigned char ** packet)
{
int ret;
struct pcap_pkthdr *header;

ret = pcap_next_ex(adhandle, &header, packet);

if(ret == -1)
{ printf("Packet capture error!\n"); return -1; }
if((ret 1) && (header->caplen header->len))
return header->caplen;

return 0;
}

fonction main()
{
int packet;
...
//Récupération du packet
packet_size = getPacket((unsigned char **)&sPacketMessage);
modifPacket();
}

fonction modifPacket()
{
//Struct ip_header
ip_header *ih;

/* retrieve the position of the ip header */
ih = (ip_header *) (sPacketMessage +
        14); //length of ethernet header

...

//Défini le checksum (crc) a null avt calcul
ih->crc =  0x0000;

//Calcul du checksum
ih->crc = checksum((unsigned short *)&ih, sizeof(struct ip_header)); //Fonction cité dans post précédent

}



Voila, je pense avoir mis les éléments qu'il faut. Franchement, je ne vois pas ce qui cloche, le pourquoi c toujours incorrect. Ca doit être con, surement de ma faute, mais je vois pas.

Merci pour votre aide!
PS: Le but est de faire un programme sur le mme style que lancraft. Si qqu'un connais les sources de lancraft, ou je peux les recup, ca m'aiderait bcp aussi je pense!
0
themaste Messages postés 130 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 8 juillet 2008 2
3 nov. 2004 à 20:20
personne n'a d'idée? :question)
0
Rejoignez-nous