Клавиатурная снифалка на C++

Николай "GorluM" Андреев

Xakep, номер #055, стр. 055-070-1

(gorlum@real.xakep.ru)

За английским словом keylogger (key - клавиша, log – вносить в журнал) скрывается не что иное, как клавиатурный шпион. Так можно назвать, например, программу hookdump. Она логирует все нажатия клавиатуры, фиксирует имена открытых окон. В общем, приносит людям немало пользы :). А теперь представь, что такую же утилиту ты напишешь сам. Конечно, она будет немного попроще, но висеть в памяти и записывать все нажатия клавиш в файл она сможет.

Итак, загружай свою visual studio, она нам понадобится для создания двух модулей (проектов) программы. Первый модуль - сам ехе’шник, его ты и будешь запускать. Это Win32 Project, тип - Windows Application. Второй, самый интересный для нас - динамически подсоединяемая библиотека или, проще говоря - DLL. Она нам потребуется для того, чтобы внедриться в систему и перехватывать все нажатия клавиш для последующей их обработки, к примеру, записи в файл. Этот проект будет такой же, как и exe, только с другим типом - DLL.

Ловушки

Для перехвата любых системных и пользовательских событий в Windows существует очень интересный механизм. Механизм хуков (hook) или, попросту говоря, ловушек. Работает он следующим образом. Некоторый процесс запускает функцию установки ловушки SetWindowsHookEx и указывает в ее параметрах:

а) тип устанавливаемой ловушки (см. таблицу);

б) адрес функции, которая будет обрабатывать срабатывания ловушки (такую процедуру мы напишем чуть ниже);

с) дескриптор модуля, в котором содержится эта функция (в данном случае дескриптор DLL).

Затем система берет модуль, содержащий функцию обработки ловушки, и подгружает его ко всем доступным процессам в зависимости от прав доступа. Установив некоторые флаги у процесса, система заставляет его запускать функцию обработки всякий раз при срабатывании хука. Наша с тобой задача - написать функцию обработки, которая запихнет ее в отдельный модуль (подгружается системой), и программу, устанавливающую саму ловушку.

Основные типы ловушек

WH_KEYBOARD - рассматриваемая сегодня ловушка. Обрабатывает любые события клавиатуры.

WH_MOUSE - перехватывает все события мыши. С ее помощью можно получить текущее положение курсора (вести лог движения мыши), состояние кнопок или дескриптор окна, на котором находится курсор.

WH_GETMESSAGE - наверное, самый универсальный хук. Он позволяет перехватить и обработать любое оконное сообщение. Его можно использовать в качестве кей/маус-логгера, но не рекомендуется из-за слишком большого количества запусков процедуры хука.

WH_CBT - очень полезная системная ловушка. Позволяет обрабатывать события, срабатывающие при активации, создании, уничтожении или смене размера окна; при смене фокуса ввода, при удалении сообщений из очереди.

Пишем хук

Начнем мы с самого сложного - с написания модуля, содержащего функцию обработки. А обрабатывать нам надо событие, возникающее при нажатии на клавишу. Событие ловушки - WH_KEYBOARD. Если зайти на сайт msdn.microsoft.com или заглянуть на диск MSDN, можно найти описание этой процедуры:

LRESULT CALLBACK KeyboardProc(

Содержание  Вперед на стр. 055-070-2
ttfb: 3.162145614624 ms