Создать для клиента генератор пакетов (для проведения атаки ICMP-Flood), а для сокета-сервера чтение с защитой. При компиляции клиента выдает забавную ошибку, которую пытался убрать с помощью просто перевода из одного типа в другой как вроде и просит компилятор, но это не проходит. Помогите справиться. | Код | #include <cstdlib> #include <iostream> #include <string> #include <sstream> #include <winsock2.h> #include <windows.h>
using namespace std;
struct icmp_header { unsigned char type; // тип ICMP- пакета unsigned char code; // код ICMP- пакета unsigned short crc ; // контрольная сумма unsigned long orig_timestamp; // дополнительные поля unsigned long recv_timestamp; // уточняющий тип unsigned long trns_timestamp; //ICMP-пакета };
struct ip_header { unsigned char version; // номер версии протокола unsigned char tos; // тип сервиса unsigned short length; // общая длина пакета unsigned short id ; // идентификатор пакета unsigned short flags; // флаги unsigned char ttl ; // Время жизни пакета unsigned char proto; // Протокол верхнего уровня unsigned short crc; // CRC заголовка unsigned int src_addr; // IP- адрес отправителя unsigned int dst_addr; // IP- адрес получателя }; //подсчет контрльной суммы
unsigned short rs_crc (unsigned short * buffer, int length) { unsigned long crc = 0; // Вычисление CRC while (length > 1) { crc += *buffer++; length -= sizeof (unsigned short); } if (length) crc += *(unsigned char*) buffer; // Закончить вычисления crc = (crc >> 16) + (crc & 0xffff); crc += (crc >> 16); //Смещение CRC , если необходимо if (1) crc = crc << 1; // Возвращаем инвертированное значение return (unsigned short)(~crc); }
/*______________ отправка в сеть*/ int rs_send_ip (SOCKET s, struct ip_header iph, unsigned char * data, int data_length, unsigned short dst_port_raw) { char * buffer; int result; sockaddr_in target; unsigned char header_length; unsigned int packet_length; memset (&target, 0, sizeof (target)); target.sin_family = AF_INET; target.sin_addr.s_addr = iph.dst_addr; target.sin_port = dst_port_raw; // Вычисление длины и заголовка пакета header_length = sizeof (struct ip_header); packet_length = header_length + data_length; // Установка CRC. iph.crc = 0; // Заполнение некоторых полей заголовка IP . iph.version = header_length / 4 + (unsigned char) atoi ("4") * 16; // Если длина пакета не задана , то //длина пакета приравнивается к длине заголовка if (!iph.length) iph.length = htons (packet_length); buffer =(char *) calloc (packet_length, sizeof (char)); // Копирование заголовка пакета в буфер ( CRC равно 0). memcpy (buffer, &iph, sizeof (struct ip_header)); // Копирование данных в буфер if (data) memcpy (buffer + header_length, data, data_length); // Вычисление CRC. iph.crc = rs_crc ((unsigned short *) buffer, packet_length); // Копирование заголовка пакета в буфер ( CRC посчитана). memcpy (buffer, &iph, sizeof (struct ip_header)); // Отправка IP пакета в сеть. result = sendto (s, buffer, packet_length, 0,(struct sockaddr *) &target, sizeof (target)); free (buffer); return result; }
int rs_send_icmp (SOCKET s, struct ip_header iph, struct icmp_header icmph, unsigned char * data, int data_length) { char * buffer; int result; unsigned char header_length; unsigned int packet_length; data_length = 0; // вычисление длин пакета и заголовка. header_length = sizeof (struct icmp_header); packet_length = header_length + data_length; icmph.crc = 0; buffer = (char *)calloc (packet_length, sizeof (char)); // Копирование заголовка пакета в буфер ( CRC равно 0). memcpy (buffer, &icmph, sizeof (struct icmp_header)); // Вычисление CRC. icmph.crc = rs_crc ((unsigned short *) buffer, packet_length); // Копирование заголовка пакета в буфер ( CRC посчитана). memcpy (buffer, &icmph, sizeof (struct icmp_header)); // Отправка IP пакета со вложенным ICMP пакетом. //unsigned char u = (unsigned)buffer; result = rs_send_ip (s, iph, buffer, packet_length, 0); free (buffer); return result; } int main(int argc, char *argv[]) { //Инициализация библиотеки WinSock WSADATA wsaData;
int errcod; errcod = WSAStartup(MAKEWORD(2, 2), &wsaData); if(errcod!=0) { cout<<"WinSock not found!"; return 0; } struct ip_header iph; struct icmp_header icmph;
icmph.type = 8; // тип ICMP- пакета icmph.code= 0; // код ICMP- пакета icmph.crc=0; // контрольная сумма icmph.orig_timestamp; // дополнительные поля icmph.recv_timestamp; // уточняющий тип icmph.trns_timestamp; //ICMP-пакета
iph.version=0x4; // номер версии протокола iph.tos= 0; // тип сервиса (нормальный) iph.length= 10; // общая длина пакета iph.id= htonl(54321) ; // идентификатор пакета iph.flags= htons(0); // флаги iph.ttl=255 ; // Время жизни пакета iph.proto = IPPROTO_ICMP; // Протокол верхнего уровня iph.crc=0; // CRC заголовка iph.src_addr=inet_addr("192.168.1.100"); // IP- адрес отправителя iph.dst_addr=inet_addr("192.168.1.107"); // IP- адрес получателя
SOCKET s= socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if(s == INVALID_SOCKET) { cout<<"Error create socket"; } else cout<<"Create socket succesfull";
//отправляем ICMP пакет //for (int y=0;y<N;y++) {будет отправка пакетов, ниже приведена единичная отправка} rs_send_icmp (s, iph, icmph, NULL, 0); system("PAUSE"); return EXIT_SUCCESS; }
|
Также кто может подскажите как быть с кодом для сервера? Какие функции в нем именно должны быть: recfrom -для примера или другие какие (чтение чтобы пакета прошло) Очень нужна ваша помощь! Ошибка - в скрине видна. Это сообщение отредактировал(а) tymrfik - 17.4.2014, 16:16
Присоединённый файл ( Кол-во скачиваний: 14 )
скрин.jpg 93,61 Kb
|