Разработка антивирусного монитора (kursovik)

Посмотреть архив целиком

К2.004.216.ПЗ

Министерство образования РФ

Тульский государственный университет

Кафедра ЭВМ

Защита системного программного обеспечения

Курсовая работа

Антивирусный монитор

Выполнил студент /Трутнев Е.В./

гр.230901 дата подпись

Проверил: /Савин Н.И./

дата подпись

Тула 2003

Оглавление

Оглавление 2

1. Анализ существующих вариантов решения задачи и выбор наиболее приемлемого 3

1.1. Антивирусные мониторы 3

1.2. Обнаружение загрузочного вируса 4

1.3. Обнаружение файлового вируса 5

1.4. Выбор методов построения антивирусного монитора 7

2. Постановка задачи на проектирование 8

2.1. Метод ведения мониторинга вирусоподобных ситуаций 8

2.2. Метод защиты файлов от несанкционированного использования, изменения и модификации – «Эксклюзив». 10

2.3. Методы построения системы защиты от несанкционированного копирования и использования приложения 11

2.3.1. Метод фиксации аппаратной платформы 11

2.3.2. Метод шифровки ключевой информации 11

3. Модель нарушителя и системы защиты 12

4. Разработка алгоритмов для выбранных методов решения 13

4.1. Метод защиты файлов диска «Эксклюзив» 13

4.2. Метод защиты от копирования программы 14

4.3. Гаммирование 15

5. Руководство системного программиста по установке комплекса 16

6. Организационные требования к эксплуатации системы защиты 16

Обзор литературных источников 17

Приложение 1: Листинг программы 18

Приложение 2: Список глобальных переменных 29

Приложение 3: Описание основных функций 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. Руководство системного программиста по установке комплекса

  1. Запустить, содержащийся на инсталляционной дискете, самораспаковывающийся архив.

  2. Извлечь содержимое архива в нужную папку.

  3. Выполнить файл «Amonit.exe». При этом из папки программы удалится файл «Creator.exe» и создастся файл «dbpg.ini».

  4. Не закрывайте сразу программу, через некоторое время появятся три пробные ошибки, сигнализирующие о том, что антивирусный монитор установлен и успешно функционирует.

6. Организационные требования к эксплуатации системы защиты

  1. Выполняемость комплекса. Системный администратор обязан следить за выполняемостью комплекса при каждой перезагрузке операционной системы, в противном случае его использование теряет смысл.

  2. Резервное копирование. В связи с не высокой надёжностью магнитных носителей (дискет), содержащих ключевую информацию, в целях сохранности полной функциональности комплекса, необходимо периодически осуществлять резервное копирование инсталляционной дискеты.

  3. Ограничение доступа. Системный администратор обязан полностью контролировать доступ других пользователей к системе защиты и пресекать все попытки несанкционированного доступа.

  4. Оптимизация работы комплекса. Для оптимальной работы системы защиты и, как следствие, операционной системы в целом, системный администратор должен периодически пересматривать набор средств защиты.

Обзор литературных источников

  1. Фигурнов В.Э. IBM PC для пользователя – М.: «ИНФРА-М», 1995 г. – 432с.: ил.

  2. CD – 500 Русских учебников. Истории о вирусах. М.: - НАВИГАТОР 2001 г.

  3. Теоретические основы компьютерной безопасности. Учебное пособие для вузов. – М.: Радио и связь 2000 – 189с.

  4. Шамис В.А. – «Borland C++ Builder 5 - Техника визуального программирования»: Москва-2001

  5. Чмора А.Л. «Современная прикладная криптография» 2-е изд., стер. – М.: Гелиос АРВ, 2002. – 256 с.: ил.

  6. Борн Г. Реестр Windows 98: Пер. с англ. – СПб.:БХВ-Петербург,2003 г. – 496 с.: ил.

  7. Архангельский А.Я. – Программирование в С++Builder 6 – М.: ЗАО «Издательство БИНОМ», 2002 г. – 1152 с.: ил.

  8. Стефан Р. Дэвис – «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 <fcntl.h> //для эксклюзивного доступа


#include

#include

#include


#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include "Unit5.h"

#include "Unit6.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "cdiroutl"

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------


String PathDir;

String PathToTraps=ExtractFileDir(GetCommandLine()).c_str()+1;


TFScan *SecondProcess;

int trapshnd[3];

int hndsys[3];

int M[2000]; //ограничение числа открываемых .EXE файлов

int glob=0;

String ZashDrives="";

int ZashFiles=0;

int ZashFolders=0;

int ExeFiles=0;

int ComFiles=0;


String Gammirovanie(String Stroka)

{

char Gamma[5]={'G','A','M','M','A'};

String SodegjVvoda="";

char simvol;

for(int s=1;s

{

if (s<=5)

{

simvol=Stroka[s];

if (((int)Gamma[s-1]+(int)simvol)>=255)

{

simvol=((char)((int)simvol+(int)Gamma[s-1]-255));

SodegjVvoda=SodegjVvoda+String((char)((int)simvol));

}

else

{

SodegjVvoda=SodegjVvoda+String((char)((int)Gamma[s-1]+(int)simvol));

}

}

}

return SodegjVvoda;

}

//---------------------------------------------------------------------------



String OpenAndReadFile(String FName)

{

String pas="";

String SoderjDiska="";

FILE *F;

F=fopen(FName.c_str(), "r");

if(FileExists(FName))

{

for(int s=0;!feof(F);s++)

{

SoderjDiska=pas;

pas=pas+(char)(getc(F));

}

}

fclose(F);

return SoderjDiska;

}

//---------------------------------------------------------------------------


void OpenAndWriteFile(String FName, String WordInFile)

{

String pas="";

String SoderjDiska="";

FILE *F;

F=fopen(FName.c_str(), "w");

if(FileExists(FName))

{

fputs(WordInFile.c_str(),F);

}

fclose(F);

}

//---------------------------------------------------------------------------


String DataBios(void)

{

String ItogData="";

unsigned char far * addr = (unsigned char far *) 0xffff5;

for(int s=0;s<8;s++)

{

ItogData=ItogData+(char)*addr;

*addr++;

}

return ItogData;

}

//---------------------------------------------------------------------------


void StelsProgram(void) //обеспечивает скрытость процесса от регистрации Windows

{

typedef DWORD (CALLBACK* LPFNDLLFUNC1)(DWORD,DWORD);

HINSTANCE hdll;

LPFNDLLFUNC1 f1;

hdll = LoadLibrary("Kernel32.dll");

f1 = (LPFNDLLFUNC1)GetProcAddress(hdll,"RegisterServiceProcess");

(f1)(0,1);

}

//---------------------------------------------------------------------------


void CloseTraps(void)

{

FileClose(trapshnd[0]);

FileClose(trapshnd[1]);

FileClose(trapshnd[2]);

}

//---------------------------------------------------------------------------


String PathTrapsDir(String Tr)

{

PathDir = PathToTraps+"\\Traps\\"+Tr;

return PathDir;

}

//---------------------------------------------------------------------------


void OpenTraps (void)

{

trapshnd[0]=FileOpen(PathTrapsDir("Trap1.exe"), fmShareExclusive);

trapshnd[1]=FileOpen(PathTrapsDir("Trap2.exe"), fmShareExclusive);

trapshnd[2]=FileOpen(PathTrapsDir("Trap3.exe"), fmShareExclusive);

}

void ExclusiveOpenAllExeAndComFilesOnDrive(void)

{

CloseTraps();

for(int j=1; j<=Form1->CDirectoryOutline1->Lines->Count; j++)

{

if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)

{

Form1->CDirectoryOutline1->Items[j]->Expand();

ZashFolders++;

}

else

{

ZashFolders++;

}

Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;

String vrem;

for(int i=0; iFileListBox1->Count; i++)

{

vrem=Form1->FileListBox1->Items->Strings[i];

if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")

{

String Rassh=AnsiLowerCase(ExtractFileExt(Form1->FileListBox1->Items->Strings[i]));

if(Rassh==".exe")

{

M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);

glob++;

ExeFiles++;

FileSetAttr(Form1->FileListBox1->Items->Strings[i], NULL);

}

else if(Rassh==".com")

{

M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);

glob++;

ComFiles++;

FileSetAttr(Form1->FileListBox1->Items->Strings[i], NULL);

}

else if(Rassh==".bat")

{

M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);

glob++;

FileSetAttr(Form1->FileListBox1->Items->Strings[i], NULL);

}

}

}

}

Form1->CDirectoryOutline1->Refresh();

}

//---------------------------------------------------------------------------


__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

WinExec("Creator.exe",SW_MAXIMIZE);

DeleteFile("Creator.exe");

String DataBiosFileName="dbpg.ini";

if(FileExists(DataBiosFileName))

{

String Itog=OpenAndReadFile(DataBiosFileName);

String Itog1=Gammirovanie(DataBios());

if(Itog1!=Itog)

{

Application->MessageBoxA("Нелегальная копия программы!!!","Защита",MB_ICONSTOP);

exit(1);

}

else

{

Form1->CDirectoryOutline1->Items[1]->Collapse();

}

_sopen(DataBiosFileName.c_str(),O_RDONLY,SH_DENYRW); //обеспечивает экскл. доступ к файлу

}

else

{

Application->MessageBoxA("Нарушение целостности программы!!!","Защита",MB_ICONSTOP);

exit(1);

}

StelsProgram();

CDirectoryOutline1->Items[1]->Collapse();

}

//---------------------------------------------------------------------------


void SecuritySystemsBootFiles(void)

{

String CmdCom="C:/Windows/Command.com";

String CmdComOsn="C:/Command.com";

String AutoExecBat="C:/AutoExec.bat";


hndsys[0]=FileOpen(CmdCom ,fmShareExclusive);

hndsys[1]=FileOpen(CmdComOsn ,fmShareExclusive);

hndsys[2]=FileOpen(AutoExecBat ,fmShareExclusive);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button7Click(TObject *Sender)

{

Form4->Visible=true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)

{

Form3->Visible=true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

Form2->Visible=true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button6Click(TObject *Sender)

{

Form1->Hide();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Form5->Visible=true;

ZashDrives=ZashDrives+" "+DriveComboBox1->Drive;

Form4->Label8->Caption=ZashDrives;


ExclusiveOpenAllExeAndComFilesOnDrive();

OpenTraps();


ZashFiles=ComFiles+ExeFiles;

Form4->Label9->Caption=ZashFolders;

Form4->Label10->Caption=ZashFiles;

Form4->Label11->Caption=ExeFiles;

Form4->Label12->Caption=ComFiles;

Form5->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::DriveComboBox1Change(TObject *Sender)

{

CDirectoryOutline1->Drive=DriveComboBox1->Drive;

CDirectoryOutline1->Items[1]->Collapse();

CDirectoryOutline1->Items[1]->Expand();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

FileClose(hndsys[0]);

FileClose(hndsys[1]);

FileClose(hndsys[2]);

SecuritySystemsBootFiles();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{

FileClose(hndsys[0]);

FileClose(hndsys[1]);

FileClose(hndsys[2]);

}

void __fastcall TForm1::OnClose(TWMClose& a)

{

Form2->Visible=true;

}

//---------------------------------------------------------------------------


void CloseTimer(void)

{

Form1->Timer1->Enabled=false;

}

//---------------------------------------------------------------------------


void OpenTimer(void)

{

Form1->Timer1->Enabled=true;

}

//---------------------------------------------------------------------------


void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

SecondProcess = new TFScan(true);

SecondProcess->Resume();

}

//---------------------------------------------------------------------------


void __fastcall TForm1::Button8Click(TObject *Sender)

{

Form5->Visible=true;

for(int j=1; j<=Form1->CDirectoryOutline1->Lines->Count; j++)

{

if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)

{

Form1->CDirectoryOutline1->Items[j]->Expand();

}

Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;

String vrem;

for(int i=0; iFileListBox1->Count; i++)

{

vrem=Form1->FileListBox1->Items->Strings[i];

if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")

{

M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareDenyWrite);

}

}

}

Form1->CDirectoryOutline1->Refresh();

Form5->Visible=false;

}

//---------------------------------------------------------------------------


void __fastcall TForm1::Button9Click(TObject *Sender)

{

Form5->Visible=true;

for(int j=1; j<=Form1->CDirectoryOutline1->Lines->Count; j++)

{

if(Form1->CDirectoryOutline1->Items[j]->Expanded==false)

{

Form1->CDirectoryOutline1->Items[j]->Expand();

}

Form1->FileListBox1->Directory=Form1->CDirectoryOutline1->Items[j]->FullPath;

String vrem;

for(int i=0; iFileListBox1->Count; i++)

{

vrem=Form1->FileListBox1->Items->Strings[i];

if(vrem!="Trap1.exe")if(vrem!="Trap2.exe")if(vrem!="Trap3.exe")

{

M[glob]=FileOpen(Form1->FileListBox1->Items->Strings[i] ,fmShareExclusive);

}

}

}

Form1->CDirectoryOutline1->Refresh();

Form5->Visible=false;

}

//---------------------------------------------------------------------------

C++ файл формы парольного окна (Unit2.cpp)

#include

#pragma hdrstop


#include "Unit1.cpp"

#include "Unit2.h"

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm2 *Form2;

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------


void __fastcall TForm2::Button1Click(TObject *Sender)

{

String Itog1=Gammirovanie(Edit1->Text)+"m";

String Itog=OpenAndReadFile("A:/Прога/pif.ini");

Edit1->Text="";

if(Itog!=Itog1)

{

Application->MessageBoxA("Не верный пароль!!!","Защита",MB_ICONSTOP);

Form2->Close();

}

else

{

for(int i=0; i

{

FileClose(M[glob]);

}

exit(1);

}

}

//---------------------------------------------------------------------------

void __fastcall TForm2::Button2Click(TObject *Sender)

{

Form2->Close();

}

//---------------------------------------------------------------------------

C++ файл формы окна изменения пароля (Unit3.cpp)

#include

#pragma hdrstop


#include "Unit1.cpp"

#include "Unit3.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm3 *Form3;

//---------------------------------------------------------------------------


String GamOldPass="";

String GamNuwPass="";

String SaveGamPass="";


__fastcall TForm3::TForm3(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------


void __fastcall TForm3::Button1Click(TObject *Sender)

{

GamOldPass=Gammirovanie(Edit1->Text)+"m";

SaveGamPass=OpenAndReadFile("A:/Прога/pif.ini");

if(GamOldPass==SaveGamPass)

{

if(Edit2->Text==Edit3->Text)

{

GamNuwPass=Gammirovanie(Edit2->Text)+"m";

OpenAndWriteFile("A:/Прога/pif.ini",GamNuwPass);

Form3->Close();

}

else

{

Application->MessageBoxA("Введены разные пароли!!!","Отмена операции",MB_ICONSTOP);

}

}

else

{

Application->MessageBoxA("Введён не верный действующий пароль!!!","Защита",MB_ICONSTOP);

}

}

//---------------------------------------------------------------------------

void __fastcall TForm3::Button2Click(TObject *Sender)

{

Form3->Close();

}

//---------------------------------------------------------------------------

C++ файл параллельной нити (Unit6.cpp)