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

Распределенная атака на 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;

Первая переменная - это список слов для подбора, вторая - указатель на слово, которое будет выслано клиенту по запросу. В ходе выполнения программы значение этой переменной будет меняться от нуля до общего количества слов.

Содержание  Вперед на стр. 074-104-2
<<< НАЗАД ||| ГЛАВНАЯ