elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  calcular ip checksum y paso de u_long a u_char falla
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: calcular ip checksum y paso de u_long a u_char falla  (Leído 1,581 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
calcular ip checksum y paso de u_long a u_char falla
« en: 20 Julio 2015, 14:21 pm »

Código
  1. u_char* checksum_ip(u_char* datos, int tamaño)
  2. {
  3. u_char *checksum = new u_char[2]();
  4. u_long suma = 0;
  5. for (int i = 0; i < 24; i++)
  6. {
  7. suma += datos[i];
  8. if (suma & 0xFFFF0000)
  9. {
  10. suma &= 0xFFFF;
  11. suma++;
  12. }
  13. }
  14. checksum = (u_char*)&suma;
  15. cout << checksum << endl;
  16. for (int i = 0; i < sizeof(checksum); i++)
  17. printf("%x", checksum[i]);
  18. system("pause");
  19. return checksum;
  20. }
  21.  

La salida no concuerda con el checksum original del paquete, algo está fallando, quiero pensar que el paso de u_long a u_char* es correcto, iré dando más detalles.

Saludos.

Edito: http://www.arcesio.net/checksum/checksuminternet.html, aqui explica bien como funciona lo del checksum, y el de ip. Según he entendido debo de sumar, de 16 bits en 16 bits todos los campos del header hasta llegar a el del checksum, que ocupartian los bytes 24 y 25 de la cabecera, así pues hice esto, pero no me funciono, no tengo ni idea de trabajar con bits ni entiendo como lo hacen  >:( >:(

Código
  1. u_char* checksum_ip(u_char* datos, int tamaño)
  2. {//24 y 25 son checksum hasta el 23 sumamos
  3.  
  4. u_char *checksum = new u_char[2]();
  5. for (int i = 0; i < 24; i++)
  6. checksum += datos[i];
  7. //sumo los campos byte a byte o ¿como sino?
  8. for (int i = 0; i < 24; i++)
  9. {
  10. if (checksum[i] == 1)//ya se que esta mal, pero aqui sería poner 0 en los 1 y 1 en los 0, trbajando con bits ¿como accedo a ellos? ni idea
  11. checksum[i] = 0;
  12. else
  13. checksum[i] = 1;
  14. }

Segun pone aqui: http://www.arcesio.net/checksum/checksumIP.html

Debería coger los bytes de 2 en 2, y formar con el par una ristra de bits con 16 en total. Esa ristra la sumo.

Vale vale, tenia una cosa mal, ahora comento.

Código
  1. //un sumando del 13 al 23 incluyendo ambos.
  2. //otro dumando 16 bits de ceros, y 2 ristras de 16 bits con las ips
  3. //se suman se cambian 0s por 1s y 1s por 0s, separamos la ristra de 6 en 2 bytes
  4. //formamos un u_char[2] y ya tenemos el checksum ip

La cosa ahora es como puedo sumarlos de 16 en 16?, podría sumar byte a byte, de 8 en 8, con u_char + .., pero de 16 en 16?.

Os dejo el code:

Código
  1. u_char* checksum_ip(u_char* datos, int tamaño)
  2. {//24 y 25 son checksum hasta el 23 sumamos
  3. //un sumando del 13 al 23 incluyendo ambos.
  4. //otro dumando 16 bits de ceros, y 2 ristras de 16 bits con las ips
  5. //se suman se cambian 0s por 1s y 1s por 0s, separamos la ristra de 6 en 2 bytes
  6. //formamos un u_char[2] y ya tenemos el checksum ip
  7. /*
  8. u_char *checksum = new u_char[2]();
  9. for (int i = 0; i < 24; i++)
  10. checksum += datos[i];
  11. for (int i = 0; i < 24; i++)
  12. {
  13. if (checksum[i] == 1)
  14. checksum[i] = 0;
  15. else
  16. checksum[i] = 1;
  17. }*/
  18. u_char *checksum = new u_char[2]();
  19. u_long suma = 0;
  20. for (int i = 13; i < 24; i++)
  21. {
  22. suma += datos[i];
  23. if (suma & 0xFFFF0000)
  24. {
  25. suma &= 0xFFFF;
  26. suma++;
  27. }
  28. }
  29. for (int i = 26; i < 33; i++)
  30. {
  31. suma += datos[i];
  32. if (suma & 0xFFFF0000)
  33. {
  34. suma &= 0xFFFF;
  35. suma++;
  36. }
  37. }
  38. u_short a = ~(suma & 0xFFFF);
  39. checksum = (u_char*)&a;
  40. cout << checksum << endl;
  41. for (int i = 0; i < sizeof(checksum); i++)
  42. printf("%x", checksum[i]);
  43. system("pause");
  44. return checksum;
  45. }

Seguiré investigando.

Horrible, http://www.dreamincode.net/forums/topic/158278-help-with-c-ip-header-checksum/

Saludos.

Ya lo tengo orgasm http://www.badprog.com/c-type-converting-two-uint8-t-words-into-one-of-uint16-t-and-one-of-uint16-t-into-two-of-uint8-t


« Última modificación: 21 Julio 2015, 02:16 am por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: calcular ip checksum y paso de u_long a u_char falla
« Respuesta #1 en: 19 Septiembre 2015, 23:54 pm »

meto ping al tema, volvemos a vernos las caras, necesito calcular el ip checksum y no hay manera, por más códigos que veo ninguno coincide con el checksum del paquete, he probado muchos, pero el que más se ha aproximado fue el que traté de implementar hace tiempo, cuando creé este hilo:

Código
  1. //http://realtimecollisiondetection.net/blog/?p=78
  2. u_char* checksum_ip(u_char* datos, int tamaño)
  3. {
  4. u_char *checksum = new u_char[2]();
  5. uint16_t sumando = 0, sumanda = 0;
  6. bitset<16> salida;
  7. for (int i = 14; i < 34; i++)
  8. {
  9. if (i != 24 && i != 25)
  10. {
  11. printf("i = %d, i + 1 = %d -> ", i, i + 1);
  12. sumanda = (uint16_t)((datos[i] << 8) + datos[i + 1]);//no puede haber acarreo de bit ??
  13. salida = sumanda;
  14. cout << salida << endl;
  15. sumando += sumanda;
  16. if (sumando & 0xFFFF0000)
  17. {
  18. sumando &= 0xFFFF;
  19. sumando++;
  20. }
  21. i++;
  22. }
  23. }
  24. sumando = sumando +2;
  25. sumando = sumando & 0xFFFF;
  26. sumando = ~sumando;
  27. salida = sumanda;
  28. cout << salida << endl;
  29. checksum[0] = (sumando >> 8) & 0x00FF;
  30. checksum[1] = sumando & 0x00FF;
  31. printf("\n%x%x", checksum[0], checksum[1]);
  32. system("pause");
  33. return checksum;
  34. }

Salidas original/calculado:

Citar
869a/869d
869a/8699
7c6f/7fb4
8699/8698
74b/740

Evidentemente está mal, ¿que puede fallar? me iré pasando a ver si puedo solucionarlo.

¿Alguien me puede decir porque este código no funciona? , debería de hacerlo he probado con todo.

Saludos, toda ayuda es bienvenida.

Edito: Si sumo 2 obtengo lo mismo que en el ejemplo de aqui:

http://www.arcesio.net/checksum/checksumIP.html

El mismo resultado final, sin embargo no funciona con los paquetes, pero si sumo 3 el 70% de los checksum de los paquetes coinciden, ¿que puede faltar?

Resuelto, conseguí detectar si había acarreo de byte y lo calcule satisfactoriamente.

Saludos.


« Última modificación: 20 Septiembre 2015, 12:00 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Disco duro falla aleatoriamente. ¿Posible falla en el motor? :P
Hardware
Ariath 3 4,504 Último mensaje 23 Junio 2010, 22:05 pm
por Aprendiz-Oscuro
Falla en televisor Aiwa cntext400 posible falla en el vertical imagen
Electrónica
Anonymous250 8 10,999 Último mensaje 1 Febrero 2013, 12:46 pm
por Anonymous250
Pasar de const u_char* a char* en c++ « 1 2 »
Programación C/C++
Kaxperday 10 5,839 Último mensaje 6 Julio 2015, 10:52 am
por Kaxperday
Error copiando u_char* con apis
Programación C/C++
Kaxperday 4 2,383 Último mensaje 27 Julio 2015, 01:33 am
por Kaxperday
TCP Checksum falla en algunos casos - C++
Programación C/C++
Kaxperday 1 1,506 Último mensaje 5 Julio 2016, 21:28 pm
por Kaxperday
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines