Распределенная атака на Delphi Alek Silverstone Хакер, номер #074, стр. 074-104-3 Теперь, как и в клиенте, нам нужно задать еще две переменные. Ищем строчку «var Form1: TForm1;» и подписываем под ней: work:TStringList; Dict:TStringList; Смысл этих переменных будет ясен в дальнейшем. Теперь дважды щелкаем по кнопке StartBtn и пишем ее здоровенный обработчик (смотри врезку «Код клиента»). Вероятно, в нем нужно что-то объяснить ;). Сначала мы получаем полный путь к нашей программе - это понадобится в дальнейшем. Затем заносим IP-адрес сервера из поля ввода в IdTCPclient1 и присваиваем логической переменной DONE значение false. Эта переменная используется для остановки цикла, о котором я говорил выше, - вот тут мы его и начинаем. Первым делом мы подключаемся к серверу, посылаем команду <need_work> и построчно считываем ответ в созданную структуру Dict. Затем мы удаляем из нее последний элемент. Дело в том, что, опять-таки экспериментально (ну не знаю я почему!), было вычислено, что любой непустой пакет, отправляемый IdTCPserver'ом, заканчивается точкой. Вот ее мы и вырезаем. Потом мы отключаемся и устанавливаем максимальное значение для индикатора ProgressBar1. Далее мы проверяем размер работы, и если он стал равен нулю, то устанавливаем DONE в true. Такое возможно, если весь блок работы состоял из одной точки, которую мы удалили. А такое, в свою очередь, возможно, когда у сервера закончился файл паролей. Далее мы начинаем цикл, который выполняется столько раз, сколько у нас получено паролей. Функция ExpandString генерирует из одного элемента Dict еще один список строк work, содержащий исходный пароль с вариантом замены строчных букв на прописные. Например строка 'ab' будет расширена до 'ab', 'Ab', 'aB' и 'AB'. Код этой функции смотри в исходнике на диске. Потом мы запускаем еще один вложенный цикл - собственно для подбора пароля. Функция ExecAndWait используется для запуска программы со всеми параметрами (заметь, именно тут нужна наша переменная path) и ожидания ее выполнения. В нашем случае запускается rar.exe для извлечения в папку Output с указанием пароля. Функция возвращает true, если программа была успешно запущена. Ее код также смотри на диске. Затем ищем первый попавшийся файл в папке Output. Тут есть своя фишка: первый попавшийся файл будет называться «.» :). Это особенность ДОСа - первые два файла в любом некорневом каталоге имеют имена «.» и «..». Функцией FindNext мы пропускаем эти три точки. Она возвращает нулевое значение, если удалось найти еще какой-то файл с теми же атрибутами. Это, собственно, означает, что пароль найден. Сообщаем эту радостную новость серверу командой <pass_find> и устанавливаем переменную в DONE для выхода изо всех циклов. В противном случаем продолжаем подбирать пароль из структуры work, затем выбираем следующий пароль из Dict и продолжаем. Когда заканчиваются все пароли в Dict, запрашиваем новую порцию у сервера. |