Определение введённого текста по звуку нажатых кнопок клавиатуры

Если начать прислушиваться к звукам клавиатуры, когда на ней набирается текст, то даже «невооружённым ухом» можно понять, что при нажатии различных клавиш звуки немного отличаются. Особенно просто определять нажатие пробела и кнопки ENTER.

Отсюда возникает вопрос — можно ли узнать, какие кнопки нажаты подслушивая клавиатуру? Да, можно!

И для этого уже подготовлен рабочий концепт из набора программ, называется kbd-audio. Это коллекция инструментов командной строки и инструментов с графическим интерфейсом для захвата и анализа аудио данных. Самые интересные инструменты предназначены для анализа ввода клавиатуры путём анализа захвата данных от микрофона.

Keytap

Самый интересный инструмент называется keytap, он может угадывать нажатые кнопки клавиатуры анализируя захваченный звук от микрофона компьютера.

Демонстрация показана в следующем видео:

Для начала нужно выполнить тренинг программы — нажать каждую кнопку на клавиатуре минимум 3 раза, чтобы программа запомнила, какая кнопка имеет какой звук. Не печатайте очень быстро, лучше всего даже вводить символы одним пальцем.

Keytap2

Ещё один интересный инструмент из этого же набора называется keytap2. Он умеет восстанавливать текст из аудио. Его особенность в том, что ему не нужны тренировочные данные — вместо них он использует статическую информацию о частотности букв и n-grams в английском языке.

То есть используется в точности такой же подход, как и при взломе текстов, зашифрованных шифром простой замены (Шифр простой замены, простой подстановочный шифр, моноалфавитный шифр — класс методов шифрования, которые сводятся к созданию по определённому алгоритму таблицы шифрования, в которой для каждой буквы открытого текста существует единственная сопоставленная ей буква шифр-текста. Само шифрование заключается в замене букв согласно таблице. Для расшифровки достаточно иметь ту же таблицу, либо знать алгоритм, по которому она генерируется.). Суть метода взлома шифра в том, что во всех текстах достаточной длины буквы встречаются с определённой стабильной частотой. К примеру, известно, что чаще всего встречается буква «а» (говорю на вскидку — не помню уже), значит звук от самой часто нажатой кнопки принадлежит клавише «а». На втором месте по частоте идёт «о» - значит второй самой часто нажимаемой кнопкой является «о» и т.д. Также используются статистические данные о том, какие буквы после каких следуют чаще всего, а в каких комбинациях никогда не встречаются. В криптоанализе это называется частотным анализом. В общем эта техника настолько эффективная, что шифрование простой заменой, а также шифрование симметричным ключом (взламывается похожим образом) вытеснено шифрованием ассиметричным ключом (к примеру тем же самым gpg), когда шифруется одним ключом, а расшифровывается другим.

Видео, демонстрирующее восстановление текста из записанного звука печати (смотрите на правый нижний прямоугольник — в нём текст становится всё более осмысленным):

В видео демонстрируется использование инструмента Keytap2. Инструмент всё ещё на стадии разработки. В видео показан процесс восстановления неизвестного текста просто из записи звука на которой слышно, как человек нажимает кнопки.

Краткое описание шагов:

  1.  Определите положения нажатий клавиш в форме волны (красные линии)
  2. Рассчитать матрицу сходства клавиш
  3. Применить combined clustering (комбинированную кластеризацию) + алгоритм атаки substitution cipher (подстановки шифра)
  4. Ищите декодированные слова или шаблоны и «связывайте» их, чтобы помочь алгоритму
  5. Вручную идентифицируйте нажатия клавиш «Пробел», так как их легко отличить от других клавиш.
  6. Повторите шаги 3 - 6

Информация о текущем наборе аудио данных:

  • Длина: ~70 секунд
  • Нажатий клавиш: ~230
  • Клавиатура: Filco mechanical
  • Записано в iMac встроенным микрофоном

CTF: можете ли вы угадать напечатанный текст?

Другие инструменты kbd-audio

Краткое описание доступных инструментов. Если статус инструмента не является «стабильным», то ожидайте проблем и неожиданных результатов.

Имя Пользовательский нтерфейс Статус
record командная строка стабильный
record-full командная строка стабильный
play командная строка стабильный
play-full командная строка стабильный
view-gui графический стабильный
view-full-gui графический стабильный
keytap командная строка стабильный
keytap-gui графический стабильный
keytap2 командная строка в разработке
keytap2-gui графический в разработке
- дополнительно -
guess_qp командная строка экспериментальный
guess_qp2 командная строка экспериментальный
key_detector командная строка экспериментальный
scale командная строка экспериментальный
subreak командная строка экспериментальный
key_average_gui графический экспериментальный

Краткое описание инструментов kbd-audio

record-full

Записывает аудио на диск в сырой бинарный файл.

./record-full output.kbd [-cN]

play-full

Воспроизводит захваченную запись.

./play-full input.kbd [-pN]

record

Записывает аудио во время печати. Полезно для сбора тренировочных данных для keytap.

./record output.kbd [-cN]

play

Воспроизводит запись, созданную инструментом record.

./play input.kbd [-pN]

keytap

Определяет нажатые кнопки в реальном времени через захваченный звук из микрофона. Использует тренировочные данные, захваченные с помощью инструмента record.

Использование:

./keytap input0.kbd [input1.kbd] [input2.kbd] ... [-c N] [-p F] [-t F]

Опции:

    -c N — выбрать устройство для захвата N
    -p F — порог угадывания: CC > F
    -t F — порог фона: ampl > F*avg_background

keytap-gui

Определяет нажатые кнопки в реальном времени анализируя звук от микрофона. Использует тренировочные данные, захваченные с помощью программы record. То есть это версия keytap с графическим интерфейсом.

./keytap-gui input0.kbd [input1.kbd] [input2.kbd] ... [-cN]

keytap2-gui (в процессе разработки)

Определяет нажатые клавиши из записанного звука. Использует статистическую информацию (частотность n-gram) о языке. Обучение программы и получение тренировочных данных не требуется. Файл ввода 'recording.kbd' должен быть сгенерирован через инструмент record-full и содержать аудио данные для анализа. Файл 'n-gram.txt' должен содержать n-gram вероятностей соответствующего языка. Пример файла sample_quadgrams.txt.

./keytap2-gui recording.kbd n-gram.txt

view-full-gui

Визуализируйте сигналы, записанные с помощью инструмента record-full. Может также воспроизводить аудиоданные.


./view-full-gui input.kbd

view-gui

Визуализируйте данные тренировки, записанные с помощью инструмента record. Может также воспроизводить аудиоданные.

./view-gui input.kbd

Как установить kbd-audio

Установка kbd-audio в Kali Linux

Установка зависимостей:

sudo apt install libsdl2-dev libfftw3-dev cmake

Клонирование исходного кода и компиляция программы:

git clone https://github.com/ggerganov/kbd-audio
cd kbd-audio
git submodule update --init
mkdir build && cd build
cmake ..
make

Программы не будут перемещены в системные папки — скомпилированные файлы окажутся в текущей рабочей директории:

Установка kbd-audio в Arch Linux/BlackArch

В Arch Linux требуемые зависимости устанавливаются следующей командой:

sudo pacman -S sdl2 fftw cmake

Клонирование исходного кода:

git clone https://github.com/ggerganov/kbd-audio
cd kbd-audio
git submodule update --init
mkdir build && cd build

Откройте файл ../CmakeLists.txt:

gedit ../CMakeLists.txt

И в самый верх добавьте в него строки:

if("${SDL2_LIBRARIES}" STREQUAL "")
    message(WARNING "SDL2_LIBRARIES wasn't set, manually setting to SDL2::SDL2")
    set(SDL2_LIBRARIES "SDL2::SDL2")
endif()

сохраните и закройте файл.

Продолжите выполнение следующих команд:

cmake ..
make

Как выбрать микрофон для прослушивания

В программах, которые захватывают аудиоданные, можно указать микрофон, который они должны использовать. Это полезно, если у вас несколько микрофонов. Если опция для выбора устройства прослушивания не указана, то будет выбрано первое устройство.

Если у вас только один микрофон, то вам необязательно следовать советам из этого раздела.

Чтобы просмотреть список устройств аудио ввода (микрофонов) установите пакет alsa-utils.

В Kali Linux, Debian и производных:

sudo apt install alsa-utils

В Arch Linux, BlackArch и их производных:

sudo pacman -S alsa-utils

Чтобы посмотреть список устройств введите:

arecord -l

Пример вывода, когда только один микрофон:

**** List of CAPTURE Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC295 Analog [ALC295 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

Чтобы указать устройство используйте опцию -c, например, для выбора устройства с номером 0: -c0.

Тем не менее опцию -c можно пропустить.

Как работает перехват нажатий клавиатуры по звуку

Суть в том, что с помощью программы record вначале нужно собрать данные о том, какие звуки имеют клавиши на клавиатуре. Вся информация записывается в файл специального формата — там и звуки, и нажатые кнопки.

После этого нужно запустить программу keytap указав один или сразу несколько файлов полученных с помощью record. Программа keytap выполнит расчёты (как бы найдёт «среднее» звучание каждой отдельной кнопки из всех нажатий) и сразу начнёт прослушивать микрофон.

Итак, перейдём к запуску record.

Тренировка kbd-audio

Начать нужно с записи файла с помощью программы record. Выберите имя файла (у меня это output.kbd) и запустите:

./record output.kbd

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

Когда всё готово, просто нажмите CTRL+c.

Если вы хотите использовать другой микрофон, то укажите опцию -c, например:

./record output.kbd -c2

Как запустить keytap

У программы keytap только одна обязательная опция — записанный с помощью программы record файл. Также можно указать опцию -c и номер микрофона.

./keytap output.kbd

Программа выполнит необходимые расчёты:

В конце появятся слова:

[+] Ready to predict. Keep pressing keys and the program will guess which key was pressed
    based on the captured audio from the microphone.
[+] Predicting

Они означают — готовы к угадыванию. Нажимайте кнопки и программа будет угадывать, какую кнопку вы нажали, при этом будет использовать только звук от микрофона.

Нажимайте кнопки на клавиатуре и программа напротив будет писать строку, которая начинается со слова Prediction: и символ, который как она думает, что вы нажали.

Если ничего не происходит, то есть если вы видите только вводимые вами символы, значит нужно отрегулировать значение Порога угадывания (опция -p) и значение Фонового порога (опция -t).

Поскольку мы не знаем, какие именно цифры нужно указывать, то лучше запустить программу с графическим интерфейсом:

./keytap-gui output.kbd

После запуска начните нажимать кнопки на клавиатуре. Если ничего не происходит, то передвигая ползунки вы сможете подобрать нужные уровни порога. Верхний ползунок (Threshold CC) — порог распознавания, второй ползунок (Threshold background) — порог фона. Если установить слишком низкие значения, то фоновый шум (например, от системы охлаждения), будет обрабатываться программой и она будет выводить неправильно угаданные буквы.

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

./keytap output.kbd -p0.6 -t0.3

Если у вас всё получается, то на этом этапе можно ОТКЛЮЧИТЬ КЛАВИАТУРУ (выдернуть шнур) и нажимать кнопки. Даже если у вас обычная (не радио) клавиатура, программа keytap всё равно будет показывать вводимые символы (нажимаемые кнопки). То есть клавиатура как техническое устройство может быть обесточена — но исходя из звуков, программа будет знать, какие кнопки вы нажали!

Автор программы пишет, что именно с механической (отдельной от ноутбука) клавиатурой и него стало получаться нормально. С ноутбучной клавиатурой могут быть трудности в распознавании.

Заключение

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

Решение проблем

фатальная ошибка: SDL.h: Нет такого файла или каталога

Компиляция на Debian проходит нормально, а в Arch Linux появляется ошибка:

/home/mial/bin/kbd-audio/audio_logger.cpp:8:10: фатальная ошибка: SDL.h: Нет такого файла или каталога
    8 | #include <SDL.h>
      |          ^~~~~~~
компиляция прервана.
make[2]: *** [CMakeFiles/Core.dir/build.make:63: CMakeFiles/Core.dir/audio_logger.cpp.o] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:235: CMakeFiles/Core.dir/all] Ошибка 2
make: *** [Makefile:84: all] Ошибка 2

Поскольку некоторые «нововведения» до Debian приходят позже, то вполне возможно, что однажды там также появится эта ошибка.

Для решения этой проблемы удалите скаченный исходный код и выполните установку по следующей инструкции.

Клонируйте исходный код:

git clone https://github.com/ggerganov/kbd-audio
cd kbd-audio
git submodule update --init
mkdir build && cd build

Откройте файл ../CmakeLists.txt:

gedit ../CMakeLists.txt

И в самый верх добавьте в него строки:

if("${SDL2_LIBRARIES}" STREQUAL "")
    message(WARNING "SDL2_LIBRARIES wasn't set, manually setting to SDL2::SDL2")
    set(SDL2_LIBRARIES "SDL2::SDL2")
endif()

сохраните и закройте файл.

Продолжите выполнение следующих команд:

cmake ..
make

Error 'Buffer size in file (…..) does not match the expected one (5)'

При попытке указать программе keytap устройство клавиатуры например так:

sudo ./keytap /dev/input/event13

возникает ошибка:

Buffer size in file (1565157006) does not match the expected one (5)

Первое число в ней меняется при каждой попытке запуска:

Buffer size in file (1565157170) does not match the expected one (5)

Проблема в том, что нужно указать файл, созданный программой record, а не, например, устройство ввода в файловой системе.

Рекомендуется Вам:

One Comment to Определение введённого текста по звуку нажатых кнопок клавиатуры

  1. Alexey Alexey:

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

Добавить комментарий

Ваш e-mail не будет опубликован.