Недавно захотелось мне сделать свой мини хакерский девайс, который будет либо запускать ddos-атаку на bluetooth, либо флудить(fllod). В наличии есть плата на esp32 (ESP32-WROM-32U). Скажу сразу, что по техническим причинам ни флуд, ни ддос невозможен на данном микропроцессоре
во первых:
Статья 13.4 КоАП РФ: «Нарушение требований технических регламентов в области использования радиочастотного спектра» — штраф до 5000 руб.
Статья 274 УК РФ: «Нарушение правил эксплуатации средств хранения, обработки или передачи компьютерной информации» — до 2 лет лишения свободы.
То, что мы будем делать это образовательная демонстрация интенсивной рекламы для понимания работы BLE. Она безопасна, легальна и соответствует спецификации.
Для начала опишем, почему это невозможно 1) Контроллер BLE ограничивает подключения (макс. 9 одновременных) 2) Требует подключения, клиент должен согласиться 3) Реклама строго регламентирована спецификацией (макс. 31 байт, интервал ≥ 20 мс) 4) Изменение адреса требует перезагрузки контроллера (~100 мс) Аппаратный контроллер BLE в ESP32 физически не позволяет создавать настоящий флуд. Это защита на уровне чипа (разработано консорциумом Bluetooth SIG). Тут я не буду описывать подробности отличия классического bluetooth и ble, потому что для данного устройства это неважно, всё равно работать не будет :) Теперь приведу код, который написан в среде ESP IDF:
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_bt.h"
#include "esp_bt_main.h"
#include "esp_gap_ble_api.h"
#include "nvs_flash.h"
static const char *TAG = "FLOOD_SIGNAL";
#define ADVERTISING_INTERVAL_MS 50 // Интервал смены рекламы (мс)
static uint8_t adv_index = 0;
static const char *device_names[] = {
"FSA", // Короткие имена для основной рекламы (макс. 6 символов)
"FSB",
"FSC",
"FSD"
};
// 16-битный UUID (экономит 14 байт по сравнению с 128-битным!)
#define SERVICE_UUID_16 0x00FF
// Производительские данные (макс. 8 байт для основной рекламы)
static uint8_t manufacturer_data_short[8] = {0x12, 0x34, 'F', 'L', 'O', 'O', 'D', 0x01};
static esp_ble_adv_params_t adv_params = {
.adv_int_min = 0x20, // ~30 мс
.adv_int_max = 0x20,
.adv_type = ADV_TYPE_IND,
.own_addr_type = BLE_ADDR_TYPE_PUBLIC,
.channel_map = ADV_CHNL_ALL,
.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};
static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) {
switch (event) {
case ESP_GAP_BLE_ADV_START_COMPLETE_EVT:
if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS) {
ESP_LOGE(TAG, "Advertising start failed");
}
break;
default:
break;
}
}
static void advertising_task(void *pvParameters) {
while (1) {
// 1. Устанавливаем короткое имя (передаём как const char*, БЕЗ приведения к uint8_t!)
esp_ble_gap_set_device_name(device_names[adv_index]);
adv_index = (adv_index + 1) % (sizeof(device_names) / sizeof(device_names[0]));
// 2. Создаём переменную для 16-битного UUID (нельзя брать адрес от макроса!)
uint16_t service_uuid = SERVICE_UUID_16;
// 3. Формируем ОСНОВНУЮ рекламу (укладываемся в 31 байт!)
esp_ble_adv_data_t adv_data = {
.set_scan_rsp = false,
.include_name = true, // Короткое имя (3 символа)
.include_txpower = false, // Отключаем для экономии места
.min_interval = 0x20,
.max_interval = 0x40,
.appearance = 0x00,
.manufacturer_len = sizeof(manufacturer_data_short),
.p_manufacturer_data = manufacturer_data_short,
.service_uuid_len = sizeof(uint16_t), // 16-битный UUID
.p_service_uuid = (uint8_t *)&service_uuid, // Адрес переменной, а не макроса!
.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
};
// 4. Формируем SCAN RESPONSE (дополнительные 31 байт для длинных данных)
uint8_t manufacturer_data_full[] = "FloodSignal";
esp_ble_adv_data_t scan_rsp_data = {
.set_scan_rsp = true,
.include_name = true, // Полное имя будет здесь
.include_txpower = true,
.min_interval = 0x20,
.max_interval = 0x40,
.appearance = 0x00,
.manufacturer_len = sizeof(manufacturer_data_full) - 1,
.p_manufacturer_data = manufacturer_data_full,
.service_uuid_len = 0,
.p_service_uuid = NULL,
.flag = 0,
};
// 5. Перезапускаем рекламу
esp_ble_gap_stop_advertising();
vTaskDelay(2 / portTICK_PERIOD_MS);
esp_ble_gap_config_adv_data(&adv_data);
vTaskDelay(2 / portTICK_PERIOD_MS);
esp_ble_gap_config_adv_data(&scan_rsp_data);
vTaskDelay(2 / portTICK_PERIOD_MS);
esp_ble_gap_start_advertising(&adv_params);
vTaskDelay(2 / portTICK_PERIOD_MS);
// 6. Ждём до следующей итерации
vTaskDelay(ADVERTISING_INTERVAL_MS / portTICK_PERIOD_MS);
}
}
void app_main(void) {
// 1. Инициализация NVS
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
// 2. Инициализация Bluetooth
ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_bt_controller_init(&bt_cfg));
ESP_ERROR_CHECK(esp_bt_controller_enable(ESP_BT_MODE_BLE));
ESP_ERROR_CHECK(esp_bluedroid_init());
ESP_ERROR_CHECK(esp_bluedroid_enable());
// 3. Регистрация обработчика
ESP_ERROR_CHECK(esp_ble_gap_register_callback(gap_event_handler));
// 4. Запуск задачи
xTaskCreate(advertising_task, "adv_task", 4096, NULL, 5, NULL);
ESP_LOGI(TAG, "FLOOD_SIGNAL demo started (rotation every %d ms)", ADVERTISING_INTERVAL_MS);
ESP_LOGW(TAG, "WARNING: Rapid advertising changes increase power consumption 10-20x.");
ESP_LOGW(TAG, "Use ONLY in isolated lab environments with explicit permission.");
ESP_LOGW(TAG, "Unauthorized use may violate local laws and BLE specifications.");
}
main/CMakeLists.txt
idf_component_register(SRCS "main.c"
REQUIRES bt nvs_flash)
CMakeLists.txt(коревой)
cmake_minimum_required(VERSION 3.16)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(floodble)
Компилируем и запускаем
#включить bluetooth и ble (в новых версиях 5.5.2 они включаются вместе)
idf.py menuconfig
# выбрать проект для проца
idf.py set-target esp32
# Очистить предыдущие ошибочные сборки
idf.py fullclean
# Собрать
idf.py build
# Прошить (замените порт на ваш)
idf.py -p COM3 flash monitor
В этом годе, мы создаем короткие имена FSA, FSB,FSC,FSD
В nRF Connect(это прога для Android): В списке устройств быстро меняются имена: FSA -> FSB -> FSC -> FSD При подключении к любому из них отобразится полное имя FloodSignal Этим действием, устройства вблизи нашей esp будут разряжаться чуть быстрее
Комментарии (0)
Оставить комментарий
Пока нет комментариев. Будьте первым!