Метод защиты файлов диска «Эксклюзив»
Начало
Ввод диска для защиты, Вы-
бор типов объектов защиты
и способа доступа к ним.
Конец списка Да
каталогов?
Нет
Да Конец списка
файлов?
Нет
Неверный тип Да
объекта?
Нет
Открытие файла,
с выбранными пра-
вами доступа к нему
других процессов.
Да Продолжать выполнение?
(ДА)
Нет
Да Продолжать выполнение?
(ДА)
Нет
Конец
Метод защиты от копирования программы
Начало
Чтение из памяти При первом запуске
даты изготовления создаётся «dbpg.ini»,
BIOS (0xffff5) содержащий загам-
мированную дату
создания BIOS.
«Программный файл
Файл «dbpg.ini» существ? не существует!» Нет
Да
Чтение из файла
«dbpg.ini» созданной
при установке и загам-
мированной даты BIOS
Гамма-функ-
ции не совпадают?
«Не легальная копия
программы!!!»
Конец
Запуск программы
Гаммирование
Начало
Str = “”
I = 0
SoderjVvoda = ””
Simvol = ””
S = 1
Gamma = “GAMMA”
Нет
S= 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
#include
#include
#include
#include "cdiroutl.h"
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TCDirectoryOutline *CDirectoryOutline1;
TFileListBox *FileListBox1;
TDriveComboBox *DriveComboBox1;
TLabel *Label1;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TButton *Button5;
TButton *Button6;
TButton *Button7;
TTimer *Timer1;
TAnimate *Animate1;
TControlBar *ControlBar1;
TButton *Button8;
TButton *Button9;
void __fastcall Button7Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button6Click(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall DriveComboBox1Change(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Button8Click(TObject *Sender);
void __fastcall Button9Click(TObject *Sender);
private: // User declarations
void __fastcall OnClose(TWMClose& Message);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_CLOSE, TWMClose, OnClose)
END_MESSAGE_MAP(TComponent)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
C++ файл основной формы (Unit1.cpp)#include
#pragma hdrstop
#include //
#include //
#include //
#include //для эксклюзивного доступа
#include
#include
#include
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit4.h"
#include "Unit5.h"
#include "Unit6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cdiroutl"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
String PathDir;
String PathToTraps=ExtractFileDir(GetCommandLine()).c_str()+1;
TFScan *SecondProcess;
int trapshnd[3];
int hndsys[3];
int M[2000]; //ограничение числа открываемых .EXE файлов
int glob=0;
String ZashDrives="";
int ZashFiles=0;
int ZashFolders=0;
int ExeFiles=0;
int ComFiles=0;
String Gammirovanie(String Stroka)
{
char Gamma[5]={'G','A','M','M','A'};
String SodegjVvoda="";
char simvol;
for(int s=1;sCount; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
ZashFolders++;
}
else
{
ZashFolders++;
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String vrem;
for(int i=0; iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
String Rassh=AnsiLowerCase(ExtractFileExt(Form1->FileListBox1->Items->Strings[i]));
if(Rassh==".exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);
glob++;
ExeFiles++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i], NULL);
}
else if(Rassh==".com")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);
glob++;
ComFiles++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i], NULL);
}
else if(Rassh==".bat")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);
glob++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i], NULL);
}
}
}
}
Form1->CDirectoryOutline1->Refresh();
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
WinExec("Creator.exe",SW_MAXIMIZE);
DeleteFile("Creator.exe");
String DataBiosFileName="dbpg.ini";
if(FileExists(DataBiosFileName))
{
String Itog=OpenAndReadFile(DataBiosFileName);
String Itog1=Gammirovanie(DataBios());
if(Itog1!=Itog)
{
Application->MessageBoxA("Нелегальная копия программы!!!","Защита",MB_ICONSTOP);
exit(1);
}
else
{
Form1->CDirectoryOutline1->Items[1]->Collapse();
}
_sopen(DataBiosFileName.c_str(),O_RDONLY,SH_DENYRW); //обеспечивает экскл. доступ к файлу
}
else
{
Application->MessageBoxA("Нарушение целостности программы!!!","Защита",MB_ICONSTOP);
exit(1);
}
StelsProgram();
CDirectoryOutline1->Items[1]->Collapse();
}
//---------------------------------------------------------------------------
void SecuritySystemsBootFiles(void)
{
String CmdCom="C:/Windows/Command.com";
String CmdComOsn="C:/Command.com";
String AutoExecBat="C:/AutoExec.bat";
hndsys[0]=FileOpen(CmdCom ,fmShareExclusive);
hndsys[1]=FileOpen(CmdComOsn ,fmShareExclusive);
hndsys[2]=FileOpen(AutoExecBat ,fmShareExclusive);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Form4->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Form3->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Form2->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Form1->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form5->Visible=true;
ZashDrives=ZashDrives+" "+DriveComboBox1->Drive;
Form4->Label8->Caption=ZashDrives;
ExclusiveOpenAllExeAndComFilesOnDrive();
OpenTraps();
ZashFiles=ComFiles+ExeFiles;
Form4->Label9->Caption=ZashFolders;
Form4->Label10->Caption=ZashFiles;
Form4->Label11->Caption=ExeFiles;
Form4->Label12->Caption=ComFiles;
Form5->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DriveComboBox1Change(TObject *Sender)
{
CDirectoryOutline1->Drive=DriveComboBox1->Drive;
CDirectoryOutline1->Items[1]->Collapse();
CDirectoryOutline1->Items[1]->Expand();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
FileClose(hndsys[0]);
FileClose(hndsys[1]);
FileClose(hndsys[2]);
SecuritySystemsBootFiles();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
FileClose(hndsys[0]);
FileClose(hndsys[1]);
FileClose(hndsys[2]);
}
void __fastcall TForm1::OnClose(TWMClose& a)
{
Form2->Visible=true;
}
//---------------------------------------------------------------------------
void CloseTimer(void)
{
Form1->Timer1->Enabled=false;
}
//---------------------------------------------------------------------------
void OpenTimer(void)
{
Form1->Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
SecondProcess = new TFScan(true);
SecondProcess->Resume();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
Form5->Visible=true;
for(int j=1; jCDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String vrem;
for(int i=0; iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);
}
}
}
Form1->CDirectoryOutline1->Refresh();
Form5->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)
{
Form5->Visible=true;
for(int j=1; jCDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String vrem;
for(int i=0; iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareExclusive);
}
}
}
Form1->CDirectoryOutline1->Refresh();
Form5->Visible=false;
}
//---------------------------------------------------------------------------
C++ файл формы парольного окна (Unit2.cpp)#include
#pragma hdrstop
#include "Unit1.cpp"
#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
String Itog1=Gammirovanie(Edit1->Text)+"m";
String Itog=OpenAndReadFile("A:/Прога/pif.ini");
Edit1->Text="";
if(Itog!=Itog1)
{
Application->MessageBoxA("Не верный пароль!!!","Защита",MB_ICONSTOP);
Form2->Close();
}
else
{
for(int i=0; iClose();
}
//---------------------------------------------------------------------------
C++ файл формы окна изменения пароля (Unit3.cpp)#include
#pragma hdrstop
#include "Unit1.cpp"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
String GamOldPass="";
String GamNuwPass="";
String SaveGamPass="";
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
GamOldPass=Gammirovanie(Edit1->Text)+"m";
SaveGamPass=OpenAndReadFile("A:/Прога/pif.ini");
if(GamOldPass==SaveGamPass)
{
if(Edit2->Text==Edit3->Text)
{
GamNuwPass=Gammirovanie(Edit2->Text)+"m";
OpenAndWriteFile("A:/Прога/pif.ini",GamNuwPass);
Form3->Close();
}
else
{
Application->MessageBoxA("Введены разные пароли!!!","Отмена операции",MB_ICONSTOP);
}
}
else
{
Application->MessageBoxA("Введён не верный действующий пароль!!!","Защита",MB_ICONSTOP);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button2Click(TObject *Sender)
{
Form3->Close();
}
//---------------------------------------------------------------------------
C++ файл параллельной нити (Unit6.cpp)#include
#pragma hdrstop
#include "Unit1.cpp"
#include "Unit6.h"
#include "Unit1.h"
#pragma package(smart_init)
void Zapolnenie(String FName1,String FName2)
{
FILE *F1;
FILE *F2;
F1=fopen(FName1.c_str(), "rb");
F2=fopen(FName2.c_str(), "wb");
for(int s=0;sMessageBoxA("Внимание!!! Произошла перезапись .EXE или .COM файла!","Извещение!",MB_ICONSTOP);
fclose(F1);
fclose(F2);
Zapolnenie(FName1,FName2);
}
else
{
for(int j=0;jMessageBoxA("Внимание!!! Произошла запись в .EXE или .COM файл!","Извещение!",MB_ICONSTOP);
j=LengthTrap1;
}
}
}
}
else
{
if(!FileExists(FName2))
{
int DelFileHnd=0;
DelFileHnd=FileCreate(FName2);
FileClose(DelFileHnd);
fclose(F1);
fclose(F2);
Zapolnenie(FName1,FName2);
Application->MessageBoxA("Внимание!!! Была предпринята попытка удалить файл!!!","Извещение!",MB_ICONSTOP);
}
}
}
else
{
Application->MessageBoxA("Не удаётся открыть программный файл!!!","Ошибка",MB_ICONSTOP);
exit(1);
}
fclose(F1);
fclose(F2);
}
//----------------------------------------------------------------------
__fastcall TFScan::TFScan(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TFScan::Execute()
{
CloseTimer();
CloseTraps();
Proverka(PathTrapsDir("Trap1.exe"),"C:\\Windows\\Trap1.exe");
Proverka(PathTrapsDir("Trap2.exe"),"C:\\Windows\\Trap2.exe");
Proverka(PathTrapsDir("Trap3.exe"),"C:\\Trap3.exe");
OpenTraps();
OpenTimer();
}
//---------------------------------------------------------------------------
C++ файл тестирующего приложения (Вирус.cpp)#include
#include
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *F;
if(F=fopen(Edit1->Text.c_str(), "w+b"))
{
fprintf(F,"\t This is virus!!!");
fclose(F);
}
else
{
String t="Нет доступа к файлу "+ExtractFileName(Edit1->Text)+"!!!";
Application->MessageBoxA(t.c_str(),"***Ошибка***",MB_ICONSTOP);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
OpenDialog1->Execute();
Edit1->Text=OpenDialog1->FileName;
}
С++ файл инсталляционного файла Creator.cpp#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#include
#pragma hdrstop
#include
#include
#include
//---------------------------------------------------------------------------
String Gammirovanie(String Stroka)
{
char Gamma[5]={'G','A','M','M','A'};
String SodegjVvoda="";
char simvol;
for(int s=1;sItems[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
ZashFolders++;
}
else
{
ZashFolders++;
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String vrem;
for(int i=0; iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
String Rassh=AnsiLowerCase(ExtractFileExt(Form1->FileListBox1->Items->Strings[i]));
if(Rassh==".exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);
glob++;
ExeFiles++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i], NULL);
}
else if(Rassh==".com")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);
glob++;
ComFiles++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i], NULL);
}
else if(Rassh==".bat")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);
glob++;
FileSetAttr(Form1->FileListBox1->Items->Strings[i], NULL);
}
}
}
}
Form1->CDirectoryOutline1->Refresh();
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
WinExec("Creator.exe",SW_MAXIMIZE);
DeleteFile("Creator.exe");
String DataBiosFileName="dbpg.ini";
if(FileExists(DataBiosFileName))
{
String Itog=OpenAndReadFile(DataBiosFileName);
String Itog1=Gammirovanie(DataBios());
if(Itog1!=Itog)
{
Application->MessageBoxA("Нелегальная копия программы!!!","Защита",MB_ICONSTOP);
exit(1);
}
else
{
Form1->CDirectoryOutline1->Items[1]->Collapse();
}
_sopen(DataBiosFileName.c_str(),O_RDONLY,SH_DENYRW); //обеспечивает экскл. доступ к файлу
}
else
{
Application->MessageBoxA("Нарушение целостности программы!!!","Защита",MB_ICONSTOP);
exit(1);
}
StelsProgram();
CDirectoryOutline1->Items[1]->Collapse();
}
//---------------------------------------------------------------------------
void SecuritySystemsBootFiles(void)
{
String CmdCom="C:/Windows/Command.com";
String CmdComOsn="C:/Command.com";
String AutoExecBat="C:/AutoExec.bat";
hndsys[0]=FileOpen(CmdCom ,fmShareExclusive);
hndsys[1]=FileOpen(CmdComOsn ,fmShareExclusive);
hndsys[2]=FileOpen(AutoExecBat ,fmShareExclusive);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Form4->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Form3->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Form2->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Form1->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form5->Visible=true;
ZashDrives=ZashDrives+" "+DriveComboBox1->Drive;
Form4->Label8->Caption=ZashDrives;
ExclusiveOpenAllExeAndComFilesOnDrive();
OpenTraps();
ZashFiles=ComFiles+ExeFiles;
Form4->Label9->Caption=ZashFolders;
Form4->Label10->Caption=ZashFiles;
Form4->Label11->Caption=ExeFiles;
Form4->Label12->Caption=ComFiles;
Form5->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DriveComboBox1Change(TObject *Sender)
{
CDirectoryOutline1->Drive=DriveComboBox1->Drive;
CDirectoryOutline1->Items[1]->Collapse();
CDirectoryOutline1->Items[1]->Expand();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
FileClose(hndsys[0]);
FileClose(hndsys[1]);
FileClose(hndsys[2]);
SecuritySystemsBootFiles();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
FileClose(hndsys[0]);
FileClose(hndsys[1]);
FileClose(hndsys[2]);
}
void __fastcall TForm1::OnClose(TWMClose& a)
{
Form2->Visible=true;
}
//---------------------------------------------------------------------------
void CloseTimer(void)
{
Form1->Timer1->Enabled=false;
}
//---------------------------------------------------------------------------
void OpenTimer(void)
{
Form1->Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
SecondProcess = new TFScan(true);
SecondProcess->Resume();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
Form5->Visible=true;
for(int j=1; jCDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String vrem;
for(int i=0; iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);
}
}
}
Form1->CDirectoryOutline1->Refresh();
Form5->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)
{
Form5->Visible=true;
for(int j=1; jCDirectoryOutline1->Lines->Count; j++)
{
if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)
{
Form1->CDirectoryOutline1->Items[j]->Expand();
}
Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;
String vrem;
for(int i=0; iFileListBox1->Count; i++)
{
vrem=Form1->FileListBox1->Items->Strings[i];
if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")
{
M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareExclusive);
}
}
}
Form1->CDirectoryOutline1->Refresh();
Form5->Visible=false;
}
//---------------------------------------------------------------------------
C++ файл формы парольного окна (Unit2.cpp)
#include
#pragma hdrstop
#include "Unit1.cpp"
#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
String Itog1=Gammirovanie(Edit1->Text)+"m";
String Itog=OpenAndReadFile("A:/Прога/pif.ini");
Edit1->Text="";
if(Itog!=Itog1)
{
Application->MessageBoxA("Не верный пароль!!!","Защита",MB_ICONSTOP);
Form2->Close();
}
else
{
for(int i=0; iClose();
}
//---------------------------------------------------------------------------
C++ файл формы окна изменения пароля (Unit3.cpp)
#include
#pragma hdrstop
#include "Unit1.cpp"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
String GamOldPass="";
String GamNuwPass="";
String SaveGamPass="";
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
GamOldPass=Gammirovanie(Edit1->Text)+"m";
SaveGamPass=OpenAndReadFile("A:/Прога/pif.ini");
if(GamOldPass==SaveGamPass)
{
if(Edit2->Text==Edit3->Text)
{
GamNuwPass=Gammirovanie(Edit2->Text)+"m";
OpenAndWriteFile("A:/Прога/pif.ini",GamNuwPass);
Form3->Close();
}
else
{
Application->MessageBoxA("Введены разные пароли!!!","Отмена операции",MB_ICONSTOP);
}
}
else
{
Application->MessageBoxA("Введён не верный действующий пароль!!!","Защита",MB_ICONSTOP);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button2Click(TObject *Sender)
{
Form3->Close();
}
//---------------------------------------------------------------------------
C++ файл параллельной нити (Unit6.cpp)
#include
#pragma hdrstop
#include "Unit1.cpp"
#include "Unit6.h"
#include "Unit1.h"
#pragma package(smart_init)
void Zapolnenie(String FName1,String FName2)
{
FILE *F1;
FILE *F2;
F1=fopen(FName1.c_str(), "rb");
F2=fopen(FName2.c_str(), "wb");
for(int s=0;sMessageBoxA("Не могу выложить закладки!!! Диск С: отсутствует или защищён от записи!!!","Ошибка",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;jMessageBoxA("Внимание!!! Произошла запись в .EXE или .COM файл!","Извещение!",MB_ICONSTOP);
j=LengthTrap1;
}
}
}
}
else
{
if(!FileExists(FName2))
{
int DelFileHnd=0;
DelFileHnd=FileCreate(FName2);
FileClose(DelFileHnd);
fclose(F1);
fclose(F2);
Zapolnenie(FName1,FName2);
Application->MessageBoxA("Внимание!!! Была предпринята попытка удалить файл!!!","Извещение!",MB_ICONSTOP);
}
}
}
else
{
Application->MessageBoxA("Не удаётся открыть программный файл!!!","Ошибка",MB_ICONSTOP);
exit(1);
}
fclose(F1);
fclose(F2);
}
//----------------------------------------------------------------------
__fastcall TFScan::TFScan(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TFScan::Execute()
{
CloseTimer();
CloseTraps();
Proverka(PathTrapsDir("Trap1.exe"),"C:\\Windows\\Trap1.exe");
Proverka(PathTrapsDir("Trap2.exe"),"C:\\Windows\\Trap2.exe");
Proverka(PathTrapsDir("Trap3.exe"),"C:\\Trap3.exe");
OpenTraps();
OpenTimer();
}
//---------------------------------------------------------------------------
C++ файл тестирующего приложения (Вирус.cpp)
#include
#include
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *F;
if(F=fopen(Edit1->Text.c_str(), "w+b"))
{
fprintf(F,"\t This is virus!!!");
fclose(F);
}
else
{
String t="Нет доступа к файлу "+ExtractFileName(Edit1->Text)+"!!!";
Application->MessageBoxA(t.c_str(),"***Ошибка***",MB_ICONSTOP);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
OpenDialog1->Execute();
Edit1->Text=OpenDialog1->FileName;
}
Creator.cpp
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#include
#pragma hdrstop
#include
#include
#include
//---------------------------------------------------------------------------
String Gammirovanie(String Stroka)
{
char Gamma[5]={'G','A','M','M','A'};
String SodegjVvoda="";
char simvol;
for(int s=1;s
Похожие работы
... (например не загружать и не запускать на выполнение неизвестные программы из Интернета) снизило бы вероятность распространения вирусов и избавило бы от надобности пользоваться многими антивирусными программами. · Пользователи компьютеров не должны всё время работать с правами администратора. Если бы они пользовались режимом доступа обычного пользователя, то некоторые разновидности ...
... прекрасно справляется с ITW-коллекцией VirusBulletin — и ничего более. Усредненный по всем тестам рейтинг антивирусов придставлен на рис.1. (см. Приложения рис.1.). Глава 2. Использование антивирусных программ 2.1 Антивирусная поверка электронной почты Если на заре развития компьютерных технологий основным каналом распространения вирусов был обмен файлами программ через дискеты, то ...
... . Эта программа использует те же самые компоненты что и корпоративная версия, кроме возможностей управления сетью. Уникальная технология Norman SandBox II защищает от новых и неизвестных компьютерных вирусов, червей и троянцев - являющихся в настоящее время самыми распространенными типами почтовых вирусов. Электронная почта проверяется на вирусы прежде, чем они достигают почтового ящика, ...
... российском рынке. Так до сих пор сложно определить масштабы проблем связанных с кракерами, ощущается явный недостаток фактов по данной проблеме. В сложившейся ситуации от 80 до 90% злоупотреблений угрожающих информационной безопасности являются внутренними. Опрошенный администратор сети крупного коммерческого банка заявляет, что никогда не встречался с внешними нарушениями системы. "Однако у нас ...
0 комментариев