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

Фаервол тебя не спасет

Крис Касперски, ака мыщъх

Хакер, номер #094, стр. 094-042-6


Естественно, каждый брандмауэр требует своего подхода, но поскольку их существует не так уж и много, нам будет легко написать программу, поддерживающую их все. Ключевой фрагмент, ответственный за нажатие выглядит так:

// ПЕРЕЧИСЛЕНИЕ ДОЧЕРНИХ ОКОН БРАНДМАУЭРА

// =======================================

// получаем хэндлы всех интересующих нас окон

// (порядок окон определяем либо экспериментально,

// либо прогоном с отладочным выводом информации по каждому окону)

HWDN CALLBACK EnumChildWindowsProc(HWND hwnd,LPARAM lParam)

{

static N=0;

switch(++N)

{

case 3: // галочка "remember"

remember = hwnd;

break;

case 4: // кнопка "no"

no = hwnd;

break;

case 5: // кнопика "detail"

detail = hwnd;

break;

case 6: // кнопика "yes"

yes = hwnd;

return yes;

} return 0;

}

// имитация нажатия на кнопку yes

// ===============================

foo(HWND hWnd)

{

SendMessage(hWnd, WM_SETFOCUS, 1, 0);

SendMessage(hWnd, BM_SETSTATE, 1, 0);

PostMessage(hWnd, WM_KILLFOCUS, 0, 0);

}

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

Большая ошибка начинающих хакеров состоит в том, что они ограничиваются всего лишь одной посылкой сообщения BM_SETSTATE, а, как показывает практика, для элемента управления типа «кнопка» этого явно не достаточно, и такое сообщение еще не приводит к ее нажатию. Почему? Ошибка кроется в том, что для корректной эмуляции ввода мы, во-первых, должны установить фокус (сообщение WM_SETFOCUS), а после перевода кнопки в состояние «нажато» (сообщение BM_SETSTATE) этот фокус убить (сообщение WM_KILLFOCUS), ведь, как известно даже желторотым пользователям, кнопки срабатывают не в момент их нажатия, а в момент отпускания. Не веришь? Поэкспериментируй с любым приложением и убедись в справедливости сказанного.

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

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

Назад на стр. 094-042-5  Содержание  Вперед на стр. 094-042-7