J'ai progressé mais il reste toujours un petit problème au niveau du checksum.
Tout d'abbord j'ai décidé de laisser quand même passer les packets à rediriger.
J'ai donc utilisé les fonctions générales de WinPCAP avec règle de filtrer et tout et tout ...
et puis dans le loop des packet reçus j'ai : (où pkt_data est le header + data du packet reçu)data = (u_char*)pkt_data; //on copie les data dans une variable non const
data[0]=0x00; // on modifie l'addresse mac (header ethr)
data[1]=0x06;
data[2]=0x5b;
data[3]=0x66;
data[4]=0xbf;
data[5]=0x24;
data[24] = 0x00; // on modifie le checksum à zero (header ip)
data[25] = 0x00;
data[30]=0xc0; // on modifie l'ip dest (header ip)
data[31]=0xa8;
data[32]=0x00;
data[33]=0x0c;
ckck = in_cksum((u_short *)&data,header->len); // on calcule le nouveau checksum
printf("%x", ckck); // on l'affiche :p
data[24] = (u_char)(ckck / 0xff); // on copie dans le premier u_char les 8 premiers octets de ckck (le checksum)
data[25] = (u_char)ckck; // les derniers dans le dernier
pcap_sendpacket(adhandle, data, header->len); // on envoie tout ca
Avec comme in_cksum que j'ai trouvé sur internet :
inline u_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);
}
Donc les packets s'envoyent bien mais pour les pings, il n'y a pas de réponse, j'ai vérifié avec wireshark et le checksum n'est pas correct.
J'ai déjà essayé de prendre que le header ip pour calculer le checksum mais ça ne marche pas non plus.
Merci de votre aide, a plus.