Разработка антивирусного монитора
Метод защиты файлов диска «Эксклюзив»
Начало
Ввод диска для защиты, Вы-
бор типов объектов защиты
и способа доступа к ним.
Конец списка Да
каталогов?
Нет
Да Конец списка
файлов?
Нет
Неверный тип Да
объекта?
Нет
Открытие файла,
с выбранными пра-
вами доступа к нему
других процессов.
Да Продолжать выполнение?
(ДА)
Нет
Да Продолжать выполнение?
(ДА)
Нет
Конец
Метод защиты от копирования программы
Начало
Чтение из памяти При первом запуске
даты изготовления создаётся «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 файлы, созданные монитором для фиксации действий системы над ними. Достаточным в той или иной мере для выявления вирусоподобных ситуаций, будем считать следующее подмножество файлов:
С:\trap3.exe (37,5 Kb)
C:\Windows\trap1.exe (631 Kb)
C:\Windows\trap2.com (37,5 Kb)
Описание метода:
При первом запуске антивирусного монитора, создаётся вышеизложенное подмножество файлов-ловушек. После этого, контроль над ними осуществляется регулярно – каждые 10 секунд. В случае изменения или удаления одного из элементов подмножества, пользователь системы получает соответствующее уведомление о действиях произведённых над файлом, и монитор восстанавливает исходный файл.
В это же время, по желанию, пользователь может защитить все файлы компьютера (кроме ловушек) от возможной модификации или даже просмотра. Или же защитить только загрузочные файлы системы от изменения.
Преимущества метода:
Простота реализации. Программно, способ достаточно лёгок и прозрачен.
Достоверность. В отличие от остальных антивирусных мониторов ошибка второго рода исключена.
Универсальность. Данный антивирусный монитор способен выявлять действия как Windows-вирусов, так и DOS-вирусов, ввиду своей не привязанности к особенностям операционной системы.
Недостатки метода:
Сложности при создании оптимального подмножества файлов-ловушек
Метод защиты файлов от несанкционированного использования, изменения и модификации – «Эксклюзив».
Объекты защиты:
Объектами защиты «Эксклюзива» могут быть любые файлы локального компьютера, попавшие в «поле зрения» приложения(программы), использующего данный метод. Множество указанных объектов защиты изначально определяется пользователем и в любой момент времени может быть изменено.
Описание метода:
«Эксклюзив» представляет собой способ защиты объектов(файлов) и, как следствие, информации находящейся в указанных объектах, от порчи, подмены или даже от ознакомления с нею злоумышленника.
Суть данного метода заключается в следующем. Выбранные защищаемые файлы, помечаются системой как открытые на эксклюзивное использование приложением, использующим «Эксклюзив». Т.е. в файловой системе указывается служебная информация о непосредственном владельце файла(пользовательском приложении). В зависимости от цели, пользователь выбирает способ доступа к файлам других процессов, определённый на некотором подмножестве(полный доступ, закрыт для любых операций, закрыт для чтения, закрыт для записи). Тем самым, владельцем программы, обеспечивается эксклюзивное право владения и определение способа доступа к защищаемым объектам других процессов.
Способы применения:
Кроме очевидной функции, рассматриваемой в контексте данной разработки, метод находит широкое применение в области защиты информации, в частности для разграничения доступа пользователей к системе.
Преимущества метода:
Минимальные требования к аппаратным ресурсам
Стойкость к обходу защиты метода оцениваемая уровнем стойкости операционной системы с одной стороны и приложения, использующего данный метод, с другой.
Не ограниченное множество объектов защиты
Предельно простая реализация на уровне приложения
Методы построения системы защиты от несанкционированного копирования и использования приложения.
Метод фиксации аппаратной платформы.
В дистрибутиве программного пакета, помимо исполняемого файла самого антивирусного монитора «Amonit.exe», содержится файл «Creator.exe», который после первого запуска приложения удаляется. Но перед своим удалением, он создаёт новый «ini-файл», в котором содержится всего одно слово – загаммированная дата производства BIOS компьютера-носителя. Этот файл не доступен при активированном приложении, но открыт в противном случае. Если этот файл был случайно удалён, то без переустановки программы, открыть её не удастся.
Метод шифровки ключевой информации.
В предложенном варианте антивирусного монитора предусмотрена защита от несанкционированного снятия программы с выполнения - пароль. Он хранится на инсталляционной дискете в файле «pif.ini» в загаммированном виде. Легальный пользователь может всегда задать или изменить этот пароль при помощи специальной программной опции.
Изменить пароль без использования программной опции, т.е. методом непосредственного изменения файла затруднительно, поскольку от этого предусмотрена небольшая защита. Дело в том, что пустой файл «pif.ini» не означает пустой пароль.
Программа антивирусного монитора – это .exe файл для Windows, поэтому запуск его на выполнение порождает в системе процесс и он естественно должен фиксироваться в списке процессов Windows. Но это обстоятельство делает программу очень уязвимой в плане того, что её можно снять с выполнения. Для этого в программе предусмотрен способ обхода системной регистрации процесса и другой пользователь не в силах снять этот процесс не прибегая к сторонним разработкам.
Метод защиты файлов от несанкционированного использования, изменения и модификации – «Эксклюзив».
Объекты защиты:
Объектами защиты «Эксклюзива» могут быть любые файлы локального компьютера, попавшие в «поле зрения» приложения(программы), использующего данный метод. Множество указанных объектов защиты изначально определяется пользователем и в любой момент времени может быть изменено.
Описание метода:
«Эксклюзив» представляет собой способ защиты объектов(файлов) и, как следствие, информации находящейся в указанных объектах, от порчи, подмены или даже от ознакомления с нею злоумышленника.
Суть данного метода заключается в следующем. Выбранные защищаемые файлы, помечаются системой как открытые на эксклюзивное использование приложением, использующим «Эксклюзив». Т.е. в файловой системе указывается служебная информация о непосредственном владельце файла(пользовательском приложении). В зависимости от цели, пользователь выбирает способ доступа к файлам других процессов, определённый на некотором подмножестве(полный доступ, закрыт для любых операций, закрыт для чтения, закрыт для записи). Тем самым, владельцем программы, обеспечивается эксклюзивное право владения и определение способа доступа к защищаемым объектам других процессов.
Способы применения:
Метод «Эксклюзив» находит широкое применение в области защиты информации. На его основе могут быть разработаны программы ограничения доступа к ресурсам локального компьютера, в частности такая защита может послужить хорошим щитом для файлов от заражения вирусами.
Преимущества метода:
Минимальные требования к аппаратным ресурсам
Стойкость к обходу защиты метода оцениваемая уровнем стойкости операционной системы с одной стороны и приложения, использующего данный метод, с другой.
Не ограниченное множество объектов защиты
Предельно простая реализация на уровне приложения
Разработал: Трутнев Евгений Владимирович 23 ноября 2003г.
Министерство образования РФ
Тульский государственный университет
Кафедра ЭВМ
Защита системного программного обеспечения
Курсовая работа
Антивирусный монитор
Выполнил студент /Трутнев Е.В./
гр.230901 дата подпись
Проверил: /Савин Н.И./
дата подпись
Тула 2003
Оглавление
Оглавление 1
1. Анализ существующих вариантов решения задачи и выбор наиболее приемлемого 2
1.1. Антивирусные мониторы 2
1.2. Обнаружение загрузочного вируса 3
1.3. Обнаружение файлового вируса 5
1.4. Выбор методов построения антивирусного монитора 7
2. Постановка задачи на проектирование 8
2.1. Метод ведения мониторинга вирусоподобных ситуаций 8
2.2. Метод защиты файлов от несанкционированного использования, изменения и модификации – «Эксклюзив». 9
2.3. Методы построения системы защиты от несанкционированного копирования и использования приложения 10
2.3.1. Метод фиксации аппаратной платформы 10
2.3.2. Метод шифровки ключевой информации 10
3. Модель нарушителя и системы защиты 12
4. Разработка алгоритмов для выбранных методов решения 13
4.1. Метод защиты файлов диска «Эксклюзив» 13
4.2. Метод защиты от копирования программы 14
4.3. Гаммирование 15
5. Руководство системного программиста по установке комплекса 16
6. Организационные требования к эксплуатации системы защиты 16
Обзор литературных источников 17
Листинг программы 18
Заголовочный файл основной формы (Unit1.h) 18
C++ файл основной формы (Unit1.cpp) 18
C++ файл формы парольного окна (Unit2.cpp) 24
C++ файл формы окна изменения пароля (Unit3.cpp) 24
C++ файл параллельной нити (Unit6.cpp) 25
C++ файл тестирующего приложения (Вирус.cpp) 27
С++ файл инсталляционного файла Creator.cpp 27
Список глобальных переменных 29
Описание основных функций 30
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 файлы, созданные монитором для фиксации действий системы над ними. Достаточным в той или иной мере для выявления вирусоподобных ситуаций, будем считать следующее подмножество файлов:
С:\trap3.exe (37,5 Kb)
C:\Windows\trap1.exe (631 Kb)
C:\Windows\trap2.com (37,5 Kb)
Описание метода:
При первом запуске антивирусного монитора, создаётся вышеизложенное подмножество файлов-ловушек. После этого, контроль над ними осуществляется регулярно – каждые 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 <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "cdiroutl.h"
#include <FileCtrl.hpp>
#include <Grids.hpp>
#include <Outline.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
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 <vcl.h>
#pragma hdrstop
#include <share.h> //
#include <io.h> //
#include <sys\stat.h> //
#include <fcntl.h> //для эксклюзивного доступа
#include <SysUtils.hpp>
#include <stdio.h>
#include <dir.h>
#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<Stroka.Length()+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; i<Form1->FileListBox1->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; i<Form1->FileListBox1->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; i<Form1->FileListBox1->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 <vcl.h>
#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<glob; i++)
{
FileClose(M[glob]);
}
exit(1);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
Form2->Close();
}
//---------------------------------------------------------------------------
C++ файл формы окна изменения пароля (Unit3.cpp)
#include <vcl.h>
#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 <vcl.h>
#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<filelength(_fileno(F1));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<LengthTrap1;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 <SysUtils.hpp>
#include <stdio.h>
#include <vcl.h>
#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 <vcl.h>
#pragma hdrstop
#include <SysUtils.hpp>
#include <stdio.h>
#include <dir.h>
//---------------------------------------------------------------------------
String Gammirovanie(String Stroka)
{
char Gamma[5]={'G','A','M','M','A'};
String SodegjVvoda="";
char simvol;
for(int s=1;s<Stroka.Length()+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 <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "cdiroutl.h"
#include <FileCtrl.hpp>
#include <Grids.hpp>
#include <Outline.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
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 <vcl.h>
#pragma hdrstop
#include <share.h> //
#include <io.h> //
#include <sys\stat.h> //
#include <fcntl.h> //для эксклюзивного доступа
#include <SysUtils.hpp>
#include <stdio.h>
#include <dir.h>
#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<Stroka.Length()+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; i<Form1->FileListBox1->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; i<Form1->FileListBox1->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; i<Form1->FileListBox1->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 <vcl.h>
#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<glob; i++)
{
FileClose(M[glob]);
}
exit(1);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
Form2->Close();
}
//---------------------------------------------------------------------------
C++ файл формы окна изменения пароля (Unit3.cpp)
#include <vcl.h>
#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 <vcl.h>
#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<filelength(_fileno(F1));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<LengthTrap1;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 <SysUtils.hpp>
#include <stdio.h>
#include <vcl.h>
#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 <vcl.h>
#pragma hdrstop
#include <SysUtils.hpp>
#include <stdio.h>
#include <dir.h>
//---------------------------------------------------------------------------
String Gammirovanie(String Stroka)
{
char Gamma[5]={'G','A','M','M','A'};
String SodegjVvoda="";
char simvol;
for(int s=1;s<Stroka.Length()+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 файлы, созданные монитором для фиксации действий системы над ними. Достаточным в той или иной мере для выявления вирусоподобных ситуаций, будем считать следующее подмножество файлов:
С:\trap3.exe (37,5 Kb)
C:\Windows\trap1.exe (631 Kb)
C:\Windows\trap2.com (37,5 Kb)
Описание метода:
При первом запуске антивирусного монитора, создаётся вышеизложенное подмножество файлов-ловушек. После этого, контроль над ними осуществляется регулярно – каждые 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 _____________________________________/Трутнев Е.В./
дата подпись
Организационные требования к эксплуатации системы защиты
Выполняемость комплекса. Системный администратор обязан следить за выполняемостью комплекса при каждой перезагрузке операционной системы, в противном случае его использование теряет всякий смысл.
Резервное копирование. В связи с не высокой надёжностью магнитных носителей(дискет), содержащих ключевую информацию, в целях сохранности полной функциональности комплекса, необходимо периодически осуществлять резервное копирование инсталляционной дискеты.
Ограничение доступа. Системный администратор обязан полностью контролировать доступ других пользователей к системе защиты и пресекать все попытки несанкционированного доступа.
Оптимизация работы комплекса. Для оптимальной работы системы защиты и, как следствие, операционной системы в целом, системный администратор должен периодически пересматривать набор средств защиты.