7146-1 (588359), страница 3
Текст из файла (страница 3)
5. Описание применения программы
Программа предназначена для защиты данных от несанкционированного доступа; в ней реализованы следующие функции:
шифрование файлов;
защита паролем исполняемых файлов;
защита исполняемых файлов с помощью ключевой дискеты;
отслеживание и реакция на ошибки;
изменение паролей;
привязка к BIOS.
Установка системы происходит с ключевой дискеты программой INSTALL.EXE, которая проверяет не была ли установлена система ранее; если нет, то создает на винчестере каталог C:\SUB ROSA и копирует в него файлы системы (Sub Rosa.exe, Block, KeyDisk, Plus, Passw, Setup.res, System.res).
При запуске программы Sub Rosa.exe сначала проверяется наличие всех файлов системы. Если хотя бы один файл изменен или удален, то система работать не будет. Для работы с программой необходимо ввести пароль.
В верхней части экрана находится полоска меню, состоящая из следующих пунктов:
“Файлы”:
— “Выбрать” (выбор файла для работы);
— “Сменить каталог” (смена текущего каталога);
— “Выход в DOS” (временный выход в DOS);
— “Завершение” (завершение работы с программой);
“Защита”:
— “Установить пароль” (защита EXE- и COM-файлов паролем);
— “Блокировать винчестер” (запрет записи любых данных на винчестер);
“Ключевая дискета”:
— “Добавить проверку по ключу” (защита EXE- и COM-файлов с помощью ключевой дискеты);
“Криптография”:
— “Зашифровать файл данных” (зашифрование выбранного файла);
— “Расшифровать файл данных” (расшифрование выбранного файла);
“Настройки”:
— “Криптография” (изменение настроек криптографии);
— “Пароли” (изменение пароля входа в систему);
“О Программе” (информация о программе).
Во всех случаях , кроме блокировки винчестера, сначала необходимо выбрать файл для работы. Для установки защиты паролем или по ключевой дискете выбирается EXE- или COM-файл, для шифрования — файл любого типа.
6. Заключение
В заключении проведем анализ некоторых систем защиты от копирования. Следует отметить, что этот анализ не является исчерпывающим, так как эти системы постоянно развиваются, а также не всегда можно получить исчерпывающее описание алгоритмов — разработчики не стремятся раскрывать принципы их построения.
RANK — пакет защиты от НСД. Этот пакет реализует функцию контроля доступа к EXE- и COM-файлам. Следует отметить, что анализ разграничения доступа к программам ставит под серьезное сомнение возможность реализации такой функции без дополнительных мероприятий.
LATCH — комплекс программ защиты ПЭВМ от НСД. Этот комплекс обеспечивает безопасность данных , хранящихся на винчестере. При несанкционированном доступе происходит “зависание” ПЭВМ или не обнаруживается НЖМД.
Тезис о невозможности обнаружения НЖМД вызывает серьезные сомнения: например, для контроллеров SCSI не требуется определение типа НЖМД в памяти CMOS, так как параметры винчестера могут быть считаны с помощью команды контроллера.
Приложение 1
Листинг программы
Program Sub_Rosa;
Uses
App, Dialogs, Drivers, Menus, MsgBox, Objects,
Validate, Views, Memory, StdDlg, Editors, {Модули Turbo Vision, далее - TV}
CRT, DOS, {Стандартные модули}
SetConf; {Модуль функции привязки к BIOS}
Var
MyRes : TResourceFile; {Переменная файла ресурсов, TV}
FName, MainDir, DName: string; {Переменные работы с файлами и каталогами}
MainPass, Pass : string; {Переменные паролей}
Pos : string[3];
FilePass : file of char; {Переменная файла паролей}
OptFile, OptInd : word; {Переменные опций}
Int09_Save : pointer; {Переменная адреса 09h прерывания}
Const {Константы кодов команд, TV}
cmAboutBox = 700; {Окно "О Программе"}
cmCode = 1001; {Кодировать файл}
cmDeCode = 1002; {Декодировать файл}
cmSetPass = 1005; {Установить пароль на вход в систему}
cmLockDisk = 1006; {Запретить доступ к винчестеру}
cmOptions = 1007; {Опции криптографии}
cmKeyDisk = 1008; {Ключевая дискета}
cmPasswords = 1009; {Пароль на исполняемый файл}
cmChangePass= 1010; {Сменить пароль на вход в систему}
SetPass = 'passw.com';
KeyDisk = 'keydisk.com';
RMenuBar: TStreamRec = ( {Запись для работы с потоком, TV}
ObjType: 2000;
VmtLink: Ofs(TypeOf(TMenuBar)^);
Load: @TMenuBar.Load;
Store: @TMenuBar.Store);
Type
{Установка опций криптографии}
POptions = ^TOptions;
TOptions = object(TDialog)
constructor Init;
end;
{Объект для работы с текстом}
PMyStaticText = ^TMyStaticText;
TMyStaticText = object(TStaticText)
function GetPalette: PPalette; virtual; {Переопределение палитры}
end;
{Объекты для работы с файлами и каталогами}
PMyFDialog = ^TMyFDialog;
TMyFDialog = object(TFileDialog)
function GetPalette: PPalette; virtual;
end;
PMyFileDialog = ^TMyFileDialog;
TMyFileDialog = object(TMyFDialog)
constructor Init(AWildCard: tWildStr; const ATitle,
InputName: string; AOptions: Word; HistoryId: Byte);
end;
PDirDialog = ^TDirDialog;
TDirDialog = object(TChDirDialog)
function GetPalette: PPalette; virtual;
end;
PMyChDirDialog = ^TMyChDirDialog;
TMyChDirDialog = object(TDirDialog)
constructor Init(AOptions: Word; HistoryId: Word);
procedure SetUpDialog;
function Valid(Command: Word): Boolean; virtual;
end;
{Установка основного фона программы}
PMyBackground = ^TMyBackground;
TMyBackground = object(TBackground)
Text: TTitleStr;
constructor Init(var Bounds: TRect; AText: TTitleStr);
procedure Draw; virtual;
end;
PMyDesktop = ^TMyDesktop;
TMyDesktop = object(TDesktop)
procedure InitBackground; virtual;
end;
{Объект "О Программе"}
PAboutBox = ^TAboutBox;
TAboutBox = object(TDialog)
constructor Init;
end;
{Основной объект}
PMyApp = ^TMyApp;
TMyApp = object(TApplication)
constructor Init; {инициализация}
destructor Done; virtual; {завершение работы}
procedure HandleEvent(var Event: TEvent); virtual; {обработка событий}
procedure InitMenuBar; virtual; {инициализация меню}
procedure InitDeskTop; virtual; {инициализация рабочего поля}
procedure InitStatusLine; virtual; {инициализация строки состояния}
procedure FileOpen(WildCard: PathStr); {окно для работы с файлами}
function GetPalette: PPalette; virtual; {изменение стандартной палитры}
end;
{ Русифицированная функция формирования сообщения }
function MyMessageBoxRect(var R: TRect;
const Msg: string; Params: pointer;
AOptions: word): word;
const
ButtonName: array[0..3] of string[6] = ('Ага', 'Нека', 'Ага', 'Нека');
Commands: array[0..3] of Word = (cmYes, cmNo, cmOK, cmCancel);
Titles: array[0..3] of string[11] =
('Предупреждение', 'Ошибка', 'Информация', 'Подтверждение');
var
I, X : integer;
Dialog : PDialog;
Control: PView;
S : string;
begin
Dialog:= New(PDialog, Init(R, Titles[AOptions and $3]));
with Dialog^ do
begin
Options:= Options or ofCentered;
R.Assign(3, 2, Size.X - 2, Size.Y - 3);
FormatStr(S, Msg, Params^);
Insert(New(PStaticText, Init(R, S)));
X:= -2;
R.Assign(0, 0, 10, 2);
for I:= 0 to 3 do
if AOptions and ($0100 shl I) <> 0 then
Inc(X, R.B.X - R.A.X + 2);
X:= (Size.X - X) shr 1;
for I:= 0 to 3 do
if AOptions and ($0100 shl I) <> 0 then
begin
Control:= New(PButton, Init(
R, ButtonName[I], Commands[i], bfNormal));
Insert(Control);
Control^.MoveTo(X, Size.Y - 3);
Inc(X, Control^.Size.X + 2);
end;
SelectNext(False);
end;
if AOptions and mfInsertInApp = 0 then
MyMessageBoxRect:= DeskTop^.ExecView(Dialog)
else
MyMessageBoxRect:= Application^.ExecView(Dialog);
Dispose(Dialog, Done);
end;
{ Русифицированная функция формирования сообщения
стандартного размера }
function MyMessageBox(const Msg: String;
Params: Pointer; AOptions: Word): Word;
var
R: TRect;
begin
R.Assign(0, 0, 40, 9);
MyMessageBox:= MyMessageBoxRect(R, Msg, Params, AOptions);
end;
function GetCurDir: DirStr;
var
CurDir: DirStr;
begin
GetDir(0, CurDir);
if Length(CurDir) > 3 then
begin
Inc(CurDir[0]);
CurDir[Length(CurDir)]:= '\';
end;
GetCurDir:= CurDir;
end;
{Процедура инициализации окна работы с файлами}
procedure TMyApp.FileOpen(WildCard: PathStr);
var
FileName: FNameStr;
begin
FileName:= '*.*';
if ExecuteDialog(New(PMyFileDialog, Init(
WildCard, 'Открыть файл', 'Имя', fdOpenButton,
100)), @FileName) <> cmCancel then FName:=FileName;
{открыть файл, потом...}
end;
{****************************************************************************}
{*----------============= К Р И П Т О Г Р А Ф И Я ================----------*}
{****************************************************************************}
{Шифрование файлов}
procedure Shifr(InputFileName: string);
const
A = 5; {Константы для}
C = 27; {генератора}
M = 65536; {псевдослучайных чисел, далее - ПСЧ}
var
TempFile : file of byte;
InpF, OutF : file of word; {файлы на входе и выходе}
Password, Password1 : string; {переменные для работы с паролями}
OutputFileName, Exten : string; {переменные имен файлов}
I, J, K, tmp : byte; {переменные кодирования}
Temp, SCode, TByte, Code: word;
Position : LongInt; {переменные данных о процессе}
NowPos : real;
TPassword : array [1..255] of word;
MasByte, Mas, MasEnd, PS: array [1..64] of word; {массивы перестановок}
T : array [0..64] of word;
DirInfo, DirInfo1 : SearchRec; {данные о файле}
begin
if length(FName) > 3 then {Файл выбран?}
begin
{Получить пароль}
Password := '';
Password1 := '';
InputBox('П А Р О Л Ь', ' Введите пароль:', Password, 255);
InputBox('П А Р О Л Ь', 'Введите пароль еще раз:', Password1, 255);
if (Password = Password1) and (length(Password)<>0) then
begin
{Преобразовать файл}
FindFirst(InputFileName, AnyFile, DirInfo);
if DOSError = 0 then
begin
if DirInfo.Size mod 2 = 1 then
begin
assign(TempFile, InputFileName);
reset(TempFile);
while not EOF(TempFile) do read(TempFile, tmp);
tmp := 255;
write(TempFile, tmp);
close(TempFile);
end;
{Преобразовать имя файла}
Position := 0;
assign(InpF, InputFileName);
reset(InpF);
for i := length(InputFileName) downto 1 do
if InputFileName[i] = '.' then
begin
OutputFileName := copy(InputFileName, 1, i) + 'M&A';
break;
end;
assign(OutF, OutputFileName);
rewrite(OutF);
for i:= 0 to length(InputFileName) do
if InputFileName[length(InputFileName) - i] = '.' then
case i of
0: Exten := chr(0) + chr(0) + chr(0);
1: Exten := copy(FName, length(FName)-2, i) + chr(0) + chr(0);
2: Exten := copy(FName, length(FName)-2, i) + chr(0)
else Exten := copy(FName, length(FName)-2, 3)
end;
for i := 1 to 3 do
begin
Temp := ord(Exten[i]);
Write(OutF, Temp);
end;
{Начать шифрование}
k := 1;
repeat
begin
{Считать из исходного файла блок размером 64*word}
for i:=1 to 64 do
If EOF(InpF) then MasByte[i] := 0 else Read(InpF, MasByte[i]);
Mas := MasByte;
T[0] := ord(Password[k]);
if k < length(Password) then inc(k) else k := 1;
for i:= 1 to 64 do
begin