Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #86, ФЕВРАЛЬ 2006 г.

Дрессированные окна

Александр Гайша

Хакер, номер #086, стр. 086-116-3


К каждому окну «прикреплена» своя процедура обработки сообщений (оконная процедура или функция), которую обычно называют WndProc (WindowProc), хотя это жестко и не фиксировано (ты можешь сделать прогу с оконной процедурой GetInZhopa). Функцию эту вызывать не надо, так как она имеет специальный модификатор CALLBACK, а значит, вызывается самой ОС. Аргументами функции являются как раз само сообщение, его параметры и хэндл целевого окна. Внутри у WindowProc должен быть оператор-переключатель (switch или case), который запускает ту или иную часть кода, в зависимости от пришедшего сообщения. Получается, что программа реагирует на события, о которых ей сообщает винда.

Впрочем, нам это все знать и не надо. Нас интересует только то, что если мы сами пошлем окну Word’а сообщение WM_LBUTTONDOWN, то он будет думать, что это пользователь нажал левую кнопку мыши. То есть мы вроде как эмулируем действия пользователя. Здорово, правда? Однако, для того чтобы у тебя составилась полная картина происходящего, мне надо сказать еще пару слов об архитектуре windows.

В ось встроен набор базовых функций, составляющих API (программный интерфейс) ОС. Эти функции находятся в самых главных файлах системы: kernel32.dll, user32.dll, gdi32.dll и других динамических библиотеках. Мы, кодеры, можем вызывать любую из этих API-функций в своих Win32-программах.

Нам для работы понадобится совсем мало API-функций: для поиска окон, посылки сообщений и работы с потоками. Рассматривать их будем по мере надобности.

[реализация]

А теперь по пунктикам, расписанным ранее (с 0 по 9), мы реализуем наш замечательный алгоритм.

Пункт №0. Находим окно с полем ввода пароля. Обычно поиск окна осуществляется функцией FindWindow по его заголовку (можно искать еще и по классу окна, но для этого надо знать имя класса). Синтаксис функции смотри на врезке. Часто используется и расширенная версия FindWindowEx, она описана там же. Последняя позволяет производить поиск окон еще и через их родителей или детей.

title:=’Требуется пароль-допуск’;

hIEPassWindow:=FindWindow(nil,PChar(title));

Далее у нас идет пункт №1. Текстовое поле можно было искать функцией FindWindowEx, выбирая из всех детей диалогового окна hIEPassWindow только то, которое имеет имя класса Edit (заметим, что в нашем окошке поле для редактирования текста всего одно, значит, любой найденный эдит будет тем, в который вводится пароль). Однако, я думаю, будет полезно указать еще один метод перебора всех детей заданного окна и вызова для каждого найденного чайлда той функции, которую мы захотим (вызываемой функции передается хэндл найденного окна-чайлда и 4-байтный параметр lParam).

while(EnumChildWindows(hIEPassWindow,@lpEnumFunc,0))do;

Этот оператор будет выполняться до тех пор, пока функция lpEnumFunc не вернет фолс. А она это сделает тогда, когда мы ей скажем:

Назад на стр. 086-116-2  Содержание  Вперед на стр. 086-116-4