delete check_sum function and moved its logic inside tcp_syn #13
|
@ -423,42 +423,7 @@ int my_dns()
|
||||||
printf("end my_dns"); // debug
|
printf("end my_dns"); // debug
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned short checksum(void *data, int len)
|
int my_tcp_syn() {
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Рассчитывает контрольную сумму для пакета (алгоритм 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()
|
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
* Отправляет TCP SYN запрос на указанный IP и порт
|
* Отправляет TCP SYN запрос на указанный IP и порт
|
||||||
* status:
|
* status:
|
||||||
|
@ -469,14 +434,13 @@ int my_tcp_syn()
|
||||||
*/
|
*/
|
||||||
printf("start my_tcp_syn"); // debug
|
printf("start my_tcp_syn"); // debug
|
||||||
|
|
||||||
|
|
||||||
// === Объявление локальных переменных ===
|
// === Объявление локальных переменных ===
|
||||||
int sock; // Основной raw-сокет для отправки пакетов
|
int sock; // Основной raw-сокет для отправки пакетов
|
||||||
int one; // Флаг для setsockopt
|
int one; // Флаг для setsockopt
|
||||||
// Структуры для адресов
|
// Структуры для адресов
|
||||||
struct sockaddr_in target_addr; // Адрес цели
|
struct sockaddr_in target_addr; // Адрес цели
|
||||||
// Параметры подключения
|
// Параметры подключения
|
||||||
uint16_t target_port = 0; // Порт цели (в сетевом порядке байт)
|
uint16_t target_port; // Порт цели (в сетевом порядке байт)
|
||||||
// Структуры заголовков
|
// Структуры заголовков
|
||||||
struct iphdr ip_header; // IP-заголовок пакета
|
struct iphdr ip_header; // IP-заголовок пакета
|
||||||
struct tcphdr tcp_header; // TCP-заголовок пакета
|
struct tcphdr tcp_header; // TCP-заголовок пакета
|
||||||
|
@ -492,6 +456,12 @@ int my_tcp_syn()
|
||||||
char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы
|
char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы
|
||||||
char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет
|
char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет
|
||||||
|
|
||||||
|
// Переменные для встроенного расчета контрольной суммы
|
||||||
|
uint16_t *checksum_ptr;
|
||||||
|
unsigned long checksum_sum;
|
||||||
|
uint8_t *checksum_byte_ptr;
|
||||||
|
int checksum_len;
|
||||||
|
|
||||||
// === Инициализация переменных ===
|
// === Инициализация переменных ===
|
||||||
Urmipie marked this conversation as resolved
|
|||||||
sock = -1;
|
sock = -1;
|
||||||
one = 1;
|
one = 1;
|
||||||
|
@ -515,7 +485,10 @@ int my_tcp_syn()
|
||||||
// 3. Настройка адреса цели
|
// 3. Настройка адреса цели
|
||||||
memset(&target_addr, 0, sizeof(target_addr));
|
memset(&target_addr, 0, sizeof(target_addr));
|
||||||
target_addr.sin_family = AF_INET;
|
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 заголовка
|
// 4. Формирование IP заголовка
|
||||||
memset(&ip_header, 0, sizeof(ip_header));
|
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, &pseudo_header, sizeof(pseudo_header));
|
||||||
memcpy(temp_buf + sizeof(pseudo_header), &tcp_header, sizeof(tcphdr));
|
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);
|
||||||
Urmipie marked this conversation as resolved
dr-wh0
commented
checksum_ptr, checksum_sum, checksum_len необходимо инициализировать сначала checksum_ptr, checksum_sum, checksum_len необходимо инициализировать сначала
Urmipie
commented
Они инициализированы на строке 459 Они инициализированы на строке 459
|
|||||||
|
|
||||||
|
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. Сборка пакета
|
// 7. Сборка пакета
|
||||||
memcpy(packet, &ip_header, sizeof(iphdr));
|
memcpy(packet, &ip_header, sizeof(iphdr));
|
||||||
|
|
Loading…
Reference in New Issue
Число объявленных и инициализированных переменных должно совпадать