Bonjour,
J'ai effectué pas mal de recherches (notamment sur ce forum) et trouvé bon nombres de références à mon problème mais je bloque toujours sur la conversion d'une adresse IP saisie par l'utilisateur vers son utilisation par libnet.
Le format d'entrée est un std::string et libnet utilise des pointeurs uint8_t pour manipuler les adresses.
Comme c'est un problème que je rencontre fréquemment, je me suis créé une classe pour gérer les adresses IP et MAC.
La fonction incriminée est inspirée d'un code trouvé sur ce forum :
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
| ADDRESS::ADDRESS(const string &addr)
{
string byte[8];
istringstream iss;
int nb_sep = 0;
uint16_t value = 0; // maximum 2 octets dans le cas ipv6
uint32_t ipv4 = 0;
// split des octets dans un tableau (type string)
for( size_t i=0; i<addr.size(); i++ )
{
if( nb_sep > 7 ) // le tableau d'octet ne permet pas de gerer plus de 8 elements (une IPv6)
throw BadFormat();
if( isxdigit(addr[i]) )
byte[nb_sep] += addr[i];
else if( addr[i] == '.' || addr[i] == ':' )
nb_sep++;
else
throw BadFormat();
}
// traitement en fonction du type d'adresse
switch(nb_sep)
{
case 3: // 3 separateurs pour une IPv4
this->type = IPv4;
for( int i=0; i<=nb_sep; i++ )
{
value = atoi( byte[i].c_str() ); // conversion en entier
//cout << "IP/ i: " << i << " byte[i]: " << byte[i] << " value: " << value << endl;
ipv4 += (value << (i*8)); // processeur little endian (intel)
//ipv4 += (value << (24-(i*8))); // processeur big endian (sparc)
}
cout << "IP ipv4 (int): " << ipv4 << endl;
this->address = (uint8_t *) &ipv4;
break;
case 5: // 5 separateurs pour une MAC
this->type = MAC;
cout << "A venir\n";
break;
case 7: // 7 separateurs pour une IPv6 complete
this->type = IPv6;
cout << "IPv6 non implemented yet !\n";
break;
default:
throw BadFormat();
}
} |
Cette fonction lit octet par octet l'adresse envoyée et détecte le format (IPv4, Mac ou IPv6) en fonction du nombre d'éléments. Ensuite, un traitement spécifique est mis en oeuvre. Pour le moment je bloque sur IPv4.
En testant cette fonction avec "ADDRESS(192.168.0.1)", j'obtiens :
Ce qui correspond bien à : "1×256^3+168×256+192"
Pourtant, lors de l'injection wireshark me retourne une addresse en 160.81.222.9
Si je hardcode cette même adresse avec sa représentation hexadécimale "\xc0\xa8\x00\x01\x00" et que je déclare un pointeur uint8_t dessus, l'injection est alors correcte.
J'avoue avoir beaucoup de mal à débugger ce problème qui, à mon avis vient de là :
this->address = (uint8_t *) &ipv4;
Si quelqu'un à une idée, je suis preneur.
Partager