TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

П7. МОДУЛЬ F_ANTI ДЛЯ ЗАЩИТЫ ПРОГРАММ ОТ ВИРУСОВ

Описание модуля см п.6.3.3.

^==»»=======с»»=; aMIT F_Anti; (=-»«============)

_•+.——————————————————+

I Модуль содержит программу контроля возможного ¦

Тексты программ ______ ___________ _______ 369

I заражения исполняемого ЕХЕ-файла компьютерным I вирусом. Эталонный заголовок файла и его длина запоминаются при первом запуске программы

в типизированной константе HEAD. Если факт

заражения установлен, программа сообщает об

этом, переносит копию на место испорченного

вирусом заголовка файла и восстанавливает

длину файла. +——————————————————————————„———+^

INTERFACE var

CheckVirusResult: Integer;

{Результат работы программы:

sss 0: вирус не обнаружен;

= 1: установлена защита файла;

—1: вирус удалей с разрешения пользователя/

=-2: вирус удален автоматически;

=-3: контроль блокирован ключом /NOANTI;

sa-4: вирус расположен в начале файла, удаление невозможно}

IMPLEMENTATION Uses DOS, CRT;

var

fff: file;

Procedure CheckFile;

type

{Заголовок ЕХЕ-файла}

HeadExeType = record case Byte of

0:t -• . , - ;

Sign : Word; {Сигнатура 'MZ' = $5A4Df

PartPag: Word; (Часть неполного сектора}

PageCnt: Word; {Количество секторов}^ -

ReloCnt: Word; {Количество элементов в таблице перемещения)

HdrSize: Word; (Длина заголовка в параграфах}

MinMem : Word; {Минимальный размер кучи)

MaxMem : Word; {Максимальный размер кучи)

ReloSS : Word; (Начальное значениесегмента стека SS)

ExeSP : Word; (Начальное значениуказателя стека SP!

ChkSum : Word; (Контрольная суммавсех слов файла)

ExelP : Word; {Смещение точкизапуска программы)

ReloCS : Word; (Начальное значениесегмента кода CS)

TablOff: Word; {Смещение таблицы перемещения}

Overlay: Word; (Номер оверлея (0 для главной программы!));

1: (Нет: array [1..14] of Word) end; (HeadExe)

{Ключ незараженного файла} KeyType = record

НЕ: HeadExeType; (Заголовок файла}

HL: LongInt; (Исходная длина файла}

HF: Boolean; (Флаг установки ключа)

Key: Word (Ключ для шифровки} end;

s8 = String [81;

const

H: KeyType =

(НЕ: (Нет: (0,0,0,0,0,0,0,0,0,0,0,0,0,0));

HL: 0;

HF: False;

Key: 0);

Key: array [1..4] of s8 =

('/NOANTI','/NOQUERY','/NOALARM','/NOCOPY');

var

f,ff: file;

Name: String;

NoAnti, NoQuery, NoAlarm, KoCopy: Boolean;

Offset: Word;

Head: KeyType;

Procedure AntiAIDS;

(Удаляет обнаруженный вирус} var

с: Char;

p: ^Byte;

Delta: Longint;

procedure WriteVirFile;

{Переписывает файл f в файл ff максимально возможными блоками} var

k,L: Longint;

p:"Byte;

begin

L := FileSize(f); {L - незаписанный остаток файла) repeat

k := MaxAvail;

if k > 65520 then k :- 65520;

if k > L then k := L;

GetMem(p,k); (k - длина буфера перезаписи} BlockRead(f, ?'',]<);

BlockHritefffrp^fk) ;

FreeMemtp,k);

dec(L,k) until L ° 0 end; {HriteVirFile}

Procedure FileInit;

(Создает резервную копию зараженного файла} begin

{Изменяем расширение файла на VIR:}

Name := copy(Name,1,pos('.'»Name));

Assign(ff,Name+'VIR') ;

Rewrite(ff,1); {ff - копия файла с расширением VIR}

Seek(f,0);

WriteVirFile; {Переписываем файл}

Close(ff) end; {FileInit}

coast

txtl="Вирус расположен в начале файла.';

txt2=' Удаление невозможно.';

txt3=tl3#10'Нажмите любую клавишу...';

begin {AntiAIDS} if not NoCopy then

FileInit; {Создаем резервную копию файла} if Head.HE.ReloCS > H.HE.ReloCS then

begin (Вирус в конце файла} (Восстанавливаем эталонный заголовок:} Seek(f,0);

BlockWrite(f,H.HE,SizeOf(H.HE));

{Воссганавливаек эталонную длину.}

Seek(f,H.HL) ;

Truncate(f); {Отсека ем вирус) if NoAlarm or NoQuery then

CheclcVirusResult :» -2 {Удалей автоматически} else

CheckVirusResult := -1 {Удален с разрешения} end else begin

if not NoAlarm then begin

Write(txtl,txt2,txt3) ;

с := ReadKey;

if с = #0 then

с := ReadKey end;

CheckVirusResult := -4 {Вирус не удален} end end; {AntiAlDS} ^——..-————————^

Procedure Check;

(Осуществляет контроль заголовка файла) var

k: Byte;

s: String [1];

begin {Check}

CheckVirusResult := 0;

{Дешифруем ключ:} with H,H.HE do

for k := 1 to 14 do

Hem[k] := Hem[k] XOE Key;

{Проверяем заголовок:} k := 1;

while (CheckVirusResult=Q) and (k <» X4) do begin

if H.HE.Heatkl <> Head.HE.Hea[kl then CheckVirusResult := -1;

inc(k) end;

it CheckVirusResult "-I then begin (Обнаружен факс заражения}

if NoAlarm then

AntiAlDS else begin

WriteLn(1Файл 1,Name,' заражен вирусом!1#7) ;

if NoQuery then

AntiAlDS else begin

Write('Удалять вирус (У/М, умлч.Х)? ');

s := ' ';

ReadLn(s);

if (s=") OB (OpCasetstlDO'll")

then AntiAlDS else

CheckVirusResult :•• -3 end •nd

end end; (Check) {.-. ——-.——————/

Procedure Save;

{Запоминает заголовок файла в константе HEAD} var

s: LongInt;

r: registers;

p: Pointer;

begin {Save}

with Head,Head.HE do begin

HL := FileSize(f); {Получаем длину файла}

HF :« True; {Устанавливаем признак контроля}

Г.АН :- $62;

MSDOS(r); {Получаем в г.ВХ сегмент PSP) р := @н;

s := round( (DSeg-r.BX-16+HdrSi2e)*16.0)+ofs(p'');

{s - смещение ключа. Н от начала файла} end;

Seek(f,s); (Позиционируем файл на начало ключа) {Шифруем ключ:} Randomize;

Head.Key := Random($FPFF);

with Head,Head.HE do for s :° 1 to 14 do

Hem[s] := HE.Hem[s] xor Key;

{Запотнаем ключ в файле} BlockWrite(f,Head,SizeOf(H)) ;

CheckVirusResult := 1 end; {Save}

{,., —————.——————— ———J

Function UpString(s: String): string;

{Преобразует символы строки S в верхний регистр/ var

k: Byte;

begin {UpString}

for k := 1 to Length(s) do s[k] :» UpCase(s[k]) ;

UpString := s end; {OpStringj ^-——————————;

Procedure GetParams;

(Получить параметры запуска! var

k,j: Byte;

begin

(Анализ ключей команды запуска:} NoAnti :° False;

NoQuery := False;

NoAlarm := False;

Noi-opy := False;

for к :- 1 to ParamCount do for j := 1 to 4 do

if UpString(ParamStr(k)) = Key[j] then case j of

ч: NoAnti := True;

2: NoQuery := True;

3: NoAlarm := True;

4: NoCopy := True end;

end; (GetParamsf begin {CheckFile}

Name := ParamStr(O); {Name содержит полное имя файла) GetParams; {Получаем параметры вызова} if NoAnti then

CheckVirusResult :=—3 else begin

Assign(f,Name);

Reset(f,l); _ {Длина блока равна 1 байт} BlockRead(f,Head,SizeOf(H)); {Читаем заголовок файла} if H.HF then

Check {Проверяем заголовок файла} else

Save; {Запоминаем заголовок} Close(f) end end; {CheckFile} { Все действия осуществляются установочной частью модуля:

} begin

CheckFile end. (F_Antl)

 

 Оглавление

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz