Вход/Регистрация
Excel. Трюки и эффекты
вернуться

Гладкий Алексей Анатольевич

Шрифт:
...

type TCWPRetStruct = packed record

lResult: LRESULT; //Значение, возвращенное оконной функцией

lParam: LPARAM; //Параметр сообщения

wParam: WPARAM; //Параметр сообщения

message: UINT; //Код сообщения

hwnd: HWND; //Дескриптор окна-получателя

end;

Перехват сообщений клавиатурного ввода

Для ловушки WH_KEYBOARD параметры wParam и lParam функции-ловушки следует трактовать следующим образом:

• wParam – код нажатой клавиши;

• lParam – первые 16 бит этого параметра означают количество повторений нажатия; старшие 16 бит используются для дополнительного описания состояния клавиатуры в момент нажатия клавиши.

Параметры wParam и lParam полностью аналогичны параметрам сообщений WM_KEYDOWN И WM_KEYUP.

Перехват сообщений от мыши

В ловушку WH_KEYBOARD в параметрах wParam и lParam передаются следующие значения:

• wParam – код сообщения мыши;

• lParam– указатель на структуру TMouseHookStruct.

Объявление структуры TMouseHookStruct с описанием полей выглядит следующим образом:

...

type TMouseHookStruct = packed record

pt: TPoint; //Экранные координаты указателя мыши

hwnd: HWND; //Дескриптор окна-получателя сообщения

wHitTestCode: UINT; //Код, возвращенный оконной функцией

//в ответ на сообщение WM_NCHITTEST

dwExtraInfo: DWORD; //Дополнительные данные

end;

Если вы забыли, какое значение имеет для окна coo6nreHHeWM_NCHITTEST, то можете вновь обратиться к гл. 1.

Расположение функции-ловушки и DLL

Теперь поговорим немного о расположении функции-ловушки.

Казалось бы, что здесь может быть такого: написал функцию в модуле, строго соответствующую приведенному ранее прототипу, передал ее адрес в функцию SetWindowsHookEx и используй ловушку. Но не так все просто. Функция ловушки может находиться в исполняемом файле только в том случае, если предполагается использовать ее для перехвата сообщений потока (потоков) того же процесса. Тогда в функцию создания ловушки в качестве параметра hmod следует передавать нулевое значение.

Если же предполагается слежение за другими приложениями (за потоками других процессов), то функция ловушки должна быть экспортируемой функцией DLL. Тогда в функцию SetWindowsHookEx передается дескриптор модуля DLL (похоже, что это адрес в адресном пространстве процесса, куда спроецирован файл DLL). Библиотека (DLL) может загружаться как при запуске приложения (если используется так называемое load-time связывание), так и динамически при помощи API-функции LoadLibrary:

...

function LoadLibrary(lpLibFileName: PChar): HMODULE; stdcall;

Функция принимает в качестве параметра путь DLL и возвращает дескриптор загруженного модуля (или 0 в случае ошибки). Если библиотека больше не нужна, то можно вызвать функцию FreeLibrary, передав в качестве единственного параметра возращенный ранее функцией LoadLibrary дескриптор модуля DLL

Возвращаясь к теме расположения ловушки зададимся вопросом: почему именно DLL? Чем плохо расположение ловушки в ЕХЕ-модуле приложения? Самое время вспомнить о том, что каждый процесс в Windows выполняется в своем собственном адресном пространстве. Поэтому адрес функции в исполняемом файле одного процесса вполне может быть адресом структуры данных где-то внутри другого процесса (рис. 10.1).

Рис. 10.1. Пример адресного пространства разных процессов

В отличие от ЕХЕ-файлов, файлы библиотек легко проецируются в адресное пространство использующего их процесса. Разместив функцию ловушки в DLL и указав дескриптор модуля этой DLL, мы предоставляем системе полную информацию для того, чтобы она смогла:

• спроецировать библиотеку с ловушкой в адресное пространство исследуемого процесса;

• однозначно определить положение (адрес) функции-ловушки в адресном пространстве исследуемого процесса.

Описанные выше манипуляции с DLL проиллюстрированы на рис. 10.2 (Процесс 2 на рисунке – процесс, в который внедряется ловушка).

Рис. 10.2. Загрузка DLL с ловушкой в адресное пространство исследуемого процесса

Теперь нет никаких препятствий в вызове функции-ловушки при наблюдении за другим процессом.

...

Примечание

В каждой библиотеке реализуется функция DIIMain, вызываемая (упрощенно) при загрузке/выгрузке библиотеки. Жаль только, что при описанном способе подгрузки DLL эта функция не вызывается. Это приводит к усложнению кодаловушки, в чем вы сможете вскоре убедиться.

  • Читать дальше
  • 1
  • ...
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: