Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Объявление структуры 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 эта функция не вызывается. Это приводит к усложнению кодаловушки, в чем вы сможете вскоре убедиться.

10.2. Программа «Оконный шпион»

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

Несмотря на свое «противозаконное» название, рассматриваемая программа может весьма пригодиться при отладке приложений, а отнюдь непри их взломе и шпионаже (хотя многое зависит от добросовестности лица, использующего программу). В частности, с помощью этой программы была найдена ошибка, на долгое время закравшаяся в один из примеров гл. 2: из-за неправильной установки стилей при ручном создании главного окна программы не удавалось добиться правильной перерисовки элемента управления «рамка».

Составление списка открытых окон

Список (а точнее, дерево) окон, открытых в момент запуска программы, показан на рис. 10.3.

Рис. 10.3. Дерево открытых окон

Форма, показанная на рис. 10.3, имеет имя f rmMain. Элемент управления TreeView имеет имя tree. Часть программы, отвечающая за построение дерева, относительно проста. Она использует вскользь рассмотренный в гл.2 механизм перечисления окон. Составление дерева окон начинается с процедуры LoadWindowsTree, которая и запускает перечисление окон верхнего уровня, то есть окон, родителем которых формально является окно Рабочего стола (листинг 10.1).

...

Листинг 10.1. Начало составления дерева окон

procedure TfrmMain.LoadWindowsTree;

var

desktop: TTreeNode;

//enInfo: TEnumInfo;

begin

tree.Items.Clear;

//Добавление узла для Рабочего стола

desktop := tree.Items.Add(tree.Items.GetFirstNode, \'Рабочий

стол\');

//Перечисление окон

enInfo.tree := tree;

enInfo.parent := desktop;

EnumWindows(Addr(NewWindow), Integer(Addr(enInfo)));

end;

Сразу следует привести объявление структуры, интенсивно используемой (далее это будет видно) при составлении дерева:

...

Type

TEnumInfo = Record

tree: TTreeView; //Компонент TreeView

parent: TTreeNode; //Элемент дерева, соответствующий

//текущему окну, дочерние

//окна которого перечисляются

end;

При нахождении каждого нового окна вызывается функция NewWindow (ее адрес передан в API-функцию EnumWindows). Функция NewWindow (листинг 10.2) решает две задачи. Во-первых, она добавляет в дерево элемент, соответствующий найденному окну. Во-вторых, запускает поиск дочерних окон относительно найденного окна, что позволяет перечислить все окна (от главной формы приложения до кнопок, надписей и т. д.).

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

Анти-Ксенонская Инициатива

Вайс Александр
7. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Анти-Ксенонская Инициатива

Майами

Фишер Марк
Детективы:
триллеры
6.40
рейтинг книги
Майами

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

Страж Тысячемирья

Земляной Андрей Борисович
5. Страж
Фантастика:
боевая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Страж Тысячемирья

Деревенщина в Пекине 3

Афанасьев Семен
3. Пекин
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Деревенщина в Пекине 3

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Лекарь Империи 5

Карелин Сергей Витальевич
5. Лекарь Империи
Фантастика:
городское фэнтези
аниме
героическая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 5

Вечный. Книга III

Рокотов Алексей
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга III

Я уже царь. Книга XXIX

Дрейк Сириус
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже царь. Книга XXIX

Варвара Асенкова

Алянский Юрий Лазаревич
Корифеи русской и зарубежной сцены
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Варвара Асенкова

Кодекс Охотника XXXI

Винокуров Юрий
31. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника XXXI

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2