Для клавиатуры ps/2 - понятно. Самый низкоуровневой keylogger можно реализаовать поставив обработчик прерывания клавиатуры. А USB?
У него свои прерывания есть? Но зачем вообще? В любом случае включается код в i8042prt.sys (или что-то типа этого), так следует и оттуда воровать клавишы.
Как это ни странно, но связь есть - через HID mapper driver (kbdhid.sys). Не знаю доходят ли IRP до i8042prt, но маппер гоняет запросы туда-сюда между USB стеком клавы и PS/2 стеком. Прерывания, наверное, не генерятся, но IRP проходят через kbdclass. http://msdn.microsoft.com/en-us/library/ms790189.aspx
Можно все сделать намного проще. Переопределить функцию IRP_MJ_READ у драйвера kbdclass Далее начать отслеживать IRP пакеты в которых переопределить CompletionRoutine на свою, а когда вызовется CompletionRoutine своего драйвера вытащить от туда коды нажатых клавишь и вызвать реальную CompletionRoutine. О таком подходе была статья на рутките, все работает на 100%, проверял личьно. Преимущества данного кейлогера – получает символы как USB ,так и PS/2 клавиатур даже если их подключено сразу несколько. Недостаток – невозможно определить в каком приложении нажаты клавиши, и какая раскладка языка.
Кbdclass - драйвер высокого уровня. Можно установить фильтр перед kbdclass и он удет получать коды первым. У меня интерес (честно говоря, чисто теоретического характера) как сделать keylogger более низкого уровня. Недавно нашел антикелоггер buеgеm. Он входит в состав нескольких антивирусов и распространяется по закрытой подписке. Очень любопытная штуковина. На ps/2 хучит idt на usb цепляется к usbhid.
У меня на работе был проект антикилоггер, я хукал MJ и потом обрубал ввод а слал по лпс на юзерский модуль а он уже непосредственно проге, конечно можно было перехватить WH_MSG но большинство обламывал.