Файл: Мониторинг потока событий (Hooks) (.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 07.11.2023

Просмотров: 71

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


− WH_DEBUG устанавливает подключаемую процедуру, полезную для отладки других фильтр − процедур;

− WH_GETMESSAGE устанавливает подключаемую процедуру, которая контролирует сообщения, задержанные в очереди сообщений;

− WH_JOURNALPLAYBACK устанавливает подключаемую процедуру, которая задерживает сообщения, предварительно записанные подключаемой процедурой WH_JOURNALRECORD;

− WH_JOURNALRECORD устанавливает подключаемую процедуру, которая записывает входящие сообщения, задерживаемые в системной очереди сообщений. Эта hook-точка полезна для регистрации макрокоманд;

− WH_KEYBOARD устанавливает подключаемую процедуру, которая контролирует сообщения нажатия клавиш;

− WH_MOUSE устанавливает подключаемую процедуру, которая контролирует сообщения мыши;

− WH_MSGFILTER устанавливает подключаемую процедуру, которая контролирует сообщения, созданные в результате события ввода в диалоговом окне, окне сообщений, меню или линейке прокрутки;

− WH_SHELL устанавливает подключаемую процедуру, которая принимает уведомления, полезные для оболочки прикладных программ;

− WH_SYSMSGFILTER устанавливает подключаемую процедуру, которая контролирует сообщения, созданные в результате события ввода диалоговом окне, окне сообщений, меню или линейке прокрутки. Фильтр − процедура контролирует эти сообщения для всех прикладных программ в системе;

− Lpfn указывает на подключаемую процедуру. Если параметр dwThreadId нулевой или он определяет идентификатор потока, созданного другим процессом, параметр lpfn должен указывать на фильтр-процедуру в динамически компонуемой библиотеке (DLL). Иначе, lpfn может указывать на подключаемую процедуру в коде, связанном с текущим процессом;

− hMod идентифицирует динамически подключаемую библиотеку (DLL), содержащую фильтр − процедуру, указанную lpfn параметром. Параметр hMod должен быть установлен в значение ПУСТО (NULL), если параметр dwThreadId определяет поток, созданный текущим процессом и, если подключаемая процедура внутри кода, связанного с текущим процессом;

− dwThreadId определяет идентификатор потока, с которым подключаемая процедура должна быть связана. Если этот параметр нулевой, фильтр-процедура связана со всеми существующими потоками.

Рассмотрим возвращаемые значения: если функция завершается успешно
, величина возвращаемого значения − дескриптор подключаемой процедуры.
Если функция не выполняет задачу, величина возвращаемого значения ПУСТО (NULL).

Если параметр hMod значение ПУСТО (NULL), а параметр dwThreadId нулевой или определяет идентификатор потока, созданного другим процессом, может произойти ошибка.

Формирование цепочки со следующей подключаемой процедурой (то есть вызов функции CallNextHookEx необязателен. Прикладная программа или библиотека могут вызывать следующую фильтр − процедуру или до или после любой обработки в своей собственной подключаемой процедуре. Хотя сцепление со следующей hook-точкой необязательно, это настоятельно рекомендуется; иначе, другие прикладные программы, которые установили hook-точки, не будут принимать уведомления hook-точки и, в результате, могут повести себя неправильно.

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

Область действия hook-точки зависит от типа hook-точки. Некоторые hook-точки могут быть установлены только с системными возможностями; другие могут также быть установлены только для конкретного потока, как показано в следующем списке:

− WH_CALLWNDPROC;

− WH_CBT;

− WH_DEBUG;

− WH_GETMESSAGE;

− WH_JOURNALPLAYBACK;

− WH_JOURNALRECORD;

− WH_KEYBOARD;

− WH_MOUSE;

− WH_MSGFILTER;

− WH_SHELL;

− WH_SYSMSGFILTER.

Для заданного типа hook-точки, сначала вызываются hook-точки потока, затем системные hook-точки.

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

2 Описание программной реализации приложения



2.1 Описание структуры программного комплекса




Структура проекта показана на рисунке 2.1. Из рисунка 2.1 видно, что в проект входит два приложения:

− проект dll библиотеки ProjectDll.bpr;

− проект приложения мониторинга os1.bpr;

Согласно заданию, приложение мониторинга должно содержать два окна, что видно из структуры: главное окно (форма FormMain) и окно справки (форма FormAbout).

Рисунок 2.1 – Структура проекта


Структура программы показана на рисунке 2.2.

Рисунок 2.2 – Структура программы
Из рисунка 2.2 видно, что приложения мониторинга потока событий состоит из двух файлов: dll-библиотеки ProjectDll.dll и исполняемого файла сервиса os1.exe.

2.2 Описание интерфейса Windows-приложения




Рассмотрим интерфейс программы. Основное окно программы в режиме проектирования показано на рисунке 2.3. Из рисунка видно, что главное окно имеет стандартный Windows-интерфейс с главным меню. Программа управляется компонентой класса TTimer, которая с интервалом 1000 мс обновляет окно с информацией о потоке событий (перегружает файл log.txt). Для сворачивания в трей используется компонента класса TTrayIcon.

Рисунок 2.3 – Окно журнала (главное окно)

в режиме проектирования
Главное меню программы показано на рисунке 2.4. Из рисунка видно, что меню состоит из следующих пунктов:

− Файл/Свернуть в трей;

− Файл/Закрыть;

− Правка/Запустить службу;

− Правка/Остановить службу;

− Помощь/О программе.

Меню Файл/Свернуть в трей служит для сворачивания главного окна во время выполнения программы в трей.

Меню Файл/Закрыть служит для завершения работы программы.

Меню Правка/Запустить службу служит для запуска сервиса мониторинга потока событий клавиатуры.

Меню Правка/Остановить службу служит для остановки сервиса мониторинга.

Меню Помощь/О программе служит для вызова окна справки о программе.

Рисунок 2.4 – Меню программы главного окна
Всплывающее меню для пиктограммы в трее показано на рисунке 2.5. Из рисунка видно, что всплывающее меню содержит следующие пункты:

− Журнал;

− Параметры;

− Запустить службу;

− Остановить службу;

− О программе;

− Выход.


Рисунок 2.5 – Всплывающее меню иконки в tray
Меню Журнал служит для отображения главного окна с журналом потока событий клавиатуры.

Меню Параметры служит для предоставления возможности установить сервис в автозагрузку (предварительно пользователю задаётся вопрос об необходимости). Меню Запустить службу служит для запуска процесса мониторинга событий клавиатуры.

Меню Остановить службу служит для остановки процесса мониторинга событий клавиатуры. Меню О программе вызывает окно со справкой к программе; Меню Выход – завершение работы программы.

2.3 Описание основных алгоритмов программы




Блок-схема алгоритма установки хука показана на рисунке 2.6.

На рисунке 2.6 показано следующее. Переменная dllhook хранит указатель на загруженную dll-библиотеку. Если она пуста, то библиотека не загружена. Если dllhook содержит handle на библиотеку, то далее в переменную hook получаем адрес функции keyboardproc из библиотеки. В случае успеха далее при помощи функции setwindowshookex устанавливаем хук. Переменная start отвечает за запуск процесса мониторинга.

Рисунок 2.6 – Блок-схема алгоритма установки хука
Блок-схема алгоритма функции хука показана на рисунке 2.7 – 2.8. Из рисунка видно, что в начале алгоритма выполняется выделении скан кода нажатой клавиши в переменные kdown, scancode, ww.

Рисунок 2.7 – Алгоритм обработки события клавиатуры (1)



Рисунок 2.8 – Алгоритм обработки события клавиатуры (2)

2.4 Демонстрация работы журнала




Запуск сервиса мониторинга выполняется через исполняемый файл os1.exe. После чего на экране монитора не отображается главное окно. Приложение сразу сворачивается в трей. При наведении мышки и клике, отображается всплывающее меню, как показано на рисунке 2.9.



Рисунок 2.9 – Всплывающее меню приложения в трее

Выберем пункт «Журнал» после чего на мониторе отображается главное окно программы с журналом сообщений, как показано на рисунке 2.10. Из рисунка видно, что журнал пустой, что свидетельствуем о том, что события не фиксируются, служба не запущена.

Рисунок 2.10 – Главное окно программы с журналом
Выполним запуск службы мониторинга потока событий клавиатуры. Для этого выберем пункт меню Правка/Запустить службу главного окна или Запустить службу всплывающего меню, свернутой программы в трей. Результат показан на рисунке 2.11.


Рисунок 2.11 – Запуск службы мониторинга
Из рисунка 2.11 видно, что зафиксированы нажатия последних кнопок 1, 2, 3, 4, 5, 6. Переключим раскладку клавиатуры на русский язык и введём фразу «Мама мыла раму». При чем большую букву вводим при помощи shift. Результат показан на рисунке 2.12.

Рисунок 2.12 – Зафиксировано нажатие управляющей кнопки

и ввода текста
Окно со справкой о программе показано на рисунке 2.13. Его можно вызвать из главного окна по меню Помощь/О программе или всплывающему меню О программе, кликнув на иконке в трее.

Рисунок 2.13 – Справка к программе
Чтобы установить программу в автозагрузку необходимо кликнуть на меню Параметры из всплывающего меню на иконке в трее. После чего программа выдаст подтверждение действия, как показано на рисунке 2.14.

Рисунок 2.14 – Подтверждение установки в автозагрузку

Заключение




В ходе работы закреплены знания: разработки dll библиотек; по работе с системным треем; перехвата событий клавиатуры.

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