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

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

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

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


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

WaitForSingleObject(hThread,INFINITE);

Эту строку надо разместить там, где ты хочешь подождать завершения потока с дескриптором hThread. Первый поток будет тихо переминаться до тех пор, пока не случится что-то с дескриптором созданного вторичного потока, а случиться с ним может только одно: произойдет выход из его функции (lpStartRoutine закончится, то есть (о, чудо!) мы найдем пароль). Значит, ждем в первом потоке окончания второго, потом закрываем файл-словарь и закрываем хэндл вторичного потока. Все, осталось только функцию вторичного потока рассмотреть.

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

SendMessage(hPassEdit,WM_SETTEXT,0,LPARAM(pass1));

Это мы послали сообщение pass1 в окно, которым является поле ввода пароля. WM_SETTEXT приказывает ему заполниться текстом, который лежит по указателю pass1 (пункт №3). В общем-то, то же самое действие можно было делать с помощью API-функции SetWindowText (подробнее смотри врезку), но я захотел для разнообразия показать еще и механизм работы с текстом окна через посылаемые ему сообщения.

PostMessage(hIEPassWindow,WM_COMMAND,WPARAM(IDOK),0);

А это мы нажали на кнопку ОК (пункт №4). Сообщение WM_COMMAND приходит всякий раз, когда пользователь нажимает какую-нибудь кнопку, заходит в меню или нажимает горячие клавиши. Параметром wParam сообщения является идентификатор сработавшего элемента. Программа именно по нему определяет, что же скомандовал юзер.

Далее необходимо немного поспать. Но не нам, а ему - вторичному потоку. Почему? Потому что теперь, согласно пункту №5 нашего супералгоритма, надо проверить, появилось ли ругательное окно с заголовком «Ограничение доступа», которое сообщает о том, что пароль-то неверный! А оно сразу может и не появится, потому что для его появления понадобится какое-то время. Получается, наш поток может раньше закончить поиск этого окна и решить, что оно не вылезло (значит, найден пароль!), а на самом деле это окно появится после окончания поиска (и о правильном подборе и речи быть не может). Поэтому надо с умом управлять параметрами засыпания, поэкспериментировать и посмотреть, чтобы не было ложных срабатываний. Например, если я ничего не делаю в фоне, то нормально действует задержка на 20 мс, но если я начинаю запускать что-то тяжеленькое, то прога наша может и неправильный пароль выдать. В общем, ищи оптимум.

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