Распределенная атака на Delphi Alek Silverstone Хакер, номер #074, стр. 074-104-1 (AlekSi@pisem.net) Быстрый взлом RAR-архива Задача распределения вычислений возникает у программистов довольно часто. Например, мне в руки недавно попал очень заманчивый RAR-архив. Я был уверен, что пароль не особо сложен - просто какое-нибудь слово. Но так как компьютер у меня весьма слабый, проводить атаку по словарю только на нем было бы слишком долго. Я решил написать программу для распараллеливания этого процесса внутри нашей локалки. Подготовка Для начала определимся, что нам нужно. Во-первых, Delphi и компоненты Indy для написания сетевого кода. Во-вторых, подопытный кролик - зашифрованный RAR-архив. Также нужна программа rar.exe (консольная версия) для разархивирования и собственно словарь. Последний должен быть простым текстовым файлом, не содержащим ничего, кроме слов - по одному в строке (его можно взять, например, на http://www.passwords.ru/dic.htm. - Прим. Dr). Пишем сервер Сначала объясню, как будет работать наш сервер. При запуске программа будет ждать подключения к порту 31337 по протоколу TCP и выполнять команды, посылаемые клиентом. Для этого обычно внутри кода пишется такой цикл: 1) чтение команды, 2) выполнение команды, 3) отправка результата, 4) goto 1. Но мы сделаем по-другому. Компонент IdTCPserver поддерживает обработчики команд. Когда сервер получает определенную команду, выполняется запрограммированное нами событие. Этот способ избавляет нас от написания цикла - просто создатели Indy написали его за нас :). У нас будет всего две команды: <need_work> - когда клиенту потребуется новая порция слов для проверки, <pass_find> - этой командой клиент сообщает, что нашел пароль. Сам пароль идет параметром. Итак, создаем новое приложение и кидаем на форму две кнопки - назовем их StartBtn и StopBtn - и компонент TMemo. Его название оставим Memo1 - это будет наш лог. У него свойство ReadOnly ставим в true, а ScrollBars в ssVertical. Теперь размещаем на форме компонент IdTCPserver с панели Indy Servers. Имя его не меняем, но устанавливаем в свойстве DefaultPort значение 31337. Убедись, что Active установлен в false, а CommandHandlersEnabled в true. Именно последнее свойство и отвечает за обработку команд. Дважды щелкаем по кнопке StartBtn и пишем код: Запуск сервера procedure TForm1.StartBtnClick(Sender: TObject); var f:TextFile; r:string; begin DictP:=0; Memo1.Clear; Dict:=TStringList.Create; AssignFile(f,'dict.txt'); Reset(f); while not eof(f) do begin ReadLn(f,r); Dict.Add(r); end; CloseFile(f); Memo1.Lines.Add(IntToStr(Dict.Count)+' паролей загружено'); IdTCPserver1.Active:=true; Memo1.Lines.Add('Сервер запущен'); end; Этой кнопкой мы будем запускать сервер после чистки лога и загрузки паролей из файла dict.txt. Обрати внимание на переменные Dict и DictP - их еще нужно задать. Переходим в коде примерно на страницу выше и ищем строчку «var Form1:TForm». Под ней подписываем: Dict:TStringList; DictP:integer; Первая переменная - это список слов для подбора, вторая - указатель на слово, которое будет выслано клиенту по запросу. В ходе выполнения программы значение этой переменной будет меняться от нуля до общего количества слов. |