Клавиатурные шпионы (кейлоггеры) - Низкоуровневое взаимодействие с клавиатурой через порты ввода-вывода

ОГЛАВЛЕНИЕ


Низкоуровневое взаимодействие с клавиатурой через порты ввода-вывода

Взаимодействие с системным контроллером клавиатуры происходит через порт ввода-вывода 64h. Считав байт из этого порта, можно определить статус контроллера клавиатуры, записав байт — послать контроллеру команду.

Взаимодействие с микроконтроллером в самой клавиатуре происходит с помощью портов ввода-вывода 60h и 64h. Биты 0 и 1 в байте статуса (порт 64h в режиме чтения) предоставляют возможность управлять процедурой взаимодействия: перед записью данных в эти порты бит 0 порта 64h должен быть выставлен в 0. Когда данные доступны для чтения из порта 60h, бит 1 порта 64h равен 1. Биты включения/выключения клавиатуры в командном байте (порт 64h в режиме записи) определяют, является ли клавиатура активной, и будет ли контроллер клавиатуры вызывать прерывание в системе, когда пользователь нажмет клавишу.

Байты, записанные в порт 60h, посылаются контроллеру клавиатуры, а байты, записанные в порт 64h, посылаются системному контроллеру клавиатуры. Списки разрешенных команд, которые можно послать контроллеру клавиатуры, представлены, например, в документе «8042 Keyboard Controller IBM Technical Reference Manual» или в двадцатой главе книги The Art of Assembly Language Programming.

Байты, считываемые из порта 60h, приходят от клавиатуры. Порт 60h при чтении содержит скан-код последней нажатой клавиши, а в режиме записи он используется для расширенного управления клавиатурой. При использовании порта 60h на запись программа дополнительно получает следующие возможности:

  • установка времени ожидания перед переходом клавиатуры в режим автоповтора;
  • установка периода генерации скан-кода в режиме автоповтора;
  • управление светодиодами, расположенными на лицевой панели клавиатуры — Scroll Lock, Num Lock, Caps Lock.

Резюмируя, отметим, что для чтения данных, вводимых с клавиатуры, достаточно уметь считывать значения портов ввода-вывода 60h и 64h. Однако в ОС Windows приложениям пользовательского режима запрещено работать с портами, поэтому эту задачу выполняют драйвера операционной системы.