Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Raw-сокеты (ICMP протокол), Ошибка с типами, Клиент-Сервер(ICMP протокол) 
V
    Опции темы
tymrfik
  Дата 17.4.2014, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2011

Репутация: нет
Всего: нет



Создать для клиента генератор пакетов (для проведения атаки 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
PM MAIL   Вверх
feodorv
Дата 18.4.2014, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(tymrfik @  17.4.2014,  17:15 Найти цитируемый пост)
но это не проходит

Вот это не проходит?
Код
result = rs_send_ip (s, iph, (unsigned char *) buffer, packet_length, 0);
Что пишет?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
tymrfik
Дата 21.4.2014, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 20.1.2011

Репутация: нет
Всего: нет



feodorv, да не проходит именно это. Ругается на 3 аргумент в функции (invalid conversion from 'char' to 'unsigned char') !!! (писал об этом) Как решить, если прямым переводом тоже не помогает устранить проблему???
PM MAIL   Вверх
feodorv
Дата 21.4.2014, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(tymrfik @  21.4.2014,  16:35 Найти цитируемый пост)
(invalid conversion from 'char' to 'unsigned char') !!! (писал об этом)

Там не так было написано. 

Цитата(tymrfik @  21.4.2014,  16:35 Найти цитируемый пост)
если прямым переводом тоже не помогает устранить проблему??? 

Что-то меня берут сомнения, что "прямым переводом" ничего не получается. В любом случае, тип char * для буфера совсем не к чему, определите его как unsigned char *.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.