✍️ Статья Учим BadUSB работать с разными раскладками клавиатуры

The 146X Project Dublikat Web Studio Avram Lincoln AL Service Navigator Knyaz

BlackPope

Команда форума
Модератор DeepWeb ✔️
PR-Group DeepWeb 🔷
Регистрация
27.04.2020
Сообщения
230
Всем доброго времени суток, о BadUsb, Usb Rubber Ducky и о том, как самому сделать аналог данного устройства написано уже много статей.

В этой же статье мы рассмотрим решение проблемы BadUsb при работе с разными раскладками клавиатуры.

О чем речь

Если при выполнении скрипта загруженного на наш BadUsb в операционной системе выставлена русская раскладка, возникает проблема, все команды вводятся в русской раскладке и наш скрипт становится бесполезным.

TuxdwwfY3eg.jpg


Ищем решение этой проблемы

Недолгий поиск в гугле, наводит нас на одно решение, использовать Alt-коды. Alt-коды в Windows иногда используется для ввода символов, которые отсутствуют на клавиатуре.

Например, зажимаем ALT и удерживая набираем цифры на цифровом блоке Numpad 1 и 3, затем отпускаем ALT и получается вот такой символ ноты ♪ и т.д.

Вот неполная таблица Alt-кодов, полную таблицу можно посмотреть по ссылке: Полная таблица Alt-кодов

spNoW8batw4.jpg


Точно также с помощью alt-кодов мы можем эмулировать нажатия клавиш английского, русского алфавита и всех необходимых символов независимо от текущей раскладки клавиатуры, осталось только модифицировать скетч под наши нужны. Дорабатывать скетч мы будем как для голой ардуинки, так и для Wifi Ducky.


Но сначала немного теории, поговорим о том как наша ардуинка эмулирует нажатия клавиш. В большинстве случаев делает она это с помощью базовой библиотеки Keyboard.h, которая по умолчанию уже встроена в Arduino IDE и подключается в самом начале скетча:

1| #include <Keyboard.h>

Изучив документацию к библиотеке Keyboard.h выясняем, что она использует ASCII коды для "печатаемых" символов клавиатуры.

RwCJh7KDyAo.jpg

Нам же нужно найти какие коды соответствуют клавишам цифрового блока., чтобы эмулировать нажатия с помощью Alt-кодов.

Итак, первые 128 значений (от 0 до 127) как мы выяснили, "печатаемые", обрабатываются как ASCII код и переводятся в коды клавиш. Следующие 8 (от 128 до 135) - это клавиши модификаторы (Ctrl, Shift, Alt и и т.д.).

Полный список клавиш модификаторов можно посмотреть в документации к библиотеке Keyboard.h Keyboard Modifiers - Arduino Reference.

Далее из всего что превышает 135 (но не больше 256, поскольку один байт может содержать значения до 256) вычитается 136 и используется как код ключа для клавиатуры согласно USB HID спецификациям.


Здесь по ссылке вы можете найти списки кодов USB HID для различных устройств ввода-вывода USB HID Usage Tables (pdf документ). Список кодов конкретно для клавиатуры, начиная со стр. 53 и находим в таблице клавиши цифрового блока и их Usege ID (Dec) в десятичной системе счисления.

6xxQSw62Unc.jpg

Это и есть то что нам нужно, и как мы помним все значения ниже 128 обрабатываются как ASCII коды, поэтому не забываем прибавлять 136 к Usage ID (Dec).

NumLock 219 (83 + 136)

KeyPad_1 225 (89 + 136)

KeyPad_2 226 (90 + 136)

KeyPad_3 227 (91 + 136)

KeyPad_4 228 (92 + 136)

KeyPad_5 229 (93 + 136)

KeyPad_6 230 (94 + 136)

KeyPad_7 231 (95 + 136)

KeyPad_8 232 (96 + 136)

KeyPad_9 233 (97 + 136)

KeyPad_0 234 (97 + 136)


Получившиеся значения от 225 до 234 и 219 (для NumLock) мы и будем использовать для написания скетча для ардуино.


В библиотеке Keyboard.h есть несколько основных функций которые эмулируют нажатия клавиш:

Keyboard.press(parameter) #- нажатие и удержание клавиши
Keyboard.release(parameter) #- завершает нажатие клавиши (отпускает клавишу)
Keyboard.write(parameter) #- нажатие и сразу отпускание клавиши
Keyboard.releaseAll() #- отпускает все нажатые Keyboard.press() клавиши.


В качестве параметра (parameter, кроме Keyboard.releaseAll() - у нее нет параметров) функции принимают коды клавиш о которых мы говорили выше (ASCII, Клавиши модификаторы и (USB HID Usage ID + 136)), от 0 до 256.


В итоге код который будет эмулировать нажатие клавиш клавиатуры с помощью Alt-кодов будет выглядеть следующим образом

Например для английской буквы n или ALT + 110 (смотрим таблицу Alt-кодов):

Keyboard.press(KEY_LEFT_ALT); // зажимаем ALT
Keyboard.write(225); // N1
Keyboard.write(225); // N1
Keyboard.write(234); // N0
Keyboard.releaseAll(); // отпускаем ALT


Да, многовато кода, 5 строк чтобы написать всего одну букву!

Получится довольно длинный скетч, но он повторяющийся и его можно немного оптимизировать. Такой код уже напечатает полное слово "notepad".

void altRun2(int a,int b)
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.write(a);
Keyboard.write(b);
Keyboard.releaseAll();
}

void altRun3(int a,int b, int c)
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.write(a);
Keyboard.write(b);
Keyboard.write(c);
Keyboard.releaseAll();
}
void setup()
{
Keyboard.begin();
altRun3(225,225,234);
altRun3(225,225,225);
altRun3(225,225,230);
altRun3(225,234,225);
altRun3(225,225,226);
altRun2(233,231);
altRun3(225,234,234);
}


Конечно мы не будем все это писать вручную, в интернете можно найти много реализаций DuckyScript to Arduino code конвертера с открытым исходным кодом, я модифицировал одну из версий такого конвертера и добавил поддержку Alt-кодов. За основу взял ducky2arduino_stable от roothaxor.


Просто используйте стандартный синтаксис DuckyScript, а когда вам нужно сгенерировать скетч который будет эмулировать нажатия клавиш используя Alt-коды, поставьте галочку Activate Alt-codes support и замените STRING на ALTCODE

Модифицированный DuckyScript to Arduino Сode конвертер

eMcU5eCxvn8.jpg

Эти тестовые примеры запускают notepad и печатают Hello World!!!

С использованием STRING:

DELAY 3000
GUI r
DELAY 500
STRING notepad
DELAY 500
ENTER
DELAY 750
STRING Hello World!!!
ENTER


С использованием ALTCODE:

DELAY 3000
GUI r
DELAY 500
ALTCODE notepad
DELAY 500
ENTER
DELAY 750
ALTCODE Hello World!!!
ENTER


На выходе получаем вот такой скетч который эмулирует нажатия клавиш с помощью Alt-кодов, запускает notepad и пишет в нем Hello World!!!

И теперь он не зависит от раскладки клавиатуры, то чего мы и хотели!

#include <Keyboard.h>

void altRun2(int a,int b)
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.write(a);
Keyboard.write(b);
Keyboard.releaseAll();
}

void altRun3(int a,int b, int c)
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.write(a);
Keyboard.write(b);
Keyboard.write(c);
Keyboard.releaseAll();
}

// Init function
void run()
{
// Begining the stream
Keyboard.begin();

// Waiting 500ms for init
delay(500);

delay(3000);

Keyboard.press(KEY_LEFT_GUI);
Keyboard.press(114);
Keyboard.releaseAll();

delay(500);

altRun3(225,225,234);
altRun3(225,225,225);
altRun3(225,225,230);
altRun3(225,234,225);
altRun3(225,225,226);
altRun2(233,231);
altRun3(225,234,234);

delay(500);

typeKey(KEY_RETURN);

delay(750);

altRun2(231,226);
altRun3(225,234,225);
altRun3(225,234,232);
altRun3(225,234,232);
altRun3(225,225,225);
altRun2(227,226);
altRun2(232,231);
altRun3(225,225,225);
altRun3(225,225,228);
altRun3(225,234,232);
altRun3(225,234,234);
altRun2(227,227);
altRun2(227,227);
altRun2(227,227);

typeKey(KEY_RETURN);
}

void setup()
{
run();
typeKey(219);
run();
}

void typeKey(int key)
{
Keyboard.press(key);
delay(50);
Keyboard.release(key);
}

// Unused
void loop() {}


Обратите внимание на вот эти строки.

Здесь мы повторно запускаем код после нажатия Numlock typeKey(219) , на случай если цифровой блок был выключен:

void setup()
{
run();
typeKey(219);
run();
}


Если вам не нужен повторный запуск просто оставьте один вызов функции

run()

void setup()
{
run();
}


Теперь займемся модификацией прошивки для WiFi Ducky. Для начала изучим прошивку для ардуино из статьи Делаем USB ducky и Wifi Ducky своими руками

https://raw.githubusercontent.com/s...aster/arduino_wifi_duck/arduino_wifi_duck.ino

Обратим внимание на блок команд отвечающих за обработку клавиш модификаторов в функции void Press()

Все что нам остается это дописать свой код, добавляющий обработку клавиш цифрового блока:

else if (b.equals("NUMLOCK"))Keyboard.press(219);
else if (b.equals("N9")) {Keyboard.press(233); Keyboard.release(233);}
else if (b.equals("N8")) {Keyboard.press(232); Keyboard.release(232);}
else if (b.equals("N7")) {Keyboard.press(231); Keyboard.release(231);}
else if (b.equals("N6")) {Keyboard.press(230); Keyboard.release(230);}
else if (b.equals("N5")) {Keyboard.press(229); Keyboard.release(229);}
else if (b.equals("N4")) {Keyboard.press(228); Keyboard.release(228);}
else if (b.equals("N3")) {Keyboard.press(227); Keyboard.release(227);}
else if (b.equals("N2")) {Keyboard.press(226); Keyboard.release(226);}
else if (b.equals("N1")) {Keyboard.press(225); Keyboard.release(225);}
else if (b.equals("N0")) {Keyboard.press(234); Keyboard.release(234);}


В итоге получаем такую прошивку:

https://elrock.gitlab.io/arduino_wifi_duck/arduino_wifi_duck.ino

Ей мы и будем прошивать ардуинку для WiFi Ducky.


Синтаксис DuckyScript для такой версии WiFi Ducky также будет немного отличаться, вместо STRING нам нужно вводить символы как если бы мы нажимали последовательность Alt-кодов (см. таблицу Alt-кодов).

Например слово notepad теперь будет выглядеть так:

ALT N1 N1 N0
ALT N1 N1 N1
ALT N1 N1 N6
ALT N1 N0 N1
ALT N1 N1 N2
ALT N9 N7
ALT N1 N0 N0


И чтобы облегчить задачу, я написал простенький конвертер.

Конвертер Alt-кодов

Вам всего лишь нужно подставить стоку которая шла после STRING в конвертер и на выходе получить последовательность Alt-кодов. Эту последовательность мы используем для написания полезной нагрузки для нашей модифицированной WiFi Ducky.

Не забываем про NUMLOCK, на случай если клавиши цифрового блока отключены.

Тестовый скрипт который открывает notepad и пишет в нем Hello World!!! будем выглядеть следующим образом:

DELAY 1000

GUI r // Вызваем «Выполнить»

DELAY 500

ALT N1 N1 N0

ALT N1 N1 N1

ALT N1 N1 N6

ALT N1 N0 N1

ALT N1 N1 N2

ALT N9 N7

ALT N1 N0 N0 // Вводим «notepad»

DELAY 500

ENTER

DELAY 750

ALT N7 N2

ALT N1 N0 N1

ALT N1 N0 N8

ALT N1 N0 N8

ALT N1 N1 N1

ALT N3 N2

ALT N8 N7

ALT N1 N1 N1

ALT N1 N1 N4

ALT N1 N0 N8

ALT N1 N0 N0

ALT N3 N3

ALT N3 N3

ALT N3 N3 //
Пишем в блокноте «Hello World!»

ENTER

NUMLOCK // Если NumLock
был выключен, то мы его включаем этой командой и снова вводим код

DELAY 1000

GUI r

DELAY 500

ALT N1 N1 N0

ALT N1 N1 N1

ALT N1 N1 N6

ALT N1 N0 N1

ALT N1 N1 N2

ALT N9 N7

ALT N1 N0 N0

DELAY 500

ENTER

DELAY 750

ALT N7 N2

ALT N1 N0 N1

ALT N1 N0 N8

ALT N1 N0 N8

ALT N1 N1 N1

ALT N3 N2

ALT N8 N7

ALT N1 N1 N1

ALT N1 N1 N4

ALT N1 N0 N8

ALT N1 N0 N0

ALT N3 N3

ALT N3 N3

ALT N3 N3

ENTER


Краткие выводы

Что мы в итоге получили? Не самый производительный вариант, в плане того что такие скрипты будут дольше выполнятся, оно и понятно, мы эмулируем нажатие трех - четырех клавиш вместо одной. Приходиться использовать дублирование кода на случай если клавиши цифрового блока отключены NumLock'ом. В сценариях использования BadUsb когда у нас есть физический доступ к компьютеру, иногда проще поменять раскладку.

Если у вас есть предложения по улучшению или вы знаете еще способы обойти проблему раскладок для BadUsd, делитесь идеями в обсуждении.
 

📌 Золотая реклама

AnonPaste

Верх