Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #58, СЕНТЯБРЬ 2005 г.

Издевательство над окнами

nezumi

Спецвыпуск: Хакер, номер #058, стр. 058-024-1


Эмуляция ввода с клавиатуры

Оконный интерфейс операционной системы Windows построен на системе сообщений, пронизывающий все элементы управления. Любое приложение, независимо от уровня своих привилегий, может рассылать сообщения, адресуемые более привилегированным приложениям, и они воспринимаются как правильные. Механизмы аутентификации отсутствуют. Начисто!

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

Что делает вирус? Он запускает файрвол/антивирус, находит главное окно приложения, посылает ему сообщение "стань невидимым", затем эмулирует последовательность нажатий, вызывающих Центр Управления, и что-то там "нажимает". Естественно, когда вся работа будет сделана, защиту необходимо включить вновь, иначе нас очень быстро разоблачат.

Конечно, эта методика далеко не универсальна. Вирус должен поддерживать все типы популярных антивирусов и файрволов, иначе ему ни за что не выжить в агрессивной среде недружелюбно настроенного киберпространства. Но универсальных методик захвата управления вообще-то не существует. И в отличие от "дыр", которые закрываются очередной заплаткой, эмуляция ввода может рассчитывать на долгосрочную перспективу, к тому же популярных защитных программ не так уж много. Где-то с десяток, ну, от силы полтора десятка. Так что эта методика имеет полное право на существование.

Находим чужое окно и пробуем издеваться над ним

Для эмуляции ввода тебе потребуется дескриптор окна, которое будет принимать сообщения. Дескриптор можно получить несколькими способами. Самое простое - воспользоваться API-вызовом FindWindow, возвращающим дескриптор окна по его названию (текстовой строке, красующейся в заголовке). Более сложный, но и более гибкий вариант сводится к последовательному перебору (перечислению) всех имеющихся окон. Перечислением окон верхнего уровня занимается API-функция EnumWindows, а дочерние окна (элементы управления в том числе) берет на себя EnumChildWindows.

Получить дескриптор главного окна атакуемого приложения – не проблема, так как мы знаем его имя, которое в большинстве случаев однозначно идентифицирует данное окно. С дочерними окнами справиться не в пример сложнее. Кнопки еще можно распознать по надписям (получаем дескрипторы всех дочерних окон вызовом EnumChildWindows, а затем посылаем каждому из них сообщение WM_GETTEXT с требованием сказать, кого как зовут, после чего останется лишь сопоставить дескрипторы кнопок с их названиями), но с окнами редактирования такой фокус уже не проходит: по умолчанию они вообще не содержат в себе никакой информации. В принципе, можно получить идентификатор элемента управления, кстати говоря, не зависящий от языковой раскладки и одинаково хорошо работающий как на англоязычных, так и на русифицированных приложениях, но зачем усложнять себе жизнь?

Содержание  Вперед на стр. 058-024-2