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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  TCP Checksum falla en algunos casos - C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: TCP Checksum falla en algunos casos - C++  (Leído 1,521 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
TCP Checksum falla en algunos casos - C++
« en: 5 Julio 2016, 11:34 am »

Bueno pues es bastante raro, parece que esta todo correcto (el código), pero sin embargo hay veces que falla aunque suele acertar el 90% de los checksums, pero los que falla son los de handshake sobretodo que se caracterizan por llevar el campo de "options" que no está explícito en el paquete. Normalmentela diferencia de error suele estar en la del tamaño del bytes del campo options, si el campo es de 12 bytes, lo que sumo del checksum es 12 menos que lo que debería sumarle, no entiendo nada, en caso de fallar sería esta línea add = (USHORT)((content[16] << 8) + content[17]) - (USHORT)((content[46] & 0xF0) >> 4)  pero está correcta.

Código
  1. UCHAR* GetTCPChecksum(const UCHAR* content, UINT length)
  2. {
  3. UCHAR checksum[2];
  4. USHORT added = 0, add = 0;
  5. std::bitset<17> bs;
  6.  
  7. if (length < 54)
  8. return NULL;
  9.  
  10. for (UCHAR i = 26; i < 33; i++)
  11. {
  12. add = (USHORT)((content[i] << 8) + content[i + 1]);
  13. bs = added + add;
  14. added += add;
  15. if (bs[16] == 1)
  16. added++;
  17. i++;
  18. }
  19.  
  20. add = (USHORT)0x06;
  21. bs = added + add;
  22. added += add;
  23. if (bs[16] == 1)
  24. added++;
  25.  
  26. add = (USHORT)((content[16] << 8) + content[17]) - (USHORT)((content[46] & 0xF0) >> 4) * 4;
  27. bs = added + add;
  28. added += add;
  29. if (bs[16] == 1)
  30. added++;
  31.  
  32. for (UINT i = 34; i < length - 1; i++)
  33. {
  34. if (i != 50)
  35. {
  36. add = (USHORT)((content[i] << 8) + content[i + 1]);
  37. bs = added + add;
  38. added += add;
  39. if (bs[16] == 1)
  40. added++;
  41. }
  42. i++;
  43. }
  44.  
  45. if (length % 2)
  46. {
  47. add = (USHORT)(content[length - 1] << 8) + 0;
  48. bs = added + add;
  49. added += add;
  50. if (bs[16] == 1)
  51. added++;
  52. }
  53.  
  54. added = added & 0xFFFF;
  55. added = ~added;
  56.  
  57. checksum[0] = (added >> 8) & 0x00FF;
  58. checksum[1] = added & 0x00FF;
  59.  
  60. return checksum;
  61. }
  62.  

Hay que  sumar en de 16 bits en 16 bits (en USHORT): el IP origen + IP destino + numero de protocolo <<8 + longitud del segmento TCP (la linea en cuestión) + payload TCP y si es impar se suma el ultimo pasandole a la izquierda del USHORT (<<8).

Eso es todo pero la práctica.. dejo un link que sigo para hacerlo:

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

Probad vosotros mismos con el wireshark, pasandole el paquete completo y el header-> caplen a la función, los paquetes que llevan el campo options suelen fallar.




« Última modificación: 5 Julio 2016, 21:40 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.
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: TCP Checksum falla en algunos casos - C++
« Respuesta #1 en: 5 Julio 2016, 21:28 pm »

Ya lo solucioné, calculando la longitud del campo de options y añadiendolo al checksum, mágicamente todo funcionó, todos los checksum salen correctos ahora.

Código
  1. UCHAR* GetTCPChecksum(const UCHAR* content, UINT length)
  2. {
  3. UCHAR checksum[2];
  4. USHORT added = 0, add = 0;
  5. std::bitset<17> bs;
  6.  
  7. if (length < 54)
  8. return NULL;
  9.  
  10. for (UCHAR i = 26; i < 33; i++)
  11. {
  12. add = (USHORT)((content[i] << 8) + content[i + 1]);
  13. bs = added + add;
  14. added += add;
  15. if (bs[16] == 1)
  16. added++;
  17. i++;
  18. }
  19.  
  20. add = (USHORT)0x06;
  21. bs = added + add;
  22. added += add;
  23. if (bs[16] == 1)
  24. added++;
  25.  
  26. add = (USHORT)((content[46] & 0xF0) >> 4) * 4 - 20;
  27. bs = added + add;
  28. added += add;
  29. if (bs[16] == 1)
  30. added++;
  31.  
  32. add = (USHORT)((content[16] << 8) + content[17]) - (USHORT)((content[46] & 0xF0) >> 4) * 4;
  33. bs = added + add;
  34. added += add;
  35. if (bs[16] == 1)
  36. added++;
  37.  
  38. for (UINT i = 34; i < length - 1; i++)
  39. {
  40. if (i != 50)
  41. {
  42. add = (USHORT)((content[i] << 8) + content[i + 1]);
  43. bs = added + add;
  44. added += add;
  45. if (bs[16] == 1)
  46. added++;
  47. }
  48. i++;
  49. }
  50.  
  51. if (length % 2)
  52. {
  53. add = (USHORT)(content[length - 1] << 8) + 0;
  54. bs = added + add;
  55. added += add;
  56. if (bs[16] == 1)
  57. added++;
  58. }
  59.  
  60. added = added & 0xFFFF;
  61. added = ~added;
  62.  
  63. checksum[0] = (added >> 8) & 0x00FF;
  64. checksum[1] = added & 0x00FF;
  65.  
  66. return checksum;
  67. }
  68.  

Os dejo mi precioso código, quien sabe seguramente a alguien le pueda ayudar en un futuro. Seguramente lo mejore y pase a hacerlo con operadores de byte en vez de con bitset que es lo más eficiente.

Saludos, 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:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines