TURBO PASCAL |
Новости
|
П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) |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |