Ты вообще о чем говорить собрался?
Для начала... BadUSB — один из инструментов в арсенале хацкера. Можно эмулировать любую периферию, чаще всего подделывают клавиатуру. Здесь я покажу, как решить одну из главных связанных с этим проблем — зависимость от текущей раскладки. Если в операционной системе выставлена русская раскладка, а твой скрипт скармливает ей нажатия на клавиши в английской, то из этого, конечно же, ничего не выйдет. Как обойти эту проблему? Я сам столкнулся с ней недавно, материалов в интернете вообще нет. Только одна статья на Xakep'e, к сожалению, подписки у меня нет, зато там мне подали идею, как это реализовать, интереснее все сделать самому ^_^
Сегодня я лишь решил с вами поделиться решением этой проблемы, все будет изложено максимально кратко.
Погнали
Так вот, для обхода этой проблемы можно использовать Alt-коды. Например, зажимаешь Alt, удерживая, набираешь на цифровом блоке '3', и получается сердечко. Здорово? Нам это тоже очень поможет, поскольку таким образом можно вводить и обычные символы, причем независимо от текущей раскладки. Главная проблема заключалась в эмулировании клавиш на кейпаде, спустя пару часов поиска я кое-что нашел. Стандартная библиотека для Arduino (Keyboard) воспринимает печатные символы до 128 (0x7F, код), поэтому она их будет искать в таблице ASCII кодов. Чтобы это обойти, мы должны добавить к коду 136. Вот что получится в итоге:
C-подобный:
'\334' => Keypad /
'\335' => Keypad *
'\336' => Keypad -
'\337' => Keypad +
'\340' => Keypad ENTER
'\341' => Keypad 1 and End
'\342' => Keypad 2 and Down Arrow
'\343' => Keypad 3 and PageDn
'\344' => Keypad 4 and Left Arrow
'\345' => Keypad 5
'\346' => Keypad 6 and Right Arrow
'\347' => Keypad 7 and Home
'\350' => Keypad 8 and Up Arrow
'\351' => Keypad 9 and PageUp
'\352' => Keypad 0 and Insert
'\353' => Keypad . and Delete
А вот готовые функции для нажатия клавиш/набора текста:
C-подобный:
void numpad(int KeyCode)
{
switch (KeyCode)
{
case 0:
Keyboard.press('\352');
Keyboard.release('\352');
break;
case 1:
Keyboard.press('\341');
Keyboard.release('\341');
break;
case 2:
Keyboard.press('\342');
Keyboard.release('\342');
break;
case 3:
Keyboard.press('\343');
Keyboard.release('\343');
break;
case 4:
Keyboard.press('\344');
Keyboard.release('\344');
break;
case 5:
Keyboard.press('\345');
Keyboard.release('\345');
break;
case 6:
Keyboard.press('\346');
Keyboard.release('\346');
break;
case 7:
Keyboard.press('\347');
Keyboard.release('\347');
break;
case 8:
Keyboard.press('\350');
Keyboard.release('\350');
break;
case 9:
Keyboard.press('\351');
Keyboard.release('\351');
break;
}
}
void write_str(String Input)
{
for(int j = 0; j < Input.length(); j++)
{
/*У пробела нет ALT-кода, его значение не зависит от раскладки*/
if (Input[j] == ' ')
{
Keyboard.print(' ');
}
else
{
Keyboard.press(KEY_LEFT_ALT);
String temp = String(int(Input[j]));
for(int i = 0; i < temp.length(); ++i)
{
numpad(String(temp[i]).toInt());
}
/*Поиграйтесь с этим значением*/
delay(50);
}
Keyboard.release(KEY_LEFT_ALT);
}
}
Заключение
Вот и все, надеюсь, что я вам сэкономил пару часов. Вопросы по поводу BadUSB попросил бы задавать в этом топике, надеюсь на вашу адекватность ^_^
Всем удачи!
Вот и все, надеюсь, что я вам сэкономил пару часов. Вопросы по поводу BadUSB попросил бы задавать в этом топике, надеюсь на вашу адекватность ^_^
Всем удачи!
Последнее редактирование: