The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"помогите пересчитать TCP checksum"
Отправлено tcp, 28-Сен-06 14:33 
>судя по привиденному выше в сообщениях коду эта операция бессмысленна, т.е. надо чтобы в псевдопакете поле сумма было равно 0. а строка tcp->th_sum = 0; - это обнуление не в псевдопакете, а в некой структуре которая в самом расчете не принимает участия :)
http://www.security.nnov.ru/files/stream3.c

inline u_short tcp_checksum(u_short *addr, int len)
{
    register int nleft = len;
    register u_short *w = addr;
    register int sum = 0;
    u_short answer = 0;

     /* Our algorithm is simple, using a 32 bit accumulator (sum), we add
      * sequential 16 bit words to it, and at the end, fold back all the
      * carry bits from the top 16 bits into the lower 16 bits. */

     while (nleft > 1)  {
         sum += *w++;
         nleft -= 2;
     }

     /* mop up an odd byte, if necessary */
     if (nleft == 1) {
         *(u_char *)(&answer) = *(u_char *) w;
         sum += answer;
     }

     /* add back carry outs from top 16 bits to low 16 bits */
     sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
     sum += (sum >> 16);                /* add carry */
     answer = ~sum;                     /* truncate to 16 bits */
     return(answer);
}

struct _pseudoheader {
struct in_addr source_addr;
struct in_addr destination_addr;
u_char zero; /* зеpо */
u_char protocol;
u_short length;
} pseudoheader;

u_char *pseudopacket;

pseudoheader.source_addr = iph->ip_src;
pseudoheader.destination_addr = iph->ip_dst;
pseudoheader.zero = 0;
pseudoheader.protocol = IPPROTO_TCP;
pseudoheader.length = htons(size_tcp + size_payload);

pseudopacket = (char *)malloc(sizeof(pseudoheader) + sizeof(struct tcphdr) + size_payload);
if ( !pseudopacket ) {
perror ("malloc");
exit (1);
}
memcpy (pseudopacket, &pseudoheader, sizeof (pseudoheader));

memcpy (pseudopacket + sizeof (pseudoheader),packet + size_ethernet + size_ip, size_tcp);
memcpy (pseudopacket + sizeof (pseudoheader) + size_tcp,packet + size_ethernet + size_ip + size_tcp, size_payload);


tcph->th_sum = 0;
tcph->th_sum = tcp_checksum ((u_short *)pseudopacket, sizeof (pseudoheader)+ size_tcp + size_payload);

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру