Фаервол тебя не спасет Крис Касперски, ака мыщъх Хакер, номер #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 заключается в том, что она позволяет нажать кнопку очень многими путями. Но ведь не ковыряться же с каждым отдельно взятым брандмауэром?! |