Rickroll с помощью ESP32. Имитация Bluetooth-клавиатуры

Однажды я узнал про существование микроконтроллеров ESP32, обладающих встроенными Bluetooth и Wi-Fi модулями. Тогда я начал всем рассказывать, какая крутая железка, пока мне ее наконец-то не подарили.

На момент создания материала, такой микроконтроллер можно купить в РФ с доставкой менее, чем за 1000 рублей. Ну не чудо ли?

Получив железку в руки, я начал думать, зачем же она мне. В первую очередь пришла мысль реализовать глушилку Bluetooth-колонки, но об этом как-нибудь позже.

Тут я вспомнил времена учебы в институте, где мы имитировали HID-устройство с помощью микроконтроллеров. Поэтому, задался вопросом, можно ли то же самое сделать для Bluetooth-клавиатуры. Оказывается, таких проектов довольно много, и я решил один из них повторить.

На GitHub существует прекрасная библиотека, позволяющая реализовать мою идею.

Итак, начнем.

Настройка окружения

Для написания кода можно использовать буквально что угодно, однако довольно каноничной и удобной средой разработки является Arduino IDE.

Скачиваем IDE и запускаем.

Здесь нам необходимо скачать пакет для поддержки плат ESP32:

Переходим в менеджер плат — нажимаем Ctrl+Shift+B

В открывшемся окне вводим ESP32

e321977a52d571593f610e5b2e8fbae2.png

Здесь нам необходимо скачать esp32 от Espressif. Замечу, что последняя версия не подходит для используемой библиотеки, и нам нужна версия 2.0.1 — на более поздних не компилируется.

Затем, создаем новый скетч нажатием Ctrl+N

Скачиваем библиотеку и подключаем ее через контекстное меню Скетч→Подключить библиотеку→добавить .ZIP библиотеку

IDE любезно говорит, что библиотека установлена:

070ee6ee62293248e1b8eabca45b917d.png

Затем, подключаем микроконтроллер к ПК и идем в менеджер устройств — нажимаем WIN+R и вызываем devmgmt.msc

Переходим в Порты (COM и LPT), где видим наше устройство

caadf0b813d83e911738c3a879a2eb1a.png

Если у вас устройство не определяется, необходимо установить драйвер (гуглится по запросу »{Модель чипа} driver»)

Затем, возвращаемся в IDE и конфигурируем настройки платы:

В верхней части рабочего пространства открываем выпадающий список и выбираем пункт «Выберите другую плату и порт»

51c750f0ab3f3090f7270d9eaaeac98f.png

И настраиваем соответствие названия платы и COM-порта

a1fe9882e5ba850a74c0aafcb17df695.png

На этом настройка окружения заканчивается.

Переходим к программированию

В качестве полезной нагрузки будем открывать RickRoll на Youtube.

Берем пример из библиотеки и реализуем следующие функции:

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  bleKeyboard.begin();

}
void loop() {
  if(bleKeyboard.isConnected()) {
  delay(1000);
  }

  Serial.println("Waiting 5 seconds...");
  delay(5000);
}

Далее реализуем открытие web-страницы.

Например, это можно сделать путем вызова powershell с параметрами »-c Start-Process http://example.com»

Напишем простой скрипт, который открывает страницу с видео.

Для этого будем вызывать WIN+R и вводить команду на исполнение.

В библиотеке реализованы следующие функции для ввода текста:

press, release, write, releaseAll, print, поэтому наша функция loop будет выглядеть следующим образом:

void loop() {
  if(bleKeyboard.isConnected()) {
  bleKeyboard.press(KEY_LEFT_GUI);
  bleKeyboard.print("r");
  delay(100);
  bleKeyboard.releaseAll();
  delay(100);
  bleKeyboard.print("powershell.exe -с \"Start-Process https://www. youtube.com/watc h?v=dQw4w9WgXcQ\"");
  delay(100);
  bleKeyboard.write(KEY_RETURN);
  }

  Serial.println("Waiting 5 seconds...");
  delay(5000);
}

Однако, по неизвестным мне причинам, ввод длинных строк периодически вызывал залипание клавиши, и вводимая строка превращалась во что-то вроде «powershelllllllllllllll»

Поэтому, путем ручного подбора длины команды, была выработана оптимальная длина, и итоговый скрипт выглядит следующим образом:

#include 

BleKeyboard bleKeyboard;
void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  bleKeyboard.begin();

}

void loop() {
  if(bleKeyboard.isConnected()) {
  bleKeyboard.press(KEY_LEFT_GUI);
  bleKeyboard.print("r");
  delay(100);
  bleKeyboard.releaseAll();
  delay(100);
  bleKeyboard.print("powershell.exe");
  delay(100);
  bleKeyboard.print(" -c  ");
  delay(100);
  bleKeyboard.print("\"Start-Process");
  delay(100);
  bleKeyboard.print(" https://www.");
  delay(100);
  bleKeyboard.print("youtube.com/watc");
  delay(100);
  bleKeyboard.print("h?v=dQw4w9WgXcQ\"");
  delay(100);
  bleKeyboard.write(KEY_RETURN);
  delay(1000);
  }

  Serial.println("Waiting 5 seconds...");
  delay(5000);
}

Результат

Загружаем скрипт на микроконтроллер путем нажатия на стрелку вверху рабочего пространства

4acecc867ce59ae04cb38829a24395de.png

Немного ждем, пока скетч скомпилируется

50841eed64c9fdbde811229860afadfa.png

И в итоге получаем сообщение об успешной записи кода на плату

ea73daa7852a425db2e73240c9091d76.png

Теперь наш микроконтроллер выступает в роли Bluetooth-клавиатуры

Подключаемся к устройству  через Bluetooth

095eb1e23c78d320ee9e7358c507d2ab.png

И видим, что все работает

Скрытый текст

58e98b8e161a0a867fcf1f785ec6df68.gif

Наверняка, можно использовать имитацию клавиатуры как-нибудь более весело, но как пример вполне сойдет.

Пишите в комментариях, что хотели бы увидеть в реализации на этой платформе. Мне очень интересно разобраться поглубже.

Подписывайтесь на наш telegram-канал AUTHORITY

© Habrahabr.ru