Метод
защиты файлов
диска «Эксклюзив»
Начало
Ввод диска для
защиты, Вы-
бор типов
объектов защиты
и способа
доступа к ним.
Конец списка Да
каталогов?
Нет
Да Конец списка
файлов?
Нет
Неверный тип Да
объекта?
Нет
Открытие
файла,
с
выбранными
пра-
вами
доступа к нему
других
процессов.
Да Продолжать
выполнение?
(ДА)
Нет
Да Продолжать
выполнение?
(ДА)
Нет
Конец
Метод
защиты от
копирования
программы
Начало
Чтение
из памяти При
первом запуске
даты
изготовления
создаётся
«dbpg.ini»,
BIOS
(0xffff5) содержащий
загам-
мированную
дату
создания BIOS.
«Программный
файл
Файл «dbpg.ini»
существ? не
существует!»
Нет
Да
Чтение
из файла
«dbpg.ini»
созданной
при установке
и загам-
мированной
даты BIOS
Гамма-функ-
ции не совпадают?
«Не
легальная копия
программы!!!»
Конец
Запуск программы
Гаммирование
Начало
Str = “”
I = 0
SoderjVvoda = ””
Simvol = ””
S = 1
Gamma = “GAMMA”
Нет
S<=Gamma.Length
Да
Simvol = Str[S]
Gamma[S-1]+ Нет
SoderjVvoda+=
Simvol >= 255
Gamma[s-1]+Simvol
Да
Simvol+=Gamma[s-1]-255
SoderjVvoda+=simvol
Нет
S > Str.Length+1
Да
Конец
Анализ
существующих
вариантов
решения задачи
и выбор наиболее
приемлемого.
Антивирусные
мониторы.
Антивирусные
мониторы — это
резидентные
программы,
перехватывающие
вирусоопасные
ситуации и
сообщающие
об этом пользователю.
К вирусоопасным
относятся
вызовы на открытие
для записи в
выполняемые
файлы, запись
в загрузочные
секторы дисков
или MBR винчестера,
попытки программ
остаться резидентно
и т. д., то есть
вызовы, которые
характерны
для вирусов
в моменты их
размножения.
К достоинствам
мониторов
относится их
способность
обнаруживать
и блокировать
вирус на самой
ранней стадии
его размножения,
что, кстати,
бывает очень
полезно в случаях,
когда давно
известный вирус
постоянно
"выползает
неизвестно
откуда". К недостаткам
относятся
существование
путей обхода
защиты монитора
и большое количество
ложных срабатываний,
что, видимо, и
послужило
причиной для
практически
полного отказа
пользователей
от подобного
рода антивирусных
программ (мне,
например, неизвестно
ни об одном
мониторе для
Windows 95/NT — нет спроса,
нет и предложения).
Необходимо
также отметить
такое направление
антивирусных
средств, как
антивирусные
мониторы, выполненные
в виде аппаратных
компонентов
компьютера
("железа"). Наиболее
распространенной
является встроенная
в BIOS защита от
записи в MBR винчестера.
Однако, как и
в случае с
программными
мониторами,
такую защиту
легко обойти
прямой записью
в порты контроллера
диска, а запуск
DOS-утилиты FDISK
немедленно
вызывает ложное
срабатывание
защиты.
Существует
несколько более
универсальных
аппаратных
мониторов, но
к перечисленным
выше недостаткам
добавляются
также проблемы
совместимости
со стандартными
конфигурациями
компьютеров
и сложности
при их установке
и настройке.
Все это делает
мониторы крайне
непопулярными
на фоне остальных
типов антивирусной
защиты.
Обнаружение
загрузочного
вируса
В загрузочных
секторах дисков
расположены,
как правило,
небольшие
программы,
назначение
которых состоит
в определении
размеров и
границ логических
дисков (для MBR
винчестера)
или загрузке
ОС (для загрузочного
сектора).
Вначале
следует проверить
содержимое
сектора, подозрительного
на наличие
вируса. Для
этой цели удобно
использовать
DISKEDIT из "Нортоновских
утилит" или
AVPUTIL из профессионального
комплекта AVP.
Некоторые
загрузочные
вирусы практически
сразу можно
обнаружить
по наличию
различных
текстовых строк
(например, вирус
Stoned содержит
строки: "Your PC is now
Stoned!", "LEGALISE MARIJUANA!"). Некоторые
вирусы, поражающие
загрузочные
сектора дисков,
наоборот,
определяются
по отсутствию
строк, которые
обязательно
должны быть
в загрузочном
секторе. К таким
строкам относятся
имена системных
файлов (например,
строка IOSYSMSDOS SYS) и
строки сообщений
об ошибках.
Отсутствие
или изменение
строки-заголовка
загрузочного
сектора (строка,
содержащая
номер версии
DOS или название
фирмы — производителя
ПО, например
MSDOS5.0 или MSWIN4.0) также
может служить
сигналом о
заражении
вирусом, если
на компьютере
не установлена
Windows 95/NT, так как эти
системы по
неизвестной
мне причине
записывают
в заголовок
загрузочных
секторов дискет
случайные
строки текста.
Стандартный
загрузчик
MS-DOS, расположенный
в MBR, занимает
меньше половины
сектора, и многие
вирусы, поражающие
MBR винчестера,
довольно просто
заметить по
увеличению
длины кода,
расположенного
в секторе MBR.
Однако существуют
вирусы, которые
внедряются
в загрузчик
без изменения
его текстовых
строк и с минимальными
изменениями
кода загрузчика.
Для того чтобы
обнаружить
такой вирус,
в большинстве
случаев достаточно
отформатировать
дискету на
заведомо незараженном
компьютере,
сохранить в
виде файла ее
загрузочный
сектор, затем
некоторое время
использовать
ее на зараженном
компьютере
(записать/прочитать
несколько
файлов), а после
этого на незараженном
компьютере
сравнить ее
загрузочный
сектор с оригинальным.
Если в коде
загрузочного
сектора произошли
изменения —
вирус пойман.
Существуют
также вирусы,
использующие
более сложные
приемы заражения,
например, изменяющие
при инфицировании
MBR всего 3 байта
Disk Partition Table, соответствующие
адресу активного
загрузочного
сектора. Для
идентификации
такого вируса
придется провести
более детальное
исследование
кодов загрузочного
сектора вплоть
до полного
анализа алгоритма
работы его
кода.
Приведенные
рассуждения
основываются
на том, что
стандартные
загрузчики
(программы,
записываемые
операционной
системой в
загрузочные
сектора) реализуют
стандартные
алгоритмы
загрузки ОС
и оформляются
в соответствии
с ее стандартами.
Если же диски
отформатированы
утилитами, не
входящими в
состав DOS (например,
Disk Manager), то для обнаружения
в них вируса
следует проанализировать
алгоритм работы
и оформление
загрузчиков,
создаваемых
такой утилитой.
Обнаружение
файлового
вируса.
Все вирусы
делятся на
резидентные
и нерезидентные.
Резидентные
вирусы отличаются
гораздо большим
коварством
и изощренностью,
чем нерезидентные.
Поэтому для
начала нужно
рассмотреть
простейший
случай — поражение
компьютера
неизвестным
нерезидентным
вирусом. Такой
вирус активизируется
при запуске
какой-либо
зараженной
программы,
совершает все,
что ему положено,
передает управление
программе-носителю
и в дальнейшем
(в отличие от
резидентных
вирусов) не
мешает ее работе.
Для обнаружения
такого вируса
необходимо
сравнить длины
файлов на винчестере
и в дистрибутивных
копиях. Если
это не поможет,
то следует
побайтно сравнить
дистрибутивные
копии с используемыми
программами.
Можно также
просмотреть
дамп выполняемых
файлов. В некоторых
случаях можно
сразу обнаружить
присутствие
вируса по наличию
в его коде текстовых
строк. Многие
вирусы, например,
содержат строки:
".СОМ", "*.СОМ",
".ЕХЕ", "*.ЕХЕ",
"*.*", "MZ", "COMMAND" и т.
д. Эти строки
часто встречаются
в начале или
в конце зараженных
файлов.
Существует
и еще один способ
визуального
определения
зараженного
вирусом файла.
Он основан на
том, что выполняемые
файлы, исходный
текст которых
написан на
языке высокого
уровня, имеют
вполне определенную
структуру. В
случае Borland или
Microsoft C/C++ сегмент
кода программы
находится в
начале файла,
а сразу за ним
— сегмент данных,
причем в начале
этого сегмента
стоит строка-копирайт
фирмы — изготовителя
компилятора.
Если в дампе
такого файла
за сегментом
данных следует
еще один участок
кода, то вполне
вероятно, что
файл заражен
вирусом.
То же справедливо
и для большинства
вирусов, заражающих
файлы Windows. В выполняемых
файлах этой
ОС стандартным
является размещение
сегментов в
следующем
порядке: сегмент(ы)
кода, за ним
сегменты данных.
Если за сегментом
данных идет
еще один сегмент
кода, это также
может служить
сигналом о
присутствии
вируса.
Рекомендуется
запустить одну
из резидентных
антивирусных
программ-мониторов
и следить за
ее сообщениями
о подозрительных
действиях
программ (запись
в СОМ- или ЕХЕ-файлы,
запись на диск
по абсолютному
адресу и т. п.).
Существуют
мониторы, которые
не только
перехватывают
такие действия,
но и сообщают
адрес, откуда
поступил
подозрительный
вызов (к таким
мониторам
относится
AVPTSR.COM). Обнаружив
подобное сообщение,
следует выяснить,
от какой программы
оно пришло, и
проанализировать
ее коды при
помощи резидентного
дизассемблера
(например,
AVPUTIL.COM). При анализе
кодов программ,
резидентно
находящихся
в памяти, большую
помощь часто
оказывает
трассирование
прерываний
13h и 21h.
Следует
отметить, что
резидентные
DOS-мониторы часто
оказываются
бессильны, если
работа ведется
в DOS-окне под
Windows 95/NT, поскольку
Windows 95/NT позволяют
вирусу работать
в обход монитора
(как, впрочем,
и всех остальных
резидентных
программ).
DOS-мониторы
неспособны
остановить
также распространение
Windows-вирусов.
Рассмотренные
выше методы
обнаружения
файловых и
загрузочных
вирусов подходят
для большинства
как резидентных,
так и нерезидентных
вирусов. Однако
эти методы не
срабатывают,
если вирус
выполнен по
технологии
"Стелс", что
делает бесполезным
использование
большинства
резидентных
мониторов,
утилит сравнения
файлов и чтения
секторов.
Приняв во
внимание всё
выше сказанное,
можно сделать
вывод о большой
ненадёжности
антивирусных
мониторов, как
средства защиты
от компьютерных
вирусов.
Выбор методов
построения
антивирусного
монитора.
Передо мной
стоит задача
разработать
антивирусный
монитор под
операционную
систему Windows98.
Первое, что
приходит в
голову при
анализе такой
задачи, - разработать
резидентную
программу,
перехватывающую
обращения к
диску и при
возникновении
вирусоподобной
ситуации генерирующую
исключение,
либо просто
предупреждение
пользователю.
Однако, написание
резидентной
программы под
Windows,
это далеко не
простая задача.
Да и ко всему
прочему, как
оказалось,
вовсе не обязательно
перехватывать
и сканировать
все обращения
к диску, что
значительно
затрачивает
системные
ресурсы и может
вызывать огромную
массу ложных
срабатываний.
Альтернативным
способом в этой
ситуации является
регулярное
сканирование
файлов. Хотя,
конечно, это
отнимает намного
больше системных
ресурсов, чем
мониторинг
обращений к
диску, но что
если сканировать
не все .exe
и .com
файлы, а лишь
только маленькую
часть из них.
Дело в том, что
вирусы «охотятся»
на любые исполняемые
файлы, а некоторые
изощренные
вирусы, могут,
например, «ловить»
только файлы,
размеры которого
лежат в приделах
от 40 до 300 Кб. В этом
смысле, можно
легко выделить
группу файлов,
которая подходила
бы под запросы
любого вируса,
и размеры её
не превышали
бы 5-7 штук. Но ведь
совсем не обязательно
подставлять
под удар «своих»,
когда можно
создать заведомо
ненужную группу
и выставлять
её как бы «ловушкой»
для вируса, в
то время как
нужные файлы
были бы под
защитой.
Для защиты
«нужных» файлов
я предлагаю
использовать
разработанный
мною метод,
который я назвал
«Эксклюзив».
Его суть заключается
в том, что при
запуске приложения,
использующего
данный метод,
все выбранные
типы файлов
открываются
с правом доступа
к ним только
моего приложения.
Соответственно
ни вирус, ни
пользователь(по
желанию) не
смогут произвести
несанкционированные
действия.
Постановка
задачи на
проектирование.
Метод ведения
мониторинга
вирусоподобных
ситуаций.
Объекты
мониторинга:
Объектами
мониторинга
являются исполняемые
.exe
и .com
файлы, созданные
монитором для
фиксации действий
системы над
ними. Достаточным
в той или иной
мере для выявления
вирусоподобных
ситуаций, будем
считать следующее
подмножество
файлов:
Описание
метода:
При первом
запуске антивирусного
монитора, создаётся
вышеизложенное
подмножество
файлов-ловушек.
После этого,
контроль над
ними осуществляется
регулярно –
каждые 10 секунд.
В случае изменения
или удаления
одного из элементов
подмножества,
пользователь
системы получает
соответствующее
уведомление
о действиях
произведённых
над файлом, и
монитор восстанавливает
исходный файл.
В это же время,
по желанию,
пользователь
может защитить
все файлы компьютера
(кроме ловушек)
от возможной
модификации
или даже просмотра.
Или же защитить
только загрузочные
файлы системы
от изменения.
Преимущества
метода:
Простота
реализации.
Программно,
способ достаточно
лёгок и прозрачен.
Достоверность.
В отличие от
остальных
антивирусных
мониторов
ошибка второго
рода исключена.
Универсальность.
Данный антивирусный
монитор способен
выявлять действия
как Windows-вирусов,
так и DOS-вирусов,
ввиду своей
не привязанности
к особенностям
операционной
системы.
Недостатки
метода:
Метод защиты
файлов от
несанкционированного
использования,
изменения и
модификации
– «Эксклюзив».
Объекты
защиты:
Объектами
защиты «Эксклюзива»
могут быть
любые файлы
локального
компьютера,
попавшие в
«поле зрения»
приложения(программы),
использующего
данный метод.
Множество
указанных
объектов защиты
изначально
определяется
пользователем
и в любой момент
времени может
быть изменено.
Описание
метода:
«Эксклюзив»
представляет
собой способ
защиты объектов(файлов)
и, как следствие,
информации
находящейся
в указанных
объектах, от
порчи, подмены
или даже от
ознакомления
с нею злоумышленника.
Суть данного
метода заключается
в следующем.
Выбранные
защищаемые
файлы, помечаются
системой как
открытые на
эксклюзивное
использование
приложением,
использующим
«Эксклюзив».
Т.е. в файловой
системе указывается
служебная
информация
о непосредственном
владельце
файла(пользовательском
приложении).
В зависимости
от цели, пользователь
выбирает способ
доступа к файлам
других процессов,
определённый
на некотором
подмножестве(полный
доступ, закрыт
для любых операций,
закрыт для
чтения, закрыт
для записи).
Тем самым, владельцем
программы,
обеспечивается
эксклюзивное
право владения
и определение
способа доступа
к защищаемым
объектам других
процессов.
Способы
применения:
Кроме
очевидной
функции, рассматриваемой
в контексте
данной разработки,
метод находит
широкое применение
в области защиты
информации,
в частности
для разграничения
доступа пользователей
к системе.
Преимущества
метода:
Минимальные
требования
к аппаратным
ресурсам
Стойкость
к обходу защиты
метода оцениваемая
уровнем стойкости
операционной
системы с одной
стороны и
приложения,
использующего
данный метод,
с другой.
Не ограниченное
множество
объектов защиты
Предельно
простая реализация
на уровне приложения
Методы построения
системы защиты
от несанкционированного
копирования
и использования
приложения.
Метод фиксации
аппаратной
платформы.
В дистрибутиве
программного
пакета, помимо
исполняемого
файла самого
антивирусного
монитора
«Amonit.exe»,
содержится
файл «Creator.exe»,
который после
первого запуска
приложения
удаляется. Но
перед своим
удалением, он
создаёт новый
«ini-файл»,
в котором содержится
всего одно
слово – загаммированная
дата производства
BIOS
компьютера-носителя.
Этот файл не
доступен при
активированном
приложении,
но открыт в
противном
случае. Если
этот файл был
случайно удалён,
то без переустановки
программы,
открыть её не
удастся.
Метод шифровки
ключевой информации.
В предложенном
варианте
антивирусного
монитора
предусмотрена
защита от
несанкционированного
снятия программы
с выполнения
- пароль. Он хранится
на инсталляционной
дискете в файле
«pif.ini»
в загаммированном
виде. Легальный
пользователь
может всегда
задать или
изменить этот
пароль при
помощи специальной
программной
опции.
Изменить
пароль без
использования
программной
опции, т.е. методом
непосредственного
изменения файла
затруднительно,
поскольку от
этого предусмотрена
небольшая
защита. Дело
в том, что пустой
файл «pif.ini»
не означает
пустой пароль.
Программа
антивирусного
монитора – это
.exe
файл для Windows,
поэтому запуск
его на выполнение
порождает в
системе процесс
и он естественно
должен фиксироваться
в списке процессов
Windows.
Но это обстоятельство
делает программу
очень уязвимой
в плане того,
что её можно
снять с выполнения.
Для этого в
программе
предусмотрен
способ обхода
системной
регистрации
процесса и
другой пользователь
не в силах снять
этот процесс
не прибегая
к сторонним
разработкам.
Метод защиты
файлов от
несанкционированного
использования,
изменения и
модификации
– «Эксклюзив».
Объекты защиты:
Объектами
защиты «Эксклюзива»
могут быть
любые файлы
локального
компьютера,
попавшие в
«поле зрения»
приложения(программы),
использующего
данный метод.
Множество
указанных
объектов защиты
изначально
определяется
пользователем
и в любой момент
времени может
быть изменено.
Описание метода:
«Эксклюзив»
представляет
собой способ
защиты объектов(файлов)
и, как следствие,
информации
находящейся
в указанных
объектах, от
порчи, подмены
или даже от
ознакомления
с нею злоумышленника.
Суть данного
метода заключается
в следующем.
Выбранные
защищаемые
файлы, помечаются
системой как
открытые на
эксклюзивное
использование
приложением,
использующим
«Эксклюзив».
Т.е. в файловой
системе указывается
служебная
информация
о непосредственном
владельце
файла(пользовательском
приложении).
В зависимости
от цели, пользователь
выбирает способ
доступа к файлам
других процессов,
определённый
на некотором
подмножестве(полный
доступ, закрыт
для любых операций,
закрыт для
чтения, закрыт
для записи).
Тем самым, владельцем
программы,
обеспечивается
эксклюзивное
право владения
и определение
способа доступа
к защищаемым
объектам других
процессов.
Способы применения:
Метод «Эксклюзив»
находит широкое
применение
в области защиты
информации.
На его основе
могут быть
разработаны
программы
ограничения
доступа к ресурсам
локального
компьютера,
в частности
такая защита
может послужить
хорошим щитом
для файлов от
заражения
вирусами.
Преимущества
метода:
Минимальные
требования
к аппаратным
ресурсам
Стойкость к
обходу защиты
метода оцениваемая
уровнем стойкости
операционной
системы с одной
стороны и
приложения,
использующего
данный метод,
с другой.
Не ограниченное
множество
объектов защиты
Предельно
простая реализация
на уровне приложения
Разработал:
Трутнев Евгений
Владимирович 23
ноября 2003г.
Министерство
образования
РФ
Тульский
государственный
университет
Кафедра ЭВМ
Защита системного
программного
обеспечения
Курсовая
работа
Антивирусный
монитор
Выполнил
студент /Трутнев
Е.В./
гр.230901 дата подпись
Проверил:
/Савин
Н.И./
дата подпись
Тула 2003
Оглавление
1. Анализ существующих
вариантов
решения задачи
и выбор наиболее
приемлемого
1.1. Антивирусные
мониторы
Антивирусные
мониторы — это
резидентные
программы,
перехватывающие
вирусоопасные
ситуации и
сообщающие
об этом пользователю.
К вирусоопасным
относятся
вызовы на открытие
для записи в
выполняемые
файлы, запись
в загрузочные
секторы дисков
или MBR винчестера,
попытки программ
остаться резидентно
и т. д., то есть
вызовы, которые
характерны
для вирусов
в моменты их
размножения.
К достоинствам
мониторов
относится их
способность
обнаруживать
и блокировать
вирус на самой
ранней стадии
его размножения,
что, кстати,
бывает очень
полезно в случаях,
когда давно
известный вирус
постоянно
"выползает
неизвестно
откуда". К недостаткам
относятся
существование
путей обхода
защиты монитора
и большое количество
ложных срабатываний,
что, видимо, и
послужило
причиной для
практически
полного отказа
пользователей
от подобного
рода антивирусных
программ. [1]
Необходимо
также отметить
такое направление
антивирусных
средств, как
антивирусные
мониторы, выполненные
в виде аппаратных
компонентов
компьютера.
Наиболее
распространенной
является встроенная
в BIOS защита от
записи в MBR винчестера.
Однако, как и
в случае с
программными
мониторами,
такую защиту
легко обойти
прямой записью
в порты контроллера
диска, а запуск
DOS-утилиты FDISK
немедленно
вызывает ложное
срабатывание
защиты.
Существует
несколько более
универсальных
аппаратных
мониторов, но
к перечисленным
выше недостаткам
добавляются
также проблемы
совместимости
со стандартными
конфигурациями
компьютеров
и сложности
при их установке
и настройке.
Все это делает
мониторы крайне
непопулярными
на фоне остальных
типов антивирусной
защиты. [1]
1.2. Обнаружение
загрузочного
вируса
В загрузочных
секторах дисков
расположены,
как правило,
небольшие
программы,
назначение
которых состоит
в определении
размеров и
границ логических
дисков (для MBR
винчестера)
или загрузке
ОС (для загрузочного
сектора).
Вначале
следует проверить
содержимое
сектора, подозрительного
на наличие
вируса. Для
этой цели удобно
использовать
DISKEDIT из "Нортоновских
утилит" или
AVPUTIL из профессионального
комплекта AVP.
Некоторые
загрузочные
вирусы практически
сразу можно
обнаружить
по наличию
различных
текстовых строк
(например, вирус
Stoned содержит
строки: "Your PC is now
Stoned!", "LEGALISE MARIJUANA!"). Некоторые
вирусы, поражающие
загрузочные
сектора дисков,
наоборот,
определяются
по отсутствию
строк, которые
обязательно
должны быть
в загрузочном
секторе. К таким
строкам относятся
имена системных
файлов (например,
строка IOSYSMSDOS SYS) и
строки сообщений
об ошибках.
Отсутствие
или изменение
строки-заголовка
загрузочного
сектора (строка,
содержащая
номер версии
DOS или название
фирмы — производителя
ПО, например
MSDOS5.0 или MSWIN4.0) также
может служить
сигналом о
заражении
вирусом, если
на компьютере
не установлена
Windows 95/NT, так как эти
системы по
неизвестной
мне причине
записывают
в заголовок
загрузочных
секторов дискет
случайные
строки текста.
Стандартный
загрузчик
MS-DOS, расположенный
в MBR, занимает
меньше половины
сектора, и многие
вирусы, поражающие
MBR винчестера,
довольно просто
заметить по
увеличению
длины кода,
расположенного
в секторе MBR.
Однако
существуют
вирусы, которые
внедряются
в загрузчик
без изменения
его текстовых
строк и с минимальными
изменениями
кода загрузчика.
Для того чтобы
обнаружить
такой вирус,
в большинстве
случаев достаточно
отформатировать
дискету на
заведомо незараженном
компьютере,
сохранить в
виде файла ее
загрузочный
сектор, затем
некоторое время
использовать
ее на зараженном
компьютере
(записать/прочитать
несколько
файлов), а после
этого на незараженном
компьютере
сравнить ее
загрузочный
сектор с оригинальным.
Если в коде
загрузочного
сектора произошли
изменения —
вирус пойман.
Существуют
также вирусы,
использующие
более сложные
приемы заражения,
например, изменяющие
при инфицировании
MBR всего 3 байта
Disk Partition Table, соответствующие
адресу активного
загрузочного
сектора. Для
идентификации
такого вируса
придется провести
более детальное
исследование
кодов загрузочного
сектора вплоть
до полного
анализа алгоритма
работы его
кода.
Приведенные
рассуждения
основываются
на том, что
стандартные
загрузчики
(программы,
записываемые
операционной
системой в
загрузочные
сектора) реализуют
стандартные
алгоритмы
загрузки ОС
и оформляются
в соответствии
с ее стандартами.
Если же диски
отформатированы
утилитами, не
входящими в
состав DOS (Disk Manager), то
для обнаружения
в них вируса
следует проанализировать
алгоритм работы
и оформление
загрузчиков,
создаваемых
такой утилитой.
[2]
1.3. Обнаружение
файлового
вируса
Все вирусы
делятся на
резидентные
и нерезидентные.
Резидентные
вирусы отличаются
гораздо большим
коварством
и изощренностью,
чем нерезидентные.
Поэтому для
начала нужно
рассмотреть
простейший
случай — поражение
компьютера
неизвестным
нерезидентным
вирусом. Такой
вирус активизируется
при запуске
какой-либо
зараженной
программы,
совершает все,
что ему положено,
передает управление
программе-носителю
и в дальнейшем
(в отличие от
резидентных
вирусов) не
мешает ее работе.
Для обнаружения
такого вируса
необходимо
сравнить длины
файлов на винчестере
и в дистрибутивных
копиях. Если
это не поможет,
то следует
побайтно сравнить
дистрибутивные
копии с используемыми
программами.
Можно
также просмотреть
дамп выполняемых
файлов. В некоторых
случаях можно
сразу обнаружить
присутствие
вируса по наличию
в его коде текстовых
строк. Многие
вирусы, например,
содержат строки:
".СОМ", "*.СОМ",
".ЕХЕ", "*.ЕХЕ",
"*.*", "MZ", "COMMAND" и т.
д. Эти строки
часто встречаются
в начале или
в конце зараженных
файлов.
Существует
и еще один способ
визуального
определения
зараженного
вирусом файла.
Он основан на
том, что выполняемые
файлы, исходный
текст которых
написан на
языке высокого
уровня, имеют
вполне определенную
структуру. В
случае Borland или
Microsoft C/C++ сегмент
кода программы
находится в
начале файла,
а сразу за ним
— сегмент данных,
причем в начале
этого сегмента
стоит строка-копирайт
фирмы — изготовителя
компилятора.
Если в дампе
такого файла
за сегментом
данных следует
еще один участок
кода, то вполне
вероятно, что
файл заражен
вирусом.
То же
справедливо
и для большинства
вирусов, заражающих
файлы Windows. В выполняемых
файлах этой
ОС стандартным
является размещение
сегментов в
следующем
порядке: сегмент(ы)
кода, за ним
сегменты данных.
Если за сегментом
данных идет
еще один сегмент
кода, это также
может служить
сигналом о
присутствии
вируса.
Рекомендуется
запустить одну
из резидентных
антивирусных
программ-мониторов
и следить за
ее сообщениями
о подозрительных
действиях
программ (запись
в СОМ- или ЕХЕ-файлы,
запись на диск
по абсолютному
адресу и т. п.).
Существуют
мониторы, которые
не только
перехватывают
такие действия,
но и сообщают
адрес, откуда
поступил
подозрительный
вызов (к таким
мониторам
относится
AVPTSR.COM). Обнаружив
подобное сообщение,
следует выяснить,
от какой программы
оно пришло, и
проанализировать
ее коды при
помощи резидентного
дизассемблера
(например,
AVPUTIL.COM). При анализе
кодов программ,
резидентно
находящихся
в памяти, большую
помощь часто
оказывает
трассирование
прерываний
13h и 21h.
Следует
отметить, что
резидентные
DOS-мониторы часто
оказываются
бессильны, если
работа ведется
в DOS-окне под
Windows 95/NT, поскольку
Windows 95/NT позволяют
вирусу работать
в обход монитора
(как, впрочем,
и всех остальных
резидентных
программ).
DOS-мониторы
неспособны
остановить
также распространение
Windows-вирусов.
Рассмотренные
выше методы
обнаружения
файловых и
загрузочных
вирусов подходят
для большинства
как резидентных,
так и нерезидентных
вирусов. Однако
эти методы не
срабатывают,
если вирус
выполнен по
технологии
"Стелс", что
делает бесполезным
использование
большинства
резидентных
мониторов,
утилит сравнения
файлов и чтения
секторов. [2]
Приняв
во внимание
всё выше сказанное,
можно сделать
вывод о большой
ненадёжности
антивирусных
мониторов, как
средства защиты
от компьютерных
вирусов.
1.4. Выбор методов
построения
антивирусного
монитора
Передо
мной стоит
задача разработать
антивирусный
монитор под
операционную
систему Windows98. Первое,
что приходит
в голову при
анализе такой
задачи, - разработать
резидентную
программу,
перехватывающую
обращения к
диску и при
возникновении
вирусоподобной
ситуации генерирующую
исключение
[7], либо просто
предупреждение
пользователю.
Однако, написание
резидентной
программы под
Windows, это далеко
не простая
задача. Да и ко
всему прочему,
как оказалось,
вовсе не обязательно
перехватывать
и сканировать
все обращения
к диску, что
может вызывать
огромную массу
ложных срабатываний.
Альтернативным
способом в этой
ситуации является
регулярное
сканирование
файлов. Хотя,
конечно, это
отнимает намного
больше системных
ресурсов, чем
мониторинг
обращений к
диску, но что
если сканировать
не все .exe и .com файлы,
а лишь только
маленькую часть
из них. Дело в
том, что вирусы
«охотятся»
на любые исполняемые
файлы, а некоторые
изощренные
вирусы, могут,
например, «ловить»
только файлы,
размеры которого
лежат в приделах
от 40 до 300 Кб [2]. В этом
смысле, можно
легко выделить
группу файлов,
которая подходила
бы под запросы
любого вируса,
и размеры её
не превышали
бы 5-7 штук. Но ведь
совсем не обязательно
подставлять
под удар «своих»,
когда можно
создать заведомо
ненужную группу
и выставлять
её как бы «ловушкой»
для вируса, в
то время как
нужные файлы
были бы под
защитой.
Для защиты
«нужных» файлов
я предлагаю
использовать
разработанный
мною метод,
который я назвал
«Эксклюзив».
Его суть заключается
в том, что при
запуске приложения,
использующего
данный метод,
все выбранные
типы файлов
открываются
с правом доступа
к ним только
моего приложения.
Соответственно
ни вирус, ни
пользователь(по
желанию) не
смогут произвести
несанкционированные
действия.
2. Постановка
задачи на
проектирование
2.1. Метод ведения
мониторинга
вирусоподобных
ситуаций
Объекты
мониторинга:
Объектами
мониторинга
являются исполняемые
.exe и .com файлы, созданные
монитором для
фиксации действий
системы над
ними. Достаточным
в той или иной
мере для выявления
вирусоподобных
ситуаций, будем
считать следующее
подмножество
файлов:
Описание
метода:
При первом
запуске антивирусного
монитора, создаётся
вышеизложенное
подмножество
файлов-ловушек.
После этого,
контроль над
ними осуществляется
регулярно –
каждые 10 секунд.
В случае изменения
или удаления
одного из элементов
подмножества,
пользователь
системы получает
соответствующее
уведомление
о действиях
произведённых
над файлом, и
монитор восстанавливает
исходный файл.
В это же
время, по желанию,
пользователь
может защитить
все файлы компьютера
(кроме ловушек)
от возможной
модификации
или даже просмотра.
Или же защитить
только загрузочные
файлы системы
от изменения.
Преимущества
метода:
Простота
реализации.
Программно,
способ достаточно
лёгок и прозрачен.
Достоверность.
В отличие от
остальных
антивирусных
мониторов
ошибка второго
рода исключена.
Универсальность.
Данный антивирусный
монитор способен
выявлять действия
как Windows-вирусов,
так и DOS-вирусов,
ввиду своей
не привязанности
к особенностям
операционной
системы.
Недостатки
метода:
2.2. Метод защиты
файлов от
несанкционированного
использования,
изменения и
модификации
– «Эксклюзив».
Объекты
защиты:
Объектами
защиты «Эксклюзива»
могут быть
любые файлы
локального
компьютера,
попавшие в
«поле зрения»
приложения,
использующего
данный метод.
Множество
указанных
объектов защиты
изначально
определяется
пользователем
и всегда может
быть изменено.
Описание
метода:
«Эксклюзив»
представляет
собой способ
защиты объектов(файлов)
и, как следствие,
информации
находящейся
в указанных
объектах, от
порчи, подмены
или даже от
ознакомления
с нею злоумышленника.
Суть данного
метода заключается
в следующем.
Выбранные
защищаемые
файлы, помечаются
системой как
открытые на
эксклюзивное
использование
приложением
[7], использующим
«Эксклюзив».
Т.е. в файловой
системе указывается
служебная
информация
о непосредственном
владельце файла
(пользовательском
приложении).
В зависимости
от цели, пользователь
выбирает способ
доступа к файлам
других процессов,
определённый
на некотором
подмножестве(полный
доступ, закрыт
для любых операций,
закрыт для
чтения, закрыт
для записи)
[7]. Тем самым,
владельцем
программы,
обеспечивается
эксклюзивное
право владения
и определение
способа доступа
к защищаемым
объектам других
процессов.
Способы
применения:
Кроме
очевидной
функции, рассматриваемой
в контексте
данной разработки,
метод находит
широкое применение
в области защиты
информации,
в частности
для разграничения
доступа пользователей.
Преимущества
метода:
Минимальные
требования
к аппаратным
ресурсам
Стойкость
к обходу защиты
метода оцениваемая
уровнем стойкости
операционной
системы с одной
стороны и
приложения,
использующего
данный метод,
с другой [3].
Не ограниченное
множество
объектов защиты
Предельно
простая реализация
на уровне приложения
2.3. Методы построения
системы защиты
от несанкционированного
копирования
и использования
приложения
2.3.1. Метод фиксации
аппаратной
платформы
В дистрибутиве
программного
пакета, помимо
исполняемого
файла самого
антивирусного
монитора
«Amonit.exe», содержится
файл «Creator.exe», который
после первого
запуска приложения
удаляется. Но
перед своим
удалением, он
создаёт новый
«ini-файл», в котором
содержится
всего одно
слово – загаммированная
[5] дата производства
BIOS компьютера-носителя.
Этот файл не
доступен при
активированном
приложении,
но открыт в
противном
случае. Если
этот файл был
случайно удалён,
то без переустановки
программы,
открыть её не
удастся.
2.3.2. Метод шифровки
ключевой информации
В предложенном
варианте
антивирусного
монитора
предусмотрена
защита от
несанкционированного
снятия программы
с выполнения
– пароль. Он
хранится на
инсталляционной
дискете в файле
«pif.ini» в загаммированном
[5] виде. Легальный
пользователь
может всегда
задать или
изменить этот
пароль при
помощи специальной
программной
опции.
Изменить
пароль без
использования
программной
опции, т.е. методом
непосредственного
изменения файла
затруднительно,
поскольку от
этого предусмотрена
небольшая
защита. Дело
в том, что пустой
файл «pif.ini» не
означает пустой
пароль.
Программа
антивирусного
монитора – это
*.exe файл для Windows,
поэтому запуск
его на выполнение
порождает в
системе процесс
и он естественно
должен фиксироваться
в списке процессов
Windows [6]. Но это обстоятельство
делает программу
очень уязвимой
в плане того,
что её можно
снять с выполнения.
Для этого в
программе
предусмотрен
способ обхода
системной
регистрации
процесса и
другой пользователь
не в силах снять
этот процесс
не прибегая
к сторонним
разработкам.
3. Модель нарушителя
и системы защиты
4. Разработка
алгоритмов
для выбранных
методов решения
4.1. Метод защиты
файлов диска
«Эксклюзив»
4.2. Метод защиты
от копирования
программы
4.3. Гаммирование
5. Руководство
системного
программиста
по установке
комплекса
Запустить,
содержащийся
на инсталляционной
дискете,
самораспаковывающийся
архив.
Извлечь
содержимое
архива в нужную
папку.
Выполнить
файл «Amonit.exe». При
этом из папки
программы
удалится файл
«Creator.exe» и создастся
файл «dbpg.ini».
Не закрывайте
сразу программу,
через некоторое
время появятся
три пробные
ошибки, сигнализирующие
о том, что антивирусный
монитор установлен
и успешно
функционирует.
6. Организационные
требования
к эксплуатации
системы защиты
Выполняемость
комплекса.
Системный
администратор
обязан следить
за выполняемостью
комплекса при
каждой перезагрузке
операционной
системы, в противном
случае его
использование
теряет смысл.
Резервное
копирование.
В связи с не
высокой надёжностью
магнитных
носителей
(дискет), содержащих
ключевую информацию,
в целях сохранности
полной функциональности
комплекса,
необходимо
периодически
осуществлять
резервное
копирование
инсталляционной
дискеты.
Ограничение
доступа. Системный
администратор
обязан полностью
контролировать
доступ других
пользователей
к системе защиты
и пресекать
все попытки
несанкционированного
доступа.
Оптимизация
работы комплекса.
Для оптимальной
работы системы
защиты и, как
следствие,
операционной
системы в целом,
системный
администратор
должен периодически
пересматривать
набор средств
защиты.
Обзор литературных
источников
Фигурнов
В.Э. IBM PC
для пользователя
– М.: «ИНФРА-М»,
1995 г. – 432с.: ил.
CD –
500 Русских учебников.
Истории о вирусах.
М.: - НАВИГАТОР
2001 г.
Теоретические
основы компьютерной
безопасности.
Учебное пособие
для вузов. –
М.: Радио и связь
2000 – 189с.
Шамис
В.А. – «Borland C++ Builder 5 - Техника
визуального
программирования»:
Москва-2001
Чмора
А.Л. «Современная
прикладная
криптография»
2-е изд., стер. –
М.: Гелиос АРВ,
2002. – 256 с.: ил.
Борн Г.
Реестр Windows
98: Пер. с англ. –
СПб.:БХВ-Петербург,2003
г. – 496 с.: ил.
Архангельский
А.Я. – Программирование
в С++Builder 6 – М.: ЗАО
«Издательство
БИНОМ», 2002 г. –
1152 с.: ил.
Стефан
Р. Дэвис – «C++»
(4-е издание):
Москва – Санкт-Питербург
– Киев, 2001
Приложение
1
Листинг программы
Заголовочный
файл основной
формы (Unit1.h)
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include "cdiroutl.h"
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed
Components
TCDirectoryOutline
*CDirectoryOutline1;
TFileListBox
*FileListBox1;
TDriveComboBox
*DriveComboBox1;
TLabel *Label1;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TButton *Button5;
TButton *Button6;
TButton *Button7;
TTimer *Timer1;
TAnimate *Animate1;
TControlBar *ControlBar1;
TButton *Button8;
TButton *Button9;
void __fastcall
Button7Click(TObject *Sender);
void __fastcall
Button5Click(TObject *Sender);
void __fastcall
Button3Click(TObject *Sender);
void __fastcall
Button6Click(TObject *Sender);
void __fastcall
Button1Click(TObject *Sender);
void __fastcall
DriveComboBox1Change(TObject *Sender);
void __fastcall
Button2Click(TObject *Sender);
void __fastcall
Button4Click(TObject *Sender);
void __fastcall
Timer1Timer(TObject *Sender);
void __fastcall
Button8Click(TObject *Sender);
void __fastcall
Button9Click(TObject *Sender);
private: // User declarations
void __fastcall
OnClose(TWMClose& Message);
public: // User declarations
__fastcall
TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_CLOSE,
TWMClose, OnClose)
END_MESSAGE_MAP(TComponent)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
C++ файл основной
формы (Unit1.cpp)
#include
#pragma hdrstop
#include //
#include //
#include //
#include
//для эксклюзивного
доступа
#include
#include
#include
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit4.h"
#include "Unit5.h"
#include "Unit6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cdiroutl"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
String PathDir;
String
PathToTraps=ExtractFileDir(GetCommandLine()).c_str()+1;
TFScan *SecondProcess;
int trapshnd[3];
int hndsys[3];
int
M[2000];
//ограничение
числа открываемых
.EXE
файлов
int glob=0;
String ZashDrives="";
int ZashFiles=0;
int ZashFolders=0;
int ExeFiles=0;
int ComFiles=0;
String Gammirovanie(String
Stroka)
{
char
Gamma[5]={'G','A','M','M','A'};
String SodegjVvoda="";
char simvol;
for(int
s=1;s
{
if (s<=5)
{
simvol=Stroka[s];
if
(((int)Gamma[s-1]+(int)simvol)>=255)
{
simvol=((char)((int)simvol+(int)Gamma[s-1]-255));
SodegjVvoda=SodegjVvoda+String((char)((int)simvol));
}
else
{
SodegjVvoda=SodegjVvoda+String((char)((int)Gamma[s-1]+(int)simvol));
}
}
}
return SodegjVvoda;
}
//---------------------------------------------------------------------------
String OpenAndReadFile(String
FName)
{
String pas="";
String SoderjDiska="";
FILE *F;
F=fopen(FName.c_str(), "r");
if(FileExists(FName))
{
for(int
s=0;!feof(F);s++)
{
SoderjDiska=pas;
pas=pas+(char)(getc(F));
}
}
fclose(F);
return SoderjDiska;
}
//---------------------------------------------------------------------------
void OpenAndWriteFile(String
FName, String WordInFile)
{
String pas="";
String SoderjDiska="";
FILE *F;
F=fopen(FName.c_str(), "w");
if(FileExists(FName))
{
fputs(WordInFile.c_str(),F);
}
fclose(F);
}
//---------------------------------------------------------------------------
String DataBios(void)
{
String ItogData="";
unsigned char far * addr =
(unsigned char far *) 0xffff5;
for(int s=0;s<8;s++)
{
ItogData=ItogData+(char)*addr;
*addr++;
}
return ItogData;
}
//---------------------------------------------------------------------------
void StelsProgram(void)
//обеспечивает
скрытость
процесса от
регистрации
Windows
{
typedef DWORD (CALLBACK*
LPFNDLLFUNC1)(DWORD,DWORD);
HINSTANCE hdll;
LPFNDLLFUNC1 f1;
hdll =
LoadLibrary("Kernel32.dll");
f1 =
(LPFNDLLFUNC1)GetProcAddress(hdll,"RegisterServiceProcess");
(f1)(0,1);
}
//---------------------------------------------------------------------------
void CloseTraps(void)
{
FileClose(trapshnd[0]);
FileClose(trapshnd[1]);
FileClose(trapshnd[2]);
}
//---------------------------------------------------------------------------
String PathTrapsDir(String Tr)
{
PathDir =
PathToTraps+"\\Traps\\"+Tr;
return PathDir;
}
//---------------------------------------------------------------------------
void OpenTraps (void)
{
trapshnd[0]=FileOpen(PathTrapsDir("Trap1.exe"),
fmShareExclusive);
trapshnd[1]=FileOpen(PathTrapsDir("Trap2.exe"),
fmShareExclusive);
trapshnd[2]=FileOpen(PathTrapsDir("Trap3.exe"),
fmShareExclusive);
}
void
ExclusiveOpenAllExeAndComFilesOnDrive(void)
{
CloseTraps();
for(int j=1;
j<=Form1->CDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
ZashFolders++;
}
else
{
ZashFolders++;
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String vrem;
for(int i=0;
iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
String
Rassh=AnsiLowerCase(ExtractFileExt(Form1->FileListBox1->Items->Strings[i]));
if(Rassh==".exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareDenyWrite);
glob++;
ExeFiles++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i],
NULL);
}
else
if(Rassh==".com")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareDenyWrite);
glob++;
ComFiles++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i],
NULL);
}
else
if(Rassh==".bat")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareDenyWrite);
glob++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i],
NULL);
}
}
}
}
Form1->CDirectoryOutline1->Refresh();
}
//---------------------------------------------------------------------------
__fastcall
TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
WinExec("Creator.exe",SW_MAXIMIZE);
DeleteFile("Creator.exe");
String
DataBiosFileName="dbpg.ini";
if(FileExists(DataBiosFileName))
{
String
Itog=OpenAndReadFile(DataBiosFileName);
String
Itog1=Gammirovanie(DataBios());
if(Itog1!=Itog)
{
Application->MessageBoxA("Нелегальная
копия
программы!!!","Защита",MB_ICONSTOP);
exit(1);
}
else
{
Form1->CDirectoryOutline1->Items[1]->Collapse();
}
_sopen(DataBiosFileName.c_str(),O_RDONLY,SH_DENYRW);
//обеспечивает
экскл. доступ
к файлу
}
else
{
Application->MessageBoxA("Нарушение
целостности
программы!!!","Защита",MB_ICONSTOP);
exit(1);
}
StelsProgram();
CDirectoryOutline1->Items[1]->Collapse();
}
//---------------------------------------------------------------------------
void
SecuritySystemsBootFiles(void)
{
String
CmdCom="C:/Windows/Command.com";
String
CmdComOsn="C:/Command.com";
String
AutoExecBat="C:/AutoExec.bat";
hndsys[0]=FileOpen(CmdCom
,fmShareExclusive);
hndsys[1]=FileOpen(CmdComOsn
,fmShareExclusive);
hndsys[2]=FileOpen(AutoExecBat
,fmShareExclusive);
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button7Click(TObject *Sender)
{
Form4->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button5Click(TObject *Sender)
{
Form3->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button3Click(TObject *Sender)
{
Form2->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button6Click(TObject *Sender)
{
Form1->Hide();
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button1Click(TObject *Sender)
{
Form5->Visible=true;
ZashDrives=ZashDrives+"
"+DriveComboBox1->Drive;
Form4->Label8->Caption=ZashDrives;
ExclusiveOpenAllExeAndComFilesOnDrive();
OpenTraps();
ZashFiles=ComFiles+ExeFiles;
Form4->Label9->Caption=ZashFolders;
Form4->Label10->Caption=ZashFiles;
Form4->Label11->Caption=ExeFiles;
Form4->Label12->Caption=ComFiles;
Form5->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::DriveComboBox1Change(TObject *Sender)
{
CDirectoryOutline1->Drive=DriveComboBox1->Drive;
CDirectoryOutline1->Items[1]->Collapse();
CDirectoryOutline1->Items[1]->Expand();
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button2Click(TObject *Sender)
{
FileClose(hndsys[0]);
FileClose(hndsys[1]);
FileClose(hndsys[2]);
SecuritySystemsBootFiles();
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button4Click(TObject *Sender)
{
FileClose(hndsys[0]);
FileClose(hndsys[1]);
FileClose(hndsys[2]);
}
void __fastcall
TForm1::OnClose(TWMClose& a)
{
Form2->Visible=true;
}
//---------------------------------------------------------------------------
void CloseTimer(void)
{
Form1->Timer1->Enabled=false;
}
//---------------------------------------------------------------------------
void OpenTimer(void)
{
Form1->Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Timer1Timer(TObject *Sender)
{
SecondProcess = new TFScan(true);
SecondProcess->Resume();
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button8Click(TObject *Sender)
{
Form5->Visible=true;
for(int j=1;
j<=Form1->CDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String vrem;
for(int i=0;
iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareDenyWrite);
}
}
}
Form1->CDirectoryOutline1->Refresh();
Form5->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button9Click(TObject *Sender)
{
Form5->Visible=true;
for(int j=1;
j<=Form1->CDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String vrem;
for(int i=0;
iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareExclusive);
}
}
}
Form1->CDirectoryOutline1->Refresh();
Form5->Visible=false;
}
//---------------------------------------------------------------------------
C++ файл формы
парольного
окна (Unit2.cpp)
#include
#pragma hdrstop
#include "Unit1.cpp"
#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall
TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall
TForm2::Button1Click(TObject *Sender)
{
String
Itog1=Gammirovanie(Edit1->Text)+"m";
String
Itog=OpenAndReadFile("A:/Прога/pif.ini");
Edit1->Text="";
if(Itog!=Itog1)
{
Application->MessageBoxA("Не
верный
пароль!!!","Защита",MB_ICONSTOP);
Form2->Close();
}
else
{
for(int i=0; i
{
FileClose(M[glob]);
}
exit(1);
}
}
//---------------------------------------------------------------------------
void __fastcall
TForm2::Button2Click(TObject *Sender)
{
Form2->Close();
}
//---------------------------------------------------------------------------
C++ файл формы
окна изменения
пароля (Unit3.cpp)
#include
#pragma hdrstop
#include "Unit1.cpp"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
String GamOldPass="";
String GamNuwPass="";
String SaveGamPass="";
__fastcall
TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall
TForm3::Button1Click(TObject *Sender)
{
GamOldPass=Gammirovanie(Edit1->Text)+"m";
SaveGamPass=OpenAndReadFile("A:/Прога/pif.ini");
if(GamOldPass==SaveGamPass)
{
if(Edit2->Text==Edit3->Text)
{
GamNuwPass=Gammirovanie(Edit2->Text)+"m";
OpenAndWriteFile("A:/Прога/pif.ini",GamNuwPass);
Form3->Close();
}
else
{
Application->MessageBoxA("Введены
разные
пароли!!!","Отмена
операции",MB_ICONSTOP);
}
}
else
{
Application->MessageBoxA("Введён
не
верный
действующий
пароль!!!","Защита",MB_ICONSTOP);
}
}
//---------------------------------------------------------------------------
void __fastcall
TForm3::Button2Click(TObject *Sender)
{
Form3->Close();
}
//---------------------------------------------------------------------------
C++ файл
параллельной
нити (Unit6.cpp)
#include
#pragma hdrstop
#include "Unit1.cpp"
#include "Unit6.h"
#include "Unit1.h"
#pragma package(smart_init)
void Zapolnenie(String
FName1,String FName2)
{
FILE *F1;
FILE *F2;
F1=fopen(FName1.c_str(), "rb");
F2=fopen(FName2.c_str(), "wb");
for(int
s=0;s
{
putc(getc(F1),F2);
}
fclose(F1);
fclose(F2);
}
//----------------------------------------------------------------------
void Proverka(String
FName1,String FName2)
{
FILE *F1;
FILE *F2;
F1=fopen(FName1.c_str(), "rb");
F2=fopen(FName2.c_str(), "rb");
if(F1!=NULL)
{
if(F2!=NULL)
{
int
LengthTrap1=filelength(_fileno(F1));
int
LengthTrap2=filelength(_fileno(F1));
if(LengthTrap1!=LengthTrap2)
{
Application->MessageBoxA("Внимание!!!
Произошла
перезапись
.EXE или .COM файла!","Извещение!",MB_ICONSTOP);
fclose(F1);
fclose(F2);
Zapolnenie(FName1,FName2);
}
else
{
for(int
j=0;j
{
if(getc(F1)!=getc(F2))
{
fclose(F1);
fclose(F2);
Zapolnenie(FName1,FName2);
Application->MessageBoxA("Внимание!!!
Произошла
запись
в
.EXE или
.COM файл!","Извещение!",MB_ICONSTOP);
j=LengthTrap1;
}
}
}
}
else
{
if(!FileExists(FName2))
{
int DelFileHnd=0;
DelFileHnd=FileCreate(FName2);
FileClose(DelFileHnd);
fclose(F1);
fclose(F2);
Zapolnenie(FName1,FName2);
Application->MessageBoxA("Внимание!!!
Была
предпринята
попытка удалить
файл!!!","Извещение!",MB_ICONSTOP);
}
}
}
else
{
Application->MessageBoxA("Не
удаётся открыть
программный
файл!!!","Ошибка",MB_ICONSTOP);
exit(1);
}
fclose(F1);
fclose(F2);
}
//----------------------------------------------------------------------
__fastcall TFScan::TFScan(bool
CreateSuspended)
:
TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TFScan::Execute()
{
CloseTimer();
CloseTraps();
Proverka(PathTrapsDir("Trap1.exe"),"C:\\Windows\\Trap1.exe");
Proverka(PathTrapsDir("Trap2.exe"),"C:\\Windows\\Trap2.exe");
Proverka(PathTrapsDir("Trap3.exe"),"C:\\Trap3.exe");
OpenTraps();
OpenTimer();
}
//---------------------------------------------------------------------------
C++ файл
тестирующего
приложения
(Вирус.cpp)
#include
#include
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall
TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button1Click(TObject *Sender)
{
FILE *F;
if(F=fopen(Edit1->Text.c_str(),
"w+b"))
{
fprintf(F,"\t This is
virus!!!");
fclose(F);
}
else
{
String t="Нет
доступа к файлу
"+ExtractFileName(Edit1->Text)+"!!!";
Application->MessageBoxA(t.c_str(),"***Ошибка***",MB_ICONSTOP);
}
}
//---------------------------------------------------------------------------
void __fastcall
TForm1::Button2Click(TObject *Sender)
{
OpenDialog1->Execute();
Edit1->Text=OpenDialog1->FileName;
}
С++ файл инсталляционного
файла Creator.cpp
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#include
#pragma hdrstop
#include
#include
#include
//---------------------------------------------------------------------------
String Gammirovanie(String
Stroka)
{
char
Gamma[5]={'G','A','M','M','A'};
String SodegjVvoda="";
char simvol;
for(int
s=1;s
{
if (s<=5)
{
simvol=Stroka[s];
if
(((int)Gamma[s-1]+(int)simvol)>=255)
{
simvol=((char)((int)simvol+(int)Gamma[s-1]-255));
SodegjVvoda=SodegjVvoda+String((char)((int)simvol));
}
else
{
SodegjVvoda=SodegjVvoda+String((char)((int)Gamma[s-1]+(int)simvol));
}
}
}
return SodegjVvoda;
}
//---------------------------------------------------------------------------
int main (void)
{
String DataBios="";
unsigned char far * addr =
(unsigned char far *) 0xffff5;
for(int s=0;s<8;s++)
{
DataBios=DataBios+(char)*addr;
*addr++;
}
String
Itog=Gammirovanie(DataBios);
String
DataBiosFileName="dbpg.ini";
FILE *F;
F=fopen(DataBiosFileName.c_str(),
"w");
fputs(Itog.c_str(),F);
fclose(F);
}
Приложение
2
Список глобальных
переменных
String
PathDir //Содержит
текущую директорию
String
PathToTraps //Содержит
путь к файлу
“Amonit.exe”
TFScan
*SecondProcess //Указатель
на параллельную
нить приложения
int
trapshnd[3] //Массив
дескрипторов
файлов-закладок
int
hndsys[3] //Массив
дескрипторов
системных
файлов
int
M[2000] //Массив
дескрипторов
.EXE файлов
int
glob //Текущий
элемент массива
М
String
ZashDrives //Содержит
название диска
для защиты
int
ZashFiles //Индикатор
количества
защищённых
файлов
int
ZashFolders //Индикатор
кол-ва защищённых
каталогов
int
ExeFiles //Количество
защищённых
*.EXE файлов
int
ComFiles //Количество
защищённых
*.COM файлов
String
GamOldPass //Загаммированный
старый пароль
String
GamNuwPass //Загаммированный
новый пароль
String
SaveGamPass //Сохранённый
загаммированный
пароль
Приложение
3
Описание основных
функций
String
Gammirovanie(String
Stroka)// Шифрует
входное слово
при помощи
гаммы и возвращает
результат
char
Gamma[5]={'G','A','M','M','A'} //Массив
символов, содержащий
гамму
String
SodegjVvoda //Переменная
накапливающая
итоговое слово
char simvol //Текущий
загаммированный
символ
String
OpenAndReadFile(String FName)//Возвращает
слово из
файла
String FName //Имя
файла
String pas //Слово
из файла
String
SoderjDiska //Слово
из файла
void
OpenAndWriteFile(String
FName, String
WordInFile)//Заносит
в файл FName
слово WordInFile
String pas //Слово
из файла
String SoderjDiska //Слово
из файла
String
DataBios(void)//Возвращает
первые 5 символов
даты создания
BIOS
String ItogData //Содержит
дату BIOS
unsigned char far *
addr //Указатель
на адрес
BIOS
void
StelsProgram(void)//Обеспечивает
скрытость
процесса от
регистрации
Windows
void
CloseTraps(void)//Закрывает
файлы ловушки
String
PathTrapsDir(String
Tr)//Возвращает
путь к оригиналам
ловушек
void
OpenTraps (void)//Открывает
файлы ловушки
void
ExclusiveOpenAllExeAndComFilesOnDrive(void)//Открывает
все исполняемые
файлы указанного
в DriveComboBox1 диска
с эксклюзивными
правами доступа
String vrem //Текущий
файл списка
FileListBox1
void
SecuritySystemsBootFiles(void)//Открывает
системные
загрузочные
файлы с эксклюзивными
правами доступа
void
__fastcall TForm1::OnClose(TWMClose&
a)//Собственный
обработчик
закрытия окна
приложения.
При попытке
закрыть окно
возникает окно
ввода пароля.
void
__fastcall TForm1::Timer1Timer(TObject *Sender)//Обработчик
активации
таймера.
Его выполнение
происходит
каждые 10 секунд.
Этот обработчик
вызывает выполнение
параллельной
нити процесса
приложения.
void
__fastcall TForm1::Button8Click(TObject
*Sender)//Открывает
все файлы диска
с эксклюзивным
правом доступа
приложения.
Другие процессы
могут только
читать файл.
void
__fastcall TForm1::Button9Click(TObject
*Sender) void
__fastcall TForm1::Button9Click(TObject
*Sender) )//Открывает
все файлы диска
с эксклюзивным
правом доступа
приложения.
Другие процессы
не могут использовать
файл.
String vrem //Текущий
файл списка
FileListBox1
Приложение
1: Листинг программы
Заголовочный
файл основной
формы (Unit1.h):
#ifndef
Unit1H
#define
Unit1H
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
"cdiroutl.h"
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
class
TForm1 : public TForm
{
__published: //
IDE-managed Components
TCDirectoryOutline
*CDirectoryOutline1;
TFileListBox *FileListBox1;
TDriveComboBox *DriveComboBox1;
TLabel *Label1;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TButton *Button5;
TButton *Button6;
TButton *Button7;
TTimer *Timer1;
TAnimate *Animate1;
TControlBar *ControlBar1;
TButton *Button8;
TButton *Button9;
void __fastcall
Button7Click(TObject *Sender);
void __fastcall
Button5Click(TObject *Sender);
void __fastcall
Button3Click(TObject *Sender);
void __fastcall
Button6Click(TObject *Sender);
void __fastcall
Button1Click(TObject *Sender);
void __fastcall
DriveComboBox1Change(TObject *Sender);
void __fastcall
Button2Click(TObject *Sender);
void __fastcall
Button4Click(TObject *Sender);
void __fastcall
Timer1Timer(TObject *Sender);
void __fastcall
Button8Click(TObject *Sender);
void __fastcall
Button9Click(TObject *Sender);
private: //
User declarations
void __fastcall OnClose(TWMClose&
Message);
public: //
User declarations
__fastcall TForm1(TComponent*
Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_CLOSE,
TWMClose, OnClose)
END_MESSAGE_MAP(TComponent)
};
//---------------------------------------------------------------------------
extern
PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
C++ файл основной
формы (Unit1.cpp)
#include
#pragma
hdrstop
#include
//
#include
//
#include
//
#include
//для эксклюзивного
доступа
#include
#include
#include
#include
"Unit1.h"
#include
"Unit2.h"
#include
"Unit3.h"
#include
"Unit4.h"
#include
"Unit5.h"
#include
"Unit6.h"
//---------------------------------------------------------------------------
#pragma
package(smart_init)
#pragma
link "cdiroutl"
#pragma
resource "*.dfm"
TForm1
*Form1;
//---------------------------------------------------------------------------
String
PathDir;
String
PathToTraps=ExtractFileDir(GetCommandLine()).c_str()+1;
TFScan
*SecondProcess;
int
trapshnd[3];
int
hndsys[3];
int
M[2000];
//ограничение
числа открываемых
.EXE
файлов
int
glob=0;
String
ZashDrives="";
int
ZashFiles=0;
int
ZashFolders=0;
int
ExeFiles=0;
int
ComFiles=0;
String
Gammirovanie(String Stroka)
{
char
Gamma[5]={'G','A','M','M','A'};
String
SodegjVvoda="";
char simvol;
for(int s=1;s
{
if (s<=5)
{
simvol=Stroka[s];
if
(((int)Gamma[s-1]+(int)simvol)>=255)
{
simvol=((char)((int)simvol+(int)Gamma[s-1]-255));
SodegjVvoda=SodegjVvoda+String((char)((int)simvol));
}
else
{
SodegjVvoda=SodegjVvoda+String((char)((int)Gamma[s-1]+(int)simvol));
}
}
}
return
SodegjVvoda;
}
//---------------------------------------------------------------------------
String
OpenAndReadFile(String FName)
{
String
pas="";
String
SoderjDiska="";
FILE
*F;
F=fopen(FName.c_str(),
"r");
if(FileExists(FName))
{
for(int s=0;!feof(F);s++)
{
SoderjDiska=pas;
pas=pas+(char)(getc(F));
}
}
fclose(F);
return
SoderjDiska;
}
//---------------------------------------------------------------------------
void
OpenAndWriteFile(String FName, String WordInFile)
{
String
pas="";
String
SoderjDiska="";
FILE
*F;
F=fopen(FName.c_str(),
"w");
if(FileExists(FName))
{
fputs(WordInFile.c_str(),F);
}
fclose(F);
}
//---------------------------------------------------------------------------
String
DataBios(void)
{
String
ItogData="";
unsigned
char far * addr = (unsigned char far *) 0xffff5;
for(int s=0;s<8;s++)
{
ItogData=ItogData+(char)*addr;
*addr++;
}
return
ItogData;
}
//---------------------------------------------------------------------------
void
StelsProgram(void) //обеспечивает
скрытость
процесса от
регистрации
Windows
{
typedef
DWORD (CALLBACK* LPFNDLLFUNC1)(DWORD,DWORD);
HINSTANCE
hdll;
LPFNDLLFUNC1
f1;
hdll
= LoadLibrary("Kernel32.dll");
f1
= (LPFNDLLFUNC1)GetProcAddress(hdll,"RegisterServiceProcess");
(f1)(0,1);
}
//---------------------------------------------------------------------------
void
CloseTraps(void)
{
FileClose(trapshnd[0]);
FileClose(trapshnd[1]);
FileClose(trapshnd[2]);
}
//---------------------------------------------------------------------------
String
PathTrapsDir(String Tr)
{
PathDir
= PathToTraps+"\\Traps\\"+Tr;
return
PathDir;
}
//---------------------------------------------------------------------------
void
OpenTraps (void)
{
trapshnd[0]=FileOpen(PathTrapsDir("Trap1.exe"),
fmShareExclusive);
trapshnd[1]=FileOpen(PathTrapsDir("Trap2.exe"),
fmShareExclusive);
trapshnd[2]=FileOpen(PathTrapsDir("Trap3.exe"),
fmShareExclusive);
}
//---------------------------------------------------------------------------
void
ExclusiveOpenAllExeAndComFilesOnDrive(void)
{
CloseTraps();
for(int
j=1; j<=Form1->CDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
ZashFolders++;
}
else
{
ZashFolders++;
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String
vrem;
for(int i=0;
iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
String
Rassh=AnsiLowerCase(ExtractFileExt(Form1->FileListBox1->Items->Strings[i]));
if(Rassh==".exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareDenyWrite);
glob++;
ExeFiles++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i],
NULL);
}
else if(Rassh==".com")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareDenyWrite);
glob++;
ComFiles++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i],
NULL);
}
else if(Rassh==".bat")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareDenyWrite);
glob++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i],
NULL);
}
}
}
}
Form1->CDirectoryOutline1->Refresh();
}
//---------------------------------------------------------------------------
__fastcall
TForm1::TForm1(TComponent* Owner)
:
TForm(Owner)
{
WinExec("Creator.exe",SW_MAXIMIZE);
DeleteFile("Creator.exe");
String
DataBiosFileName="dbpg.ini";
if(FileExists(DataBiosFileName))
{
String
Itog=OpenAndReadFile(DataBiosFileName);
String
Itog1=Gammirovanie(DataBios());
if(Itog1!=Itog)
{
Application->MessageBoxA("Нелегальная
копия
программы!!!","Защита",MB_ICONSTOP);
exit(1);
}
else
{
Form1->CDirectoryOutline1->Items[1]->Collapse();
}
_sopen(DataBiosFileName.c_str(),O_RDONLY,SH_DENYRW);
//обеспечивает
экскл. доступ
к файлу
}
else
{
Application->MessageBoxA("Нарушение
целостности
программы!!!","Защита",MB_ICONSTOP);
exit(1);
}
StelsProgram();
CDirectoryOutline1->Items[1]->Collapse();
}
//---------------------------------------------------------------------------
void
SecuritySystemsBootFiles(void)
{
String
CmdCom="C:/Windows/Command.com";
String
CmdComOsn="C:/Command.com";
String
AutoExecBat="C:/AutoExec.bat";
hndsys[0]=FileOpen(CmdCom
,fmShareExclusive);
hndsys[1]=FileOpen(CmdComOsn
,fmShareExclusive);
hndsys[2]=FileOpen(AutoExecBat
,fmShareExclusive);
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button7Click(TObject *Sender)
{
Form4->Visible=true;
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button5Click(TObject *Sender)
{
Form3->Visible=true;
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button3Click(TObject *Sender)
{
Form2->Visible=true;
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button6Click(TObject *Sender)
{
Form1->Hide();
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button1Click(TObject *Sender)
{
Form5->Visible=true;
ZashDrives=ZashDrives+"
"+DriveComboBox1->Drive;
Form4->Label8->Caption=ZashDrives;
ExclusiveOpenAllExeAndComFilesOnDrive();
OpenTraps();
ZashFiles=ComFiles+ExeFiles;
Form4->Label9->Caption=ZashFolders;
Form4->Label10->Caption=ZashFiles;
Form4->Label11->Caption=ExeFiles;
Form4->Label12->Caption=ComFiles;
Form5->Visible=false;
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::DriveComboBox1Change(TObject *Sender)
{
CDirectoryOutline1->Drive=DriveComboBox1->Drive;
CDirectoryOutline1->Items[1]->Collapse();
CDirectoryOutline1->Items[1]->Expand();
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button2Click(TObject *Sender)
{
FileClose(hndsys[0]);
FileClose(hndsys[1]);
FileClose(hndsys[2]);
SecuritySystemsBootFiles();
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button4Click(TObject *Sender)
{
FileClose(hndsys[0]);
FileClose(hndsys[1]);
FileClose(hndsys[2]);
}
void
__fastcall TForm1::OnClose(TWMClose& a)
{
Form2->Visible=true;
}
//---------------------------------------------------------------------------
void
CloseTimer(void)
{
Form1->Timer1->Enabled=false;
}
//---------------------------------------------------------------------------
void
OpenTimer(void)
{
Form1->Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Timer1Timer(TObject *Sender)
{
SecondProcess
= new TFScan(true);
SecondProcess->Resume();
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button8Click(TObject *Sender)
{
Form5->Visible=true;
for(int
j=1; j<=Form1->CDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String
vrem;
for(int i=0;
iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareDenyWrite);
}
}
}
Form1->CDirectoryOutline1->Refresh();
Form5->Visible=false;
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button9Click(TObject *Sender)
{
Form5->Visible=true;
for(int
j=1; j<=Form1->CDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String
vrem;
for(int i=0;
iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i]
,fmShareExclusive);
}
}
}
Form1->CDirectoryOutline1->Refresh();
Form5->Visible=false;
}
//---------------------------------------------------------------------------
C++ файл формы
парольного
окна (Unit2.cpp)
#include
#pragma
hdrstop
#include
"Unit1.cpp"
#include
"Unit2.h"
#include
"Unit1.h"
//---------------------------------------------------------------------------
#pragma
package(smart_init)
#pragma
resource "*.dfm"
TForm2
*Form2;
//---------------------------------------------------------------------------
__fastcall
TForm2::TForm2(TComponent* Owner)
:
TForm(Owner)
{
}
//---------------------------------------------------------------------------
void
__fastcall TForm2::Button1Click(TObject *Sender)
{
String
Itog1=Gammirovanie(Edit1->Text)+"m";
String
Itog=OpenAndReadFile("A:/Прога/pif.ini");
Edit1->Text="";
if(Itog!=Itog1)
{
Application->MessageBoxA("Не
верный
пароль!!!","Защита",MB_ICONSTOP);
Form2->Close();
}
else
{
for(int i=0; i
{
FileClose(M[glob]);
}
exit(1);
}
}
//---------------------------------------------------------------------------
void
__fastcall TForm2::Button2Click(TObject *Sender)
{
Form2->Close();
}
//---------------------------------------------------------------------------
C++ файл формы
окна изменения
пароля (Unit3.cpp)
#include
#pragma
hdrstop
#include
"Unit1.cpp"
#include
"Unit3.h"
//---------------------------------------------------------------------------
#pragma
package(smart_init)
#pragma
resource "*.dfm"
TForm3
*Form3;
//---------------------------------------------------------------------------
String
GamOldPass="";
String
GamNuwPass="";
String
SaveGamPass="";
__fastcall
TForm3::TForm3(TComponent* Owner)
:
TForm(Owner)
{
}
//---------------------------------------------------------------------------
void
__fastcall TForm3::Button1Click(TObject *Sender)
{
GamOldPass=Gammirovanie(Edit1->Text)+"m";
SaveGamPass=OpenAndReadFile("A:/Прога/pif.ini");
if(GamOldPass==SaveGamPass)
{
if(Edit2->Text==Edit3->Text)
{
GamNuwPass=Gammirovanie(Edit2->Text)+"m";
OpenAndWriteFile("A:/Прога/pif.ini",GamNuwPass);
Form3->Close();
}
else
{
Application->MessageBoxA("Введены
разные
пароли!!!","Отмена
операции",MB_ICONSTOP);
}
}
else
{
Application->MessageBoxA("Введён
не
верный
действующий
пароль!!!","Защита",MB_ICONSTOP);
}
}
//---------------------------------------------------------------------------
void
__fastcall TForm3::Button2Click(TObject *Sender)
{
Form3->Close();
}
//---------------------------------------------------------------------------
C++ файл
параллельной
нити (Unit6.cpp)
#include
#pragma
hdrstop
#include
"Unit1.cpp"
#include
"Unit6.h"
#include
"Unit1.h"
#pragma
package(smart_init)
void
Zapolnenie(String FName1,String FName2)
{
FILE
*F1;
FILE
*F2;
F1=fopen(FName1.c_str(),
"rb");
F2=fopen(FName2.c_str(),
"wb");
for(int
s=0;s
{
putc(getc(F1),F2);
}
fclose(F1);
fclose(F2);
}
//----------------------------------------------------------------------
void
Proverka(String FName1,String FName2)
{
//if(!FileExists(FName2))
//{
//Application->MessageBoxA("Не
могу
выложить
закладки!!!
Диск
С: отсутствует
или защищён
от записи!!!","Ошибка",MB_ICONSTOP);
//}
//if(!FileExists(FName1))
//{
//Application->MessageBoxA("Программный
файл не
найден!!!","Ошибка",MB_ICONSTOP);
//exit(1);
//}
FILE
*F1;
FILE
*F2;
F1=fopen(FName1.c_str(),
"rb");
F2=fopen(FName2.c_str(),
"rb");
if(F1!=NULL)
{
if(F2!=NULL)
{
int
LengthTrap1=filelength(_fileno(F1));
int
LengthTrap2=filelength(_fileno(F1));
if(LengthTrap1!=LengthTrap2)
{
Application->MessageBoxA("Внимание!!!
Произошла
перезапись
.EXE или .COM файла!","Извещение!",MB_ICONSTOP);
fclose(F1);
fclose(F2);
Zapolnenie(FName1,FName2);
}
else
{
for(int
j=0;j
{
if(getc(F1)!=getc(F2))
{
fclose(F1);
fclose(F2);
Zapolnenie(FName1,FName2);
Application->MessageBoxA("Внимание!!!
Произошла
запись
в
.EXE или
.COM файл!","Извещение!",MB_ICONSTOP);
j=LengthTrap1;
}
}
}
}
else
{
if(!FileExists(FName2))
{
int DelFileHnd=0;
DelFileHnd=FileCreate(FName2);
FileClose(DelFileHnd);
fclose(F1);
fclose(F2);
Zapolnenie(FName1,FName2);
Application->MessageBoxA("Внимание!!!
Была предпринята
попытка удалить
файл!!!","Извещение!",MB_ICONSTOP);
}
}
}
else
{
Application->MessageBoxA("Не
удаётся открыть
программный
файл!!!","Ошибка",MB_ICONSTOP);
exit(1);
}
fclose(F1);
fclose(F2);
}
//----------------------------------------------------------------------
__fastcall
TFScan::TFScan(bool CreateSuspended)
:
TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void
__fastcall TFScan::Execute()
{
CloseTimer();
CloseTraps();
Proverka(PathTrapsDir("Trap1.exe"),"C:\\Windows\\Trap1.exe");
Proverka(PathTrapsDir("Trap2.exe"),"C:\\Windows\\Trap2.exe");
Proverka(PathTrapsDir("Trap3.exe"),"C:\\Trap3.exe");
OpenTraps();
OpenTimer();
}
//---------------------------------------------------------------------------
C++ файл
тестирующего
приложения
(Вирус.cpp)
#include
#include
#include
#pragma
hdrstop
#include
"Unit1.h"
//---------------------------------------------------------------------------
#pragma
package(smart_init)
#pragma
resource "*.dfm"
TForm1
*Form1;
//---------------------------------------------------------------------------
__fastcall
TForm1::TForm1(TComponent* Owner)
:
TForm(Owner)
{
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button1Click(TObject *Sender)
{
FILE
*F;
if(F=fopen(Edit1->Text.c_str(),
"w+b"))
{
fprintf(F,"\t
This is virus!!!");
fclose(F);
}
else
{
String
t="Нет доступа
к файлу
"+ExtractFileName(Edit1->Text)+"!!!";
Application->MessageBoxA(t.c_str(),"***Ошибка***",MB_ICONSTOP);
}
}
//---------------------------------------------------------------------------
void
__fastcall TForm1::Button2Click(TObject *Sender)
{
OpenDialog1->Execute();
Edit1->Text=OpenDialog1->FileName;
}
Creator.cpp
#pragma
hdrstop
#include
"Unit1.h"
//---------------------------------------------------------------------------
#pragma
package(smart_init)
#include
#pragma
hdrstop
#include
#include
#include
//---------------------------------------------------------------------------
String
Gammirovanie(String Stroka)
{
char
Gamma[5]={'G','A','M','M','A'};
String
SodegjVvoda="";
char
simvol;
for(int s=1;s
{
if (s<=5)
{
simvol=Stroka[s];
if
(((int)Gamma[s-1]+(int)simvol)>=255)
{
simvol=((char)((int)simvol+(int)Gamma[s-1]-255));
SodegjVvoda=SodegjVvoda+String((char)((int)simvol));
}
else
{
SodegjVvoda=SodegjVvoda+String((char)((int)Gamma[s-1]+(int)simvol));
}
}
}
return
SodegjVvoda;
}
//---------------------------------------------------------------------------
int
main (void)
{
String
DataBios="";
unsigned
char far * addr = (unsigned char far *) 0xffff5;
for(int s=0;s<8;s++)
{
DataBios=DataBios+(char)*addr;
*addr++;
}
String
Itog=Gammirovanie(DataBios);
String
DataBiosFileName="dbpg.ini";
FILE
*F;
F=fopen(DataBiosFileName.c_str(),
"w");
fputs(Itog.c_str(),F);
fclose(F);
}
Модель нарушителя
и системы защиты
…ФАЙЛЫ…
закладки
документы
и документы
и
программы программы
закрыто закрыто
файловая система
…ЛОГИЧЕСКИЕ
ДИСКИ…
Попытка
доступа к файлам
диска
Открытие
файлов
с
эксклюзивным
доступом
процесса
системы защиты
Процесс
системы защиты Процесс
нарушителя
Проверка
Основная
Исполняемая
закладок
нить программа
попытка
изменения
файла
Министерство
образования
РФ
Тульский
государственный
университет
Кафедра
ЭВМ
Защита
системного
программного
обеспечения
Курсовая
работа
Антивирусный
монитор
Выполнил
студент
гр.230901 /Трутнев
Е.В./
Проверил:
/Савин Н.И./
Тула
2003
Оглавление
Обзор литературных
источников……………………………………………………………6
1. Анализ
существующих
вариантов
решения задачи
и выбор наиболее
приемлемого...7
1.1. Антивирусные
мониторы………………………………………………………..7
1.2. Обнаружение
загрузочного
вируса……………………………………………..8
1.3. Обнаружение
файлового
вируса………………………………………………..
9
1.4. Выбор методов
построения
антивирусного
монитора………………………...11
2.
Постановка
задачи на
проектирование…………………………………………………...12
2.1. Метод ведения
мониторинга
вирусоподобных
ситуаций……………………..12
2.2. Метод защиты
файлов от
несанкционированного
использования,
изменения и
модификации
– «Эксклюзив»………………………………………………………..13
2.3. Методы
построения
системы защиты
от несанкционированного
копирования
и использования
приложения………………………………………………………..15
2.3.1. Метод фиксации
аппаратной
платформы…………………………………….15
2.3.2. Метод
шифровки ключевой
информации…………………………………….15
3.
Модель нарушителя
и системы
защиты………………………………………………….16
4.
Разработка
алгоритмов
для выбранных
методов решения
……………………………..17
4.1. Метод защиты
файлов диска
«Эксклюзив»………………………………………..17
4.2. Метод защиты
от копирования
программы………………………………………..18
4.3. Гаммирование………………………………………………………………………..19
5.
Руководство
системного
программиста
по установке
комплекса……………………...20
6.
Организационные
требования
к эксплуатации
системы защиты………………………20
Приложение:
Листинг программы
Обзор литературных
источников
Архангельский
А.Я. – Программирование
в С++Builder 6 – М.: ЗАО
«Издательство
БИНОМ», 2002 г. –
1152 с.: ил.
Теоретические
основы компьютерной
безопасности.
Учебное пособие
для вузов. –
М.: Радио и связь
2000 – 189с.
В.А.
Шамис – «Borland
C++
Builder
5 - Техника визуального
программирования»:
Москва-2001
Стефан
Р. Дэвис – «C++»(4-е
издание): Москва
– Санкт-Питербург
– Киев, 2001
1. Анализ
существующих
вариантов
решения задачи
и выбор наиболее
приемлемого.
1.1. Антивирусные
мониторы.
Антивирусные
мониторы — это
резидентные
программы,
перехватывающие
вирусоопасные
ситуации и
сообщающие
об этом пользователю.
К вирусоопасным
относятся
вызовы на открытие
для записи в
выполняемые
файлы, запись
в загрузочные
секторы дисков
или MBR винчестера,
попытки программ
остаться резидентно
и т. д., то есть
вызовы, которые
характерны
для вирусов
в моменты их
размножения.
К достоинствам
мониторов
относится их
способность
обнаруживать
и блокировать
вирус на самой
ранней стадии
его размножения,
что, кстати,
бывает очень
полезно в случаях,
когда давно
известный вирус
постоянно
"выползает
неизвестно
откуда". К недостаткам
относятся
существование
путей обхода
защиты монитора
и большое количество
ложных срабатываний,
что, видимо, и
послужило
причиной для
практически
полного отказа
пользователей
от подобного
рода антивирусных
программ (мне,
например, неизвестно
ни об одном
мониторе для
Windows 95/NT — нет спроса,
нет и предложения).
Необходимо
также отметить
такое направление
антивирусных
средств, как
антивирусные
мониторы, выполненные
в виде аппаратных
компонентов
компьютера
("железа"). Наиболее
распространенной
является встроенная
в BIOS защита от
записи в MBR винчестера.
Однако, как и
в случае с
программными
мониторами,
такую защиту
легко обойти
прямой записью
в порты контроллера
диска, а запуск
DOS-утилиты FDISK
немедленно
вызывает ложное
срабатывание
защиты.
Существует
несколько более
универсальных
аппаратных
мониторов, но
к перечисленным
выше недостаткам
добавляются
также проблемы
совместимости
со стандартными
конфигурациями
компьютеров
и сложности
при их установке
и настройке.
Все это делает
мониторы крайне
непопулярными
на фоне остальных
типов антивирусной
защиты.
1.2. Обнаружение
загрузочного
вируса
В загрузочных
секторах дисков
расположены,
как правило,
небольшие
программы,
назначение
которых состоит
в определении
размеров и
границ логических
дисков (для MBR
винчестера)
или загрузке
ОС (для загрузочного
сектора).
Вначале
следует проверить
содержимое
сектора, подозрительного
на наличие
вируса. Для
этой цели удобно
использовать
DISKEDIT из "Нортоновских
утилит" или
AVPUTIL из профессионального
комплекта AVP.
Некоторые
загрузочные
вирусы практически
сразу можно
обнаружить
по наличию
различных
текстовых строк
(например, вирус
Stoned содержит
строки: "Your PC is now
Stoned!", "LEGALISE MARIJUANA!"). Некоторые
вирусы, поражающие
загрузочные
сектора дисков,
наоборот,
определяются
по отсутствию
строк, которые
обязательно
должны быть
в загрузочном
секторе. К таким
строкам относятся
имена системных
файлов (например,
строка IOSYSMSDOS SYS) и
строки сообщений
об ошибках.
Отсутствие
или изменение
строки-заголовка
загрузочного
сектора (строка,
содержащая
номер версии
DOS или название
фирмы — производителя
ПО, например
MSDOS5.0 или MSWIN4.0) также
может служить
сигналом о
заражении
вирусом, если
на компьютере
не установлена
Windows 95/NT, так как эти
системы по
неизвестной
мне причине
записывают
в заголовок
загрузочных
секторов дискет
случайные
строки текста.
Стандартный
загрузчик
MS-DOS, расположенный
в MBR, занимает
меньше половины
сектора, и многие
вирусы, поражающие
MBR винчестера,
довольно просто
заметить по
увеличению
длины кода,
расположенного
в секторе MBR.
Однако существуют
вирусы, которые
внедряются
в загрузчик
без изменения
его текстовых
строк и с минимальными
изменениями
кода загрузчика.
Для того чтобы
обнаружить
такой вирус,
в большинстве
случаев достаточно
отформатировать
дискету на
заведомо незараженном
компьютере,
сохранить в
виде файла ее
загрузочный
сектор, затем
некоторое время
использовать
ее на зараженном
компьютере
(записать/прочитать
несколько
файлов), а после
этого на незараженном
компьютере
сравнить ее
загрузочный
сектор с оригинальным.
Если в коде
загрузочного
сектора произошли
изменения —
вирус пойман.
Существуют
также вирусы,
использующие
более сложные
приемы заражения,
например, изменяющие
при инфицировании
MBR всего 3 байта
Disk Partition Table, соответствующие
адресу активного
загрузочного
сектора. Для
идентификации
такого вируса
придется провести
более детальное
исследование
кодов загрузочного
сектора вплоть
до полного
анализа алгоритма
работы его
кода.
Приведенные
рассуждения
основываются
на том, что
стандартные
загрузчики
(программы,
записываемые
операционной
системой в
загрузочные
сектора) реализуют
стандартные
алгоритмы
загрузки ОС
и оформляются
в соответствии
с ее стандартами.
Если же диски
отформатированы
утилитами, не
входящими в
состав DOS (например,
Disk Manager), то для обнаружения
в них вируса
следует проанализировать
алгоритм работы
и оформление
загрузчиков,
создаваемых
такой утилитой.
1.3. Обнаружение
файлового
вируса.
Все вирусы
делятся на
резидентные
и нерезидентные.
Резидентные
вирусы отличаются
гораздо большим
коварством
и изощренностью,
чем нерезидентные.
Поэтому для
начала нужно
рассмотреть
простейший
случай — поражение
компьютера
неизвестным
нерезидентным
вирусом. Такой
вирус активизируется
при запуске
какой-либо
зараженной
программы,
совершает все,
что ему положено,
передает управление
программе-носителю
и в дальнейшем
(в отличие от
резидентных
вирусов) не
мешает ее работе.
Для обнаружения
такого вируса
необходимо
сравнить длины
файлов на винчестере
и в дистрибутивных
копиях. Если
это не поможет,
то следует
побайтно сравнить
дистрибутивные
копии с используемыми
программами.
Можно также
просмотреть
дамп выполняемых
файлов. В некоторых
случаях можно
сразу обнаружить
присутствие
вируса по наличию
в его коде текстовых
строк. Многие
вирусы, например,
содержат строки:
".СОМ", "*.СОМ",
".ЕХЕ", "*.ЕХЕ",
"*.*", "MZ", "COMMAND" и т.
д. Эти строки
часто встречаются
в начале или
в конце зараженных
файлов.
Существует
и еще один способ
визуального
определения
зараженного
вирусом файла.
Он основан на
том, что выполняемые
файлы, исходный
текст которых
написан на
языке высокого
уровня, имеют
вполне определенную
структуру. В
случае Borland или
Microsoft C/C++ сегмент
кода программы
находится в
начале файла,
а сразу за ним
— сегмент данных,
причем в начале
этого сегмента
стоит строка-копирайт
фирмы — изготовителя
компилятора.
Если в дампе
такого файла
за сегментом
данных следует
еще один участок
кода, то вполне
вероятно, что
файл заражен
вирусом.
То же справедливо
и для большинства
вирусов, заражающих
файлы Windows. В выполняемых
файлах этой
ОС стандартным
является размещение
сегментов в
следующем
порядке: сегмент(ы)
кода, за ним
сегменты данных.
Если за сегментом
данных идет
еще один сегмент
кода, это также
может служить
сигналом о
присутствии
вируса.
Рекомендуется
запустить одну
из резидентных
антивирусных
программ-мониторов
и следить за
ее сообщениями
о подозрительных
действиях
программ (запись
в СОМ- или ЕХЕ-файлы,
запись на диск
по абсолютному
адресу и т. п.).
Существуют
мониторы, которые
не только
перехватывают
такие действия,
но и сообщают
адрес, откуда
поступил
подозрительный
вызов (к таким
мониторам
относится
AVPTSR.COM). Обнаружив
подобное сообщение,
следует выяснить,
от какой программы
оно пришло, и
проанализировать
ее коды при
помощи резидентного
дизассемблера
(например,
AVPUTIL.COM). При анализе
кодов программ,
резидентно
находящихся
в памяти, большую
помощь часто
оказывает
трассирование
прерываний
13h и 21h.
Следует
отметить, что
резидентные
DOS-мониторы часто
оказываются
бессильны, если
работа ведется
в DOS-окне под
Windows 95/NT, поскольку
Windows 95/NT позволяют
вирусу работать
в обход монитора
(как, впрочем,
и всех остальных
резидентных
программ).
DOS-мониторы
неспособны
остановить
также распространение
Windows-вирусов.
Рассмотренные
выше методы
обнаружения
файловых и
загрузочных
вирусов подходят
для большинства
как резидентных,
так и нерезидентных
вирусов. Однако
эти методы не
срабатывают,
если вирус
выполнен по
технологии
"Стелс", что
делает бесполезным
использование
большинства
резидентных
мониторов,
утилит сравнения
файлов и чтения
секторов.
Приняв во
внимание всё
выше сказанное,
можно сделать
вывод о большой
ненадёжности
антивирусных
мониторов, как
средства защиты
от компьютерных
вирусов.
1.4. Выбор
методов построения
антивирусного
монитора.
Передо
мной стоит
задача разработать
антивирусный
монитор под
операционную
систему Windows98.
Первое, что
приходит в
голову при
анализе такой
задачи, - разработать
резидентную
программу,
перехватывающую
обращения к
диску и при
возникновении
вирусоподобной
ситуации генерирующую
исключение,
либо просто
предупреждение
пользователю.
Однако, написание
резидентной
программы под
Windows,
это далеко не
простая задача.
Да и ко всему
прочему, как
оказалось,
вовсе не обязательно
перехватывать
и сканировать
все обращения
к диску, что
значительно
затрачивает
системные
ресурсы и может
вызывать огромную
массу ложных
срабатываний.
Альтернативным
способом в этой
ситуации является
регулярное
сканирование
файлов. Хотя,
конечно, это
отнимает намного
больше системных
ресурсов, чем
мониторинг
обращений к
диску, но что
если сканировать
не все .exe
и .com
файлы, а лишь
только маленькую
часть из них.
Дело в том, что
вирусы «охотятся»
на любые исполняемые
файлы, а некоторые
изощренные
вирусы, могут,
например, «ловить»
только файлы,
размеры которого
лежат в приделах
от 40 до 300 Кб. В этом
смысле, можно
легко выделить
группу файлов,
которая подходила
бы под запросы
любого вируса,
и размеры её
не превышали
бы 5-7 штук. Но ведь
совсем не обязательно
подставлять
под удар «своих»,
когда можно
создать заведомо
ненужную группу
и выставлять
её как бы «ловушкой»
для вируса, в
то время как
нужные файлы
были бы под
защитой.
Для защиты
«нужных» файлов
я предлагаю
использовать
разработанный
мною метод,
который я назвал
«Эксклюзив».
Его суть заключается
в том, что при
запуске приложения,
использующего
данный метод,
все выбранные
типы файлов
открываются
с правом доступа
к ним только
моего приложения.
Соответственно
ни вирус, ни
пользователь(по
желанию) не
смогут произвести
несанкционированные
действия.
2. Постановка
задачи на
проектирование.
2.1. Метод
ведения мониторинга
вирусоподобных
ситуаций.
Объекты
мониторинга:
Объектами
мониторинга
являются исполняемые
.exe
и .com
файлы, созданные
монитором для
фиксации действий
системы над
ними. Достаточным
в той или иной
мере для выявления
вирусоподобных
ситуаций, будем
считать следующее
подмножество
файлов:
Описание
метода:
При первом
запуске антивирусного
монитора, создаётся
вышеизложенное
подмножество
файлов-ловушек.
После этого,
контроль над
ними осуществляется
регулярно –
каждые 10 секунд.
В случае изменения
или удаления
одного из элементов
подмножества,
пользователь
системы получает
соответствующее
уведомление
о действиях
произведённых
над файлом, и
монитор восстанавливает
исходный файл.
В это же время,
по желанию,
пользователь
может защитить
все файлы компьютера
(кроме ловушек)
от возможной
модификации
или даже просмотра.
Или же защитить
только загрузочные
файлы системы
от изменения.
Преимущества
метода:
Простота
реализации.
Программно,
способ достаточно
лёгок и прозрачен.
Достоверность.
В отличие от
остальных
антивирусных
мониторов
ошибка второго
рода исключена.
Универсальность.
Данный антивирусный
монитор способен
выявлять действия
как Windows-вирусов,
так и DOS-вирусов,
ввиду своей
не привязанности
к особенностям
операционной
системы.
Недостатки
метода:
2.2. Метод
защиты файлов
от несанкционированного
использования,
изменения и
модификации
– «Эксклюзив».
Объекты
защиты:
Объектами
защиты «Эксклюзива»
могут быть
любые файлы
локального
компьютера,
попавшие в
«поле зрения»
приложения(программы),
использующего
данный метод.
Множество
указанных
объектов защиты
изначально
определяется
пользователем
и в любой момент
времени может
быть изменено.
Описание
метода:
«Эксклюзив»
представляет
собой способ
защиты объектов(файлов)
и, как следствие,
информации
находящейся
в указанных
объектах, от
порчи, подмены
или даже от
ознакомления
с нею злоумышленника.
Суть данного
метода заключается
в следующем.
Выбранные
защищаемые
файлы, помечаются
системой как
открытые на
эксклюзивное
использование
приложением,
использующим
«Эксклюзив».
Т.е. в файловой
системе указывается
служебная
информация
о непосредственном
владельце
файла(пользовательском
приложении).
В зависимости
от цели, пользователь
выбирает способ
доступа к файлам
других процессов,
определённый
на некотором
подмножестве(полный
доступ, закрыт
для любых операций,
закрыт для
чтения, закрыт
для записи).
Тем самым, владельцем
программы,
обеспечивается
эксклюзивное
право владения
и определение
способа доступа
к защищаемым
объектам других
процессов.
Способы
применения:
Кроме
очевидной
функции, рассматриваемой
в контексте
данной разработки,
метод находит
широкое применение
в области защиты
информации,
в частности
для разграничения
доступа пользователей
к системе.
Преимущества
метода:
Минимальные
требования
к аппаратным
ресурсам
Стойкость
к обходу защиты
метода оцениваемая
уровнем стойкости
операционной
системы с одной
стороны и
приложения,
использующего
данный метод,
с другой.
Не ограниченное
множество
объектов защиты
Предельно
простая реализация
на уровне приложения
2.3. Методы
построения
системы защиты
от несанкционированного
копирования
и использования
приложения.
2.3.1. Метод
фиксации аппаратной
платформы.
В дистрибутиве
программного
пакета, помимо
исполняемого
файла самого
антивирусного
монитора
«Amonit.exe»,
содержится
файл «Creator.exe»,
который после
первого запуска
приложения
удаляется. Но
перед своим
удалением, он
создаёт новый
«ini-файл»,
в котором содержится
всего одно
слово – загаммированная
дата производства
BIOS
компьютера-носителя.
Этот файл не
доступен при
активированном
приложении,
но открыт в
противном
случае. Если
этот файл был
случайно удалён,
то без переустановки
программы,
открыть её не
удастся.
2.3.2. Метод
шифровки ключевой
информации.
В предложенном
варианте
антивирусного
монитора
предусмотрена
защита от
несанкционированного
снятия программы
с выполнения
- пароль. Он хранится
на инсталляционной
дискете в файле
«pif.ini»
в загаммированном
виде. Легальный
пользователь
может всегда
задать или
изменить этот
пароль при
помощи специальной
программной
опции.
Изменить
пароль без
использования
программной
опции, т.е. методом
непосредственного
изменения файла
затруднительно,
поскольку от
этого предусмотрена
небольшая
защита. Дело
в том, что пустой
файл «pif.ini»
не означает
пустой пароль.
Программа
антивирусного
монитора – это
.exe
файл для Windows,
поэтому запуск
его на выполнение
порождает в
системе процесс
и он естественно
должен фиксироваться
в списке процессов
Windows.
Но это обстоятельство
делает программу
очень уязвимой
в плане того,
что её можно
снять с выполнения.
Для этого в
программе
предусмотрен
способ обхода
системной
регистрации
процесса и
другой пользователь
не в силах снять
этот процесс
не прибегая
к сторонним
разработкам.
3.
Модель нарушителя
и системы защиты
…ФАЙЛЫ…
закладки
документы
и документы
и
программы программы
закрыто
закрыто
файловая система
…ЛОГИЧЕСКИЕ
ДИСКИ…
Попытка
доступа к файлам
диска
Открытие
файлов
с
эксклюзивным
доступом
процесса
системы защиты
Процесс
системы защиты Процесс
нарушителя
Проверка
Основная
Исполняемая
закладок
нить
программа
попытка
изменения
файла
4.
Разработка
алгоритмов
для выбранных
методов решения
Метод
защиты файлов
диска «Эксклюзив»
Начало
Ввод
диска для защиты,
Вы-
бор типов
объектов защиты
и способа
доступа к ним.
Конец списка Да
каталогов?
Нет
Да
Конец списка
файлов?
Нет
Неверный тип Да
объекта?
Нет
Открытие
файла,
с
выбранными
пра-
вами
доступа к нему
других
процессов.
Да Продолжать
выполнение?
(ДА)
Нет
Да Продолжать
выполнение?
(ДА)
Нет
Конец
Метод
защиты от
копирования
программы
Начало
Чтение
из памяти При
первом запуске
даты
изготовления
создаётся
«dbpg.ini»,
BIOS
(0xffff5) содержащий
загам-
мированную
дату
создания BIOS.
«Программный
файл
Файл «dbpg.ini»
существ? не
существует!»
Нет
Да
Чтение
из файла
«dbpg.ini»
созданной
при установке
и загам-
мированной
даты BIOS
Гамма-функ-
ции не совпадают?
«Не
легальная копия
программы!!!»
Конец
Запуск
программы
Гаммирование
Начало
Str = “”
I = 0
SoderjVvoda = ””
Simvol = ””
S = 1
Gamma = “GAMMA”
Нет
S<=Gamma.Length
Да
Simvol = Str[S]
Gamma[S-1]+ Нет
SoderjVvoda+=
Simvol >= 255
Gamma[s-1]+Simvol
Да
Simvol+=Gamma[s-1]-255
SoderjVvoda+=simvol
Нет
S > Str.Length+1
Да
Конец
5.
Руководство
системного
программиста
по установке
комплекса.
Запустить,
содержащийся
на инсталляционной
дискете,
самораспаковывающийся
архив.
Извлечь
содержимое
архива в нужную
папку.
Выполнить
файл «Amonit.exe».
При этом из
папки программы
удалится файл
«Creator.exe»
и создастся
файл «dbpg.ini».
Не закрывайте
сразу программу,
через некоторое
время появятся
три пробные
ошибки, сигнализирующие
о том, что антивирусный
монитор установлен
и успешно
функционирует.
6.
Организационные
требования
к эксплуатации
системы защиты
Выполняемость
комплекса.
Системный
администратор
обязан следить
за выполняемостью
комплекса при
каждой перезагрузке
операционной
системы, в противном
случае его
использование
теряет всякий
смысл.
Резервное
копирование.
В связи
с не высокой
надёжностью
магнитных
носителей(дискет),
содержащих
ключевую информацию,
в целях сохранности
полной функциональности
комплекса,
необходимо
периодически
осуществлять
резервное
копирование
инсталляционной
дискеты.
Ограничение
доступа. Системный
администратор
обязан полностью
контролировать
доступ других
пользователей
к системе защиты
и пресекать
все попытки
несанкционированного
доступа.
Оптимизация
работы комплекса.
Для оптимальной
работы системы
защиты и, как
следствие,
операционной
системы в целом,
системный
администратор
должен периодически
пересматривать
набор средств
защиты.
Руководство
системного
программиста
по установке
комплекса.
Запустить,
содержащийся
на инсталляционной
дискете,
самораспаковывающийся
архив.
Извлечь содержимое
архива в нужную
папку.
Выполнить файл
«Amonit.exe».
При этом из
папки программы
удалится файл
«Creator.exe»
и создастся
файл «dbpg.ini».
Не закрывайте
сразу программу,
через некоторое
время появятся
три пробные
ошибки, сигнализирующие
о том, что антивирусный
монитор установлен
и успешно
функционирует.
Техническое
задание
Предмет и
назначение
разработки
Данная
разработка
проводится
в рамках курсового
проекта, предназначенного
для закрепления
теоретических
знаний в области
проектирования
средств защиты
системных
компонент
программного
обеспечения
ЭВМ и получения
практических
навыков реализации
основных элементов
защиты информации,
хранимой на
технических
носителях от
несанкционированного
доступа.
Темой курсовой
работы является
проектирование
программного
комплекса
ведущего антивирусный
мониторинг.
Согласно выбранному
заданию, разрабатываемое
программное
обеспечение
должно иметь
следующие
свойства:
Тип разрабатываемого
программного
комплекса -
Антивирусный
монитор для
файловых и
boot вирусов (2)
Тип
привязки
программного
обеспечения
к ресурсам
компьютера
- Дата изготовления
и производитель
Bios (5)
Тип
защищаемого
ресурса - Файлы
(1)
Тип
шифра для парольного
доступа - гаммирование
(1)
Тип
носителя ключевой
информации
- дискета
(1)
Необходимые
элементы разработки
комплекса
Курсовая
работа должна
содержать
следующие
основные элементы:
Модель нарушителя
Модель системы
защиты
Организационные
требования
к эксплуатации
разработанной
системы защиты
Алгоритмы
методов, разрабатываемых
в работе
Программная
реализация
разработанных
алгоритмов
Средства
тестирования
Технические
требования
к разрабатываемому
программному
комплексу
Основные
принципы построения
Защита тем
более эффективна,
чем легче
пользователю
с ней работать.
Любые исключения
из множества
контролируемых
субъектов и
объектов защиты
снижают защищенность
автоматизированного
комплекса
обработки
информации.
Система
защиты должна
проектироваться
в расчете на
враждебное
окружение.
Разработчик
должен исходить
из предположения,
что пользователи
имеют наихудшие
намерения, что
они будут совершать
серьезные
ошибки и искать
пути обхода
механизмов
защиты.
Система
защиты должна
предоставлять
убедительные
доказательства
корректности
своей работы.
Основные
функции
Ведение
антивирусного
мониторинга
для защиты
предложенного
ресурса от
файловых и
загрузочных(boot)
вирусов.
Обеспечение
надёжной работы
разрабатываемого
программного
обеспечения
на установленном
носителе, включая
защиту от
несанкционированного
копирования.
Требования
к надёжности
Контроль
всех поступающих
на ЭВМ файлов
на наличие
файловых и
boot
вирусов.
Использование
для парольного
доступа шифра
гаммирования,
хранимого на
дискете.
При нормальном
функционировании
защита не должна
отключаться.
Только в особых
случаях администратор
обладающий
ключом, может
отключить
систему защиты.
Требования
к программному
обеспечению.
Программный
комплекс должен
быть разработан
средствами
языка объектно-ориентированного
программирования
C++Builder
6 с использованием
по мере необходимости
языка Assembler'a.
Комплекс
должен функционировать
на платформе
WINDOWS 98.
Требования
к документации.
Курсовая
работа оформляется
в соответствии
с действующими
стандартами
на оформление
программной
документации
и требованиями
кафедры ЭВМ.
В пояснительной
записке приводятся
следующие
разделы:
Техническое
задание на
проектирование
Обзор литературных
источников
Анализ существующих
вариантов
решения задачи
и выбор наиболее
приемлемого
Постановка
задачи на
проектирование
Разработка
моделей нарушителя
и системы защиты
Оценка стойкости
системы защиты
Разработка
алгоритмов
для выбранных
методов решения
задачи
Разработка
программной
реализации
алгоритмов
Тестирование
готовой системы
защиты
Руководство
системного
программиста
по установке
комплекса
Перечень
организационных
мероприятий
по сопровождению
эксплуатации
системы защиты
Приложения
с исходными
текстами программ
и тестовых
примеров
Порядок
контроля и
приёмки.
Полностью
оформленный
курсовой проект
проверяется
руководителем
на соответствие
всем требованиям
технического
задания. После
этого проект
отдается на
рецензию одному
из преподавателей
кафедры ЭВМ.
Защита курсового
проекта студентом
производится
в назначенный
срок перед
комиссией,
назначенной
заведующим
кафедрой.
Выдано:
Руководитель
проекта
______________________________ /доц. Савин
Н.И../
дата подпись
Представить
к защите ________________
дата
Получено:
Студент
гр.230901 _____________________________________/Трутнев
Е.В./
дата подпись
Организационные
требования
к эксплуатации
системы защиты
Выполняемость
комплекса.
Системный
администратор
обязан следить
за выполняемостью
комплекса при
каждой перезагрузке
операционной
системы, в противном
случае его
использование
теряет всякий
смысл.
Резервное
копирование.
В связи с не
высокой надёжностью
магнитных
носителей(дискет),
содержащих
ключевую информацию,
в целях сохранности
полной функциональности
комплекса,
необходимо
периодически
осуществлять
резервное
копирование
инсталляционной
дискеты.
Ограничение
доступа.
Системный
администратор
обязан полностью
контролировать
доступ других
пользователей
к системе защиты
и пресекать
все попытки
несанкционированного
доступа.
Оптимизация
работы комплекса.
Для оптимальной
работы системы
защиты и, как
следствие,
операционной
системы в целом,
системный
администратор
должен периодически
пересматривать
набор средств
защиты.
|