Клавиатурные шпионы (кейлоггеры) - Драйвера режима ядра для PS/2 клавиатуры
ОГЛАВЛЕНИЕ
Драйвера режима ядра для PS/2 клавиатуры
Стек драйверов для системных устройств ввода
Драйвера клавиатуры, независимо от схем физического подключения, используют системные драйвера класса клавиатуры для обработки не зависимых от аппаратной части операций. Данные драйвера называются драйверами класса, так как обеспечивают требуемые системой, но не зависимые от аппаратной реализации требования к конкретному классу устройств.
Соответствующий функциональный драйвер (драйвер порта) реализует зависимую от конкретного устройства поддержку выполнения операций ввода-вывода. В ОС Windows для x86-платформ реализован единый драйвер системной клавиатуры (i8042) и мыши.
Рис. 2. Драйверные стеки для системных устройств ввода: клавиатуры и мыши
Стек драйверов для Plug and Play PS/2-клавиатуры
Рис. 3. Стек драйверов для PS/2-клавиатуры
Стек драйверов содержит (сверху вниз):
- Kbdclass — верхнеуровневый фильтр-драйвер класса клавиатуры;
- опциональный верхнеуровневый фильтр-драйвер класса клавиатуры;
- i8042prt — функциональный драйвер клавиатуры;
- корневой драйвер шины.
В ОС Windows 2000 и старше драйвером класса клавиатуры является драйвер Kbdclass, основными задачами которого являются:
- обеспечение общих и аппаратно-независимых операций класса устройств;
- поддержка Plug and Play, поддержка управления питанием и Windows Management Instrumentation (WMI);
- поддержка операций для legacy-устройств;
- одновременное выполнение операций более чем одного устройства;
- реализация class service callback routine, которая вызывается функциональным драйвером для передачи данных из входного буфера устройства в буфер данных драйвера класса устройств.
В ОС Windows 2000 и старше функциональным драйвером для устройств ввода, использующих PS/2-порт (клавиатуры и мыши), является драйвер i8042prt, основные функции которого следующие:
- обеспечение аппаратно-зависимых одновременных операций PS/2-устройств ввода (клавиатуры и мыши разделяют общие порты ввода вывода, но используют разные прерывания, процедуры обработки прерываний (ISR) и процедуры завершения обработки прерываний);
- поддержка Plug and Play, поддержка управления питанием и Windows Management Instrumentation (WMI);
- поддержка операций для legacy-устройств;
- вызов class service callback routine для классов клавиатуры и мыши для передачи данных из входного буфера данных i8042prt в буфер данных драйвера класса;
- вызов набора функций обратного вызова, которые могут реализовать драйвера-фильтры высокого уровня для гибкого управления устройством.
Рис. 4. Список аппаратных ресурсов, используемых драйвером i8042prt
На рисунке показан список аппаратных ресурсов, используемых драйвером i8042prt. Их можно просмотреть, например, с помощью утилиты DeviceTree, разработанной компанией Open Systems Resources. Для тех, кто прочел разделы «Принципы работы клавиатуры как физического устройства» и «Низкоуровневое взаимодействие с клавиатурой через порты ввода-вывода», значения портов ввода-вывода (IO) 60h и 64h и аппаратного прерывания (IRQ) 1 не будут сюрпризом.
В показанном драйверном стеке новый драйвер-фильтр может быть добавлен, например, для специфичной обработки клавиатурного ввода поверх драйвера класса клавиатуры. Данный драйвер должен поддерживать ту же обработку всех типов запросов ввода-вывода и управляющих команд (IOCTL), что и драйвер класса клавиатуры. В этом случае перед передачей в подсистемы пользовательского режима данные будут отданы на обработку в этот драйвер-фильтр.
Стек устройств для Plug and Play PS/2-клавиатуры
Рассмотрим теперь стек устройств, которые создают указанные выше драйвера в драйверном стеке клавиатуры. Ниже на рисунке слева изображен стек устройств, приведенный в MSDN Library для PS/2-клавиатуры, справа — скриншот программы DeviceTree, показывающий реальную ситуацию на машине автора статьи.
Рис. 5. Конфигурация объектов устройств для Plug and Play PS/2-клавиатуры
В целом стек устройств (правильнее говорить о стеке объектов устройств) PS/2-клавиатуры состоит из:
- физического объекта устройства клавиатуры (PDO), созданного драйвером шины (в данном случае, шины PCI) – \Device\00000066;
- функционального объекта устройства клавиатуры (FDO), созданного и присоединенного к PDO драйвером i8042prt — неименованный объект (unnamed);
- опциональных фильтр-объектов устройства клавиатуры, создающихся фильтр-драйверами клавиатуры, разрабатываемыми сторонними разработчиками;
- верхнеуровневого фильтр-объекта устройства класса клавиатуры, созданного драйвером класса Kbdclass – \Device\KeyboardClass0.