В Паскале стандартные процедуры работы с файлами и системной информацией весьма ограничены: нет прямой возможности управления ресурсами компьютера и их контроля, например, получения значения текущего времени. Назначение же операционной системы - это управление ресурсами и процессами, в частности работа с файловой системой.

В модуле Dos введены процедуры и функции, позволяющие получить доступ к некоторым ресурсам DOS.

Для поиска первого и следующего файла с заданным именем используются соответственно процедуры:

FindFirst (Path:String; Attr:Word; Var S:SearchRec);

FindNext (Var S:SearchRec);

Path - путь и имя искомого файла. При отсутствующем пути поиск производится в текущем каталоге, возможно использование шаблонов.

Attr - задаваемые атрибуты файла. В качестве Attr можно использовать константу AnyFile, означающую любые атрибуты.

S - возвращаемая переменная со следующей структурой:

SearchRec=Record

Fill: Array of byte;

Здесь поле Fill содержит служебную информацию DOS.

Attr - реальные атрибуты файла.

Time - дата и время создания файла в упакованном виде.

Size - размер файла в байтах.

Name - имя найденного файла.

Искомый файл может отсутствовать, поэтому после использования этих и некоторых следующих процедур анализируют системную переменную DosError, описанную выше.

Для распаковки времени создания файла используется процедура:

UnpackTime (Time:LongInt; Var DT:DateTime);

Выходным параметром для неё является запись DT, имеющая следующую структуру:

DateTime = Record

Year, Month, Day, Hour, Min, Sec: Word

Пример: вывод списка файлов из текущего каталога, содержащих тексты программ на языке Паскаль.

Program FindPas;

{ Поиск файлов с Паскаль-программами }

FindFirst ("*.pas",AnyFile,S);

While DosError=0 do

UnpackTime (S.Time,DT);

WriteLn(" Файл ",S.Name," создан ",

DT.Day,".",DT.Month,".",DT.Year,

" время: ",DT.Hour,":",DT.Min,":",DT.Sec,

" размер ",S.Size," байт");

Если необходимо искать файлы не в одном, а в нескольких каталогах, то используют функцию

FSearch (Path:PathStr; DirList:String): PathStr;

Тип PathStr является предопределенным:

PathStr=String ;

Здесь: Path - имя искомого файла, может быть составным.

DirList - список каталогов, в которых будет производиться поиск, каталоги разделяются точкой с запятой, например:

S:= FSearch (‘EDIT.EXE’,’C:\DOS;C:\NC;C:\NU’);


В текущем каталоге поиск производится автоматически. В случае удачного поиска переменной присваивается строка, содержащая составное имя файла, в случае неудачи – пустая строка.

Список каталогов используется аналогично принятым правилам в DOS. Обычно в файле автозапуска AUTOEXEC.BAT содержится команда PATH, присваивающая этой переменной окружения имена каталогов, в которых находятся наиболее часто используемые файлы. В этом случае поиск файлов из среды DOS производится не только в текущем и корневом каталогах, но и в каталогах, указанных в этой команде.

Чтобы воспользоваться этой переменной, в модуле DOS введена функция

GetEnv (EnvVar:String):String;

где в качестве аргумента используется имя переменной окружения. Так, если в файле автозапуска указана команда

PATH C:\DOS;C:\WINDOWS;C:\NC ,

то после выполнения

S:= GetEnv (‘PATH’);

S примет значение

C:\DOS;C:\WINDOWS;C:\NC ,

что может являться аргументом функции FSearch.

Из составного имени файла можно отдельно выделить полный путь, чисто имя и расширение процедурой

FSplit (Path:PathStr; Var Dir:DirStr; Var Name:NameStr; Var Ext:ExtStr);

Типы определены как

DirStr = String ;

NameStr = String ;

ExtStr = String ;

Пример поиска файла.

Program PoiskFile;

{ Пример программы поиска файла }

NameIn,NameFul:PathStr; { входное и составное имя файла }

Writeln(" Введите имя искомого файла: ");

NameFul:=FSearch(NameIn,GetEnv("PATH"));

If NameFul="" then

Writeln("Файл ",NameIn," не найден")

FSplit(NameFul,Dir,Name,Ext);

Writeln("файл ",Name," с расширением ",Ext,

" найден в каталоге ",Dir)

При создании новых файлов часто необходимо знать, достаточно ли места на диске. Для этого можно воспользоваться функциями

DiskSize (Drive:Byte):LongInt;

– определение общего объема указанного логического устройства (диска) в байтах.

DiskFree (Drive:Byte):LongInt;

– определение количества свободных байт на диске.

Номер диска задается как: 0 – текущий, 1 – А, 2 – С и т.д.

Для работы с текущей датой и временем используются процедуры:

GetDate (Var Year,Month,Day,Day_of_week: Word);

– определяет текущую системную дату. Здесь Day_of_week определяет порядковый день недели от 0 до 6, причем 0 означает воскресенье.

Аналогично для установки новой даты:

SetDate (Year,Mount,Day:Word);

Процедура для определения системного времени:

GetTime (Var Hour,Minute,Second,Hund:Word);

Здесь Hund - сотые доли секунды со значением от 0 до 99. Они определяются приблизительно, так как внутренний генератор переключается 18,2 раза в секунду.

Для установки системного времени применяется процедура

SetTime (Hour,Minute,Second,Hund:Word);

Но намного большие возможности дает работа непосредственно с процедурами операционной системы и внешними устройствами.

Для работы с прерываниями в модуле DOS предусмотрены две процедуры вызова прерываний.

Intr (IntNo:Byte; Var Regs: Registers);

IntNo - номер прерывания;

Regs - содержимое регистров процессора следующего типа:

Registers = Record

0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags:Word);

1: (AL,AH,BL,BH,CL,CH,DL,DH:Byte);

То есть поля записи соответствуют либо шестнадцатиразрядным, либо восьмиразрядным регистрам процессора. Например, установка графического режима 640х480 точек, 16 цветов:

Var R:Registers;

R.AH:=0; R.AL:=$12;

Так как очень часто используется вектор прерывания DOS 21H, то добавлена специальная процедура для работы только с этим прерыванием:

MSDos (Var Regs:Registers);

полностью эквивалентная

Intr ($21,Regs);

Например, определение версии DOS:

Var R:Registers;

Writeln (‘MS-DOS ‘,R.AL,’.’,R.AH);

· Модуль DOS . Модуль DOS позволяет использовать возможности операционной системы MS-DOS, не предусмотренные в стандарте языка Паскаль, и содержит типы, константы, переменные и для реализации этих дополнительных возможностей.

Кроме вышеперечисленных стандартных модулей был разработан модуль SetConf , в котором находится функция привязки программы к BIOS компьютера, т. е. защита от копирования.

При запуске программы в первую очередь проверяется целостность системы; т. е. наличие всех файлов системы, соответствуют ли их имена и размеры таблице. Далее происходит инициализация: проверяются параметры BIOS. Если какой либо файл системы был изменен или параметры BIOS не соответствуют установленным в программе, система работать не будет. Для входа в систему необходимо ввести пароль. Эти проверки осуществляются в конструкторе Init объекта TMyApp . Этот же объект инициализирует меню (TMyApp.InitMenu), строку состояния (TMyApp.InitStatusLine), рабочее поле (TMyApp.InitDeskTop), устанавливает специальную цветовую палитру (TMyApp.GetPalette). Обработка событий (нажатие клавиш клавиатуры, работа с “мышью”) осуществляется в методе HandleEvent объекта TMyApp . При выборе какого-либо пункта меню управление передается соответствующему объекту или вызывается нужная подпрограмма.

В программе используются следующие процедуры, функции и объекты:

1. Shifr (процедура). Зашифрование файлов любого типа. Сначала получаем пароль от пользователя, затем создаем файл зашифрованных данных (*.M&A). Исходный файл считывается блоками по 64 word, кодируется с помощью генератора ПСЧ, затем переставляется в соответствии с таблицей, изображенной на рис. 2 . Полученную последовательность записываем в файл с расширением *.M&A и т. д.

2. DeShifr (процедура). Расшифрование файлов, зашифрованных процедурой Shifr .

3. Plus (процедура). Установка защиты паролем или по ключевой дискете на программы.

4. Block (процедура). Защита винчестера от записи.

5. Passwords (процедура). Изменение пароля входа в программу. Сначала запрашивает старый пароль, затем два раза новый.

6. TOptions (объект, потомок объекта TDialog). Выводит диалоговое окно изменения

настроек шифрования файлов: удалять или не удалять исходный файл, высвечивать или не высвечивать индикатор процесса шифрования.

7. CheckExec (процедура). Обрабатывает ошибки DOS.

5. Описание применения программы

Программа предназначена для защиты данных от несанкционированного доступа; в ней реализованы следующие функции:

· шифрование файлов;

· защита паролем исполняемых файлов;

· защита исполняемых файлов с помощью ключевой дискеты;

· отслеживание и реакция на ошибки;

· изменение паролей;

· привязка к BIOS.

Установка системы происходит с ключевой дискеты программой INSTALL. EXE , которая проверяет не была ли установлена система ранее; если нет, то создает на винчестере каталог C:\ SUB ROSA и копирует в него файлы системы (Sub Rosa. exe, Block, KeyDisk, Plus, Passw, Setup. res, System. res ).

При запуске программыSub Rosa. exe сначала проверяется наличие всех файлов системы. Если хотя бы один файл изменен или удален, то система работать не будет. Для работы с программой необходимо ввести пароль.

В верхней части экрана находится полоска меню, состоящая из следующих пунктов:

1. “Файлы”:

- “Выбрать” (выбор файла для работы);

- “Сменить каталог” (смена текущего каталога);

- “Выход в DOS” (временный выход в DOS);

- “Завершение” (завершение работы с программой);

2. “Защита”:

- “Установить пароль” (защита EXE- и COM-файлов паролем);

- “Блокировать винчестер” (запрет записи любых данных на винчестер);

3. “Ключевая дискета”:

- “Добавить проверку по ключу” (защита EXE- и COM-файлов с помощью

ключевой дискеты);

4. “Криптография”:

- “Зашифровать файл данных” (зашифрование выбранного файла);

- “Расшифровать файл данных” (расшифрование выбранного файла);

5. “Настройки”:

- “Криптография” (изменение настроек криптографии);

- “Пароли” (изменение пароля входа в систему);

6. “О Программе” (информация о программе).

Во всех случаях, кроме блокировки винчестера, сначала необходимо выбрать файл для работы. Для установки защиты паролем или по ключевой дискете выбирается EXE- или COM-файл, для шифрования - файл любого типа.

6. Заключение

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

RANK - пакет защиты от НСД. Этот пакет реализует функцию контроля доступа к EXE- и COM-файлам. Следует отметить, что анализ разграничения доступа к программам ставит под серьезное сомнение возможность реализации такой функции без дополнительных мероприятий.

LATCH - комплекс программ защиты ПЭВМ от НСД. Этот комплекс обеспечивает безопасность данных, хранящихся на винчестере. При несанкционированном доступе происходит “зависание” ПЭВМ или не обнаруживается НЖМД.

Тезис о невозможности обнаружения НЖМД вызывает серьезные сомнения: например, для контроллеров SCSI не требуется определение типа НЖМД в памяти CMOS, так как параметры винчестера могут быть считаны с помощью команды контроллера.

Приложение 1

Листинг программы

{****************************************************************************}

{** КП "ЗАЩИТА ДАННЫХ ОТ НСД" **}

{** Выполнили учащиеся гр.46491 ЕГАНОВ МАКСИМ и ЮЗЕФОВИЧ АРТЕМ **}

{****************************************************************************}

{****************************************************************************}

{$M 10240, 0,20480} {Распределение памяти}

Program Sub_Rosa;

App, Dialogs, Drivers, Menus, MsgBox, Objects,

Validate, Views, Memory, StdDlg, Editors, {Модули Turbo Vision, далее - TV}

CRT, DOS, {Стандартные модули}

SetConf; {Модуль функции привязки к BIOS}

MyRes: TResourceFile; {Переменная файла ресурсов, TV}

FName, MainDir, DName: string; {Переменные работы с файлами и каталогами}

MainPass, Pass: string; {Переменные паролей}

FilePass: file of char; {Переменная файла паролей}

OptFile, OptInd: word; {Переменные опций}

Чтобы использовать в программе величины, описанные в интерфейсной части модуля, имя модуля следует указать в разделе uses . Можно записать несколько имен модулей через запятую, например:

program example; uses Average, Graph, Crt;

После этого все описания, расположенные в интерфейсных секциях модулей, становятся известными в программе, и ими можно пользоваться точно так же, как и величинами, определенными в ней непосредственно. Поиск модулей выполняется сначала в библиотеке исполняющей системы, затем в текущем каталоге, а после этого - в каталогах, заданных в диалоговом окне Options (Directories .

Если в программе описана величина с тем же именем, что и в модуле, для обращения к величине из модуля требуется перед ее именем указать через точку имя модуля.

ПРИМЕЧАНИЕ К любой программе автоматически подключается стандартный модуль System , который содержит библиотеку исполняющей системы Паскаля.

Пример использования модуля из пример 4.6 приведен в пример 4.7 . Программа находит разность средних арифметических значений двух вещественных массивов.

Program dif_average; uses Average; var a, b: mas; i: integer; dif, av_a, av_b: real; begin for i:= 1 to n do read(a[i]); for i:= 1 to n do read(b[i]); average(a, av_a); average(b, av_b); dif:= av_a – av_b; writeln("Разность значений ", dif:6:2); end. Листинг 4.7. Разность средних арифметических значений массивов (модуль)

Стандартные модули Паскаля

В Паскале имеется ряд стандартных модулей, в которых описано большое количество встроенных констант, типов, переменных и подпрограмм. Каждый модуль содержит связанные между собой ресурсы. Ниже приводится краткая характеристика модулей Паскаля.

Модуль System

Модуль System содержит базовые средства языка, которые поддерживают ввод-вывод, работу со строками, операции с плавающей точкой и динамическое распределение памяти. Этот модуль автоматически используется во всех программах, его не требуется указывать в операторе uses . Он содержит все стандартные и встроенные процедуры, функции, константы и переменные Паскаля.

Модуль Crt

Program luck; uses crt; const max = 10; var i, k, n: integer; begin clrscr; { очистить экран } randomize; i:= random(max); { загадать число } window(20, 5, 60, 20); { определить окно } TextBackGround(Blue); { цвет фона – синий } clrscr; { залить окно фоном } TextColor(LightGray); { цвет символов – серый } k:= –1; { счетчик попыток } GotoXY(12, 5); writeln(" Введите число: "); repeat { цикл ввода ответа } GotoXY(20, 9); { установить курсор } readln(n); { ввести число } inc(k); until i = n; window(20, 22, 60, 24); { определить окно результата } TextAttr:= 2 shl 4 + 14; { желтые символы за зеленом фоне } clrscr; { залить окно фоном } GotoXY(6, 2); { установить курсор } writeln(" Коэффициент невезучести: ", k / max:5:1); readkey; { ждать нажатия любой клавиши } TextAttr:= 15; { белые символы на черном фоне } clrscr; { очистить после себя экран } end. Листинг 4.8. Пример использования модуля Crt

Генератор случайных чисел формирует число, находящееся в диапазоне от нуля до max – 1 . Пользователь вводит числа в одну и ту же позицию на экране до тех пор, пока не угадает это число. При угадывании с первого раза коэффициент невезучести равен нулю.

Модули Dos и WinDos

Модули Dos и WinDos содержат подпрограммы, реализующие возможности операционной системы MS-DOS, такие как переименование, поиск и удаление файлов, получение и установка системного времени, выполнение программных прерываний и т. д. Эти подпрограммы в стандартном Паскале не определены. Для поддержки подпрограмм в модулях определены константы и типы данных.

Модуль Dos использует строки Паскаля, а WinDos - строки с завершающим нулем.

Модуль Graph

Модуль обеспечивает работу с экраном в графическом режиме.

Экран в графическом режиме представляется в виде совокупности точек - пикселов (pixel, сокращение от picture element ). Цвет каждого пиксела можно задавать отдельно. Начало координат находится в левом верхнем углу экрана и имеет координаты (0, 0). Количество точек по горизонтали и вертикали (разрешение экрана ) и количество доступных цветов зависят от графического режима. Графический режим устанавливается с помощью служебной программы - графического драйвера .

В состав оболочки входят несколько драйверов, каждый из которых может работать в нескольких режимах. Режим устанавливается при инициализации графики либо автоматически, либо программистом. Самый "мощный" режим, поддерживаемый модулем Graph , - 640 480 точек, 16 цветов. Модуль Graph обеспечивает:

Модуль Strings

Модуль Strings предназначен для работы со строками, заканчивающимися нуль-символом, то есть символом с кодом 0 (их часто называют ASCIIZ-строки). Этот вид строк введен в Паскаль специально для работы с длинными строками и программирования под Windows. Модуль Strings содержит функции копирования, сравнения, слияния строк, преобразования их в строки типа string , поиска подстрок и символов.

Тот самый Turbo Pascal, с которого многие начинали.

Язык программирования Pascal был создан Никлаусом Виртом. Назван в честь французского философа и математика XVII века Блеза Паскаля. В то время Вирт был профессором информатики в Федеральном техническом университете в Швейцарии и нуждался в языке, с помощью которого можно было обучать студентов навыкам программирования. Концепция Паскаля была разработана Н. Виртом примерно в 1970 году и Паскаль быстро получил широкое распространение благодаря легкости его изучения, наглядности составленных на нем текстов программ. Поскольку Паскаль послужил основой для разработки других языков программирования, таких как Ада и Модула-2, и поскольку многие языки содержат аналогичные Паскалю структуры, знание Паскаля является солидной базой для изучения других языков программирования. В середине 70-х годов была создана попытка разработать международный стандарт на Паскаль. В результате в 1982 году появился стандарт ISO 7185. Язык Паскаль стараниями Андерса Хейлсберга превратился в мощную профессиональную систему программирования Turbo Pascal. Появление инструментальных средств Borlаnd Pascal with Objects и Delphi для разработки программ в среде Windows лишний раз показала, какие неисчерпаемые возможности таит в себе Паскаль. Borland Pascal и используемый в Delphi язык Object Pascal основываются на Turbo Pascal и развивают его идеи. Delphi - компилятор языка Pascal. Delphi 1 был первым инструментарием разработки Windows приложений, объединившим в себе оптимизирующий компилятор, визуальную среду программирования и мощные возможности работы с базами данных. Годом позже Delphi 2 предложил все то же, но на новом уровне современной 32-битной операционной системы Windows 95 и Windows NT. Кроме того, Delphi 2 предоставил программисту 32-битовый компилятор, создававший более быстрые и эффективные приложения, мощные библиотеки объектов. Продолжительная работа команды разработчиков Delphi привела к появлению в третьей версии продукта расширенного набора инструментов для создания приложений, возможности использования технологий COM для разработки приложений WWW и многих других современных технологий программирования. Delphi 4 является очередным шагом в эволюции компиляторов Паскаля с тех времен, когда более 16 лет назад Андерс Хейлсберг создал первый компилятор Turbo Pascal.

Добавлено--

про "Error 200".

RTL выпуска до 1994-го года ещё не содержала в модуле CRT этой ошибки.
Она появилась после обновления RTL 1994-го года и позднее.

Если использовать даже непропатченную оригинальную RTL 1994-го года с этим багом, но в программе не подключать юнит CRT, то никакой "Error 200" в программе не будет.

И наоборот, стоит только написать в программе "uses crt;", как файл окажется неработоспособен на быстрых машинах, потому что ошибка в том модуле CRT проявлялась уже во время автоматической инициализации библиотеки CRT при старте программы.