Рефераты

Защита данных от несанкционированного доступа

begin

P[apColor, 50] := #$11; {1F}

P[apColor, 51] := #$11; {2F}

P[apColor, 1] := #$21; {71}

GetPalette := @P[AppPalette];

end;

{Изменить палитру окна выбора файлов}

function TMyFDialog.GetPalette: PPalette;

const

{Синяя палитра}

CMyCluster =

#64#65#66#67#68#69#70#71#72#73#74#75#76#77#78#79#80#81#82+

#83#84#85#86#87#88#89#90#91#92#93#94#95;

P: string [32] = CMyCluster;

begin

GetPalette := @P;

end;

{Инициализировать окно выбора файлов}

constructor TMyFileDialog.Init(AWildCard: tWildStr;

const ATitle, InputName: string;

AOptions: Word; HistoryId: Byte);

var

ScrollBar: PScrollBar;

R : TRect;

begin

{ Создание окна диалога }

R.Assign(15, 1, 64, 20);

TDialog.Init(R, ATitle);

Options:= Options or ofCentered;

WildCard:= AWildCard;

{ Строка ввода имени файла }

R.Assign(3, 3, 31, 4);

FileName:= New(PFileInputLine, Init(R, 79));

FileName^.Data^:= WildCard;

Insert(FileName);

R.Assign(2, 2, 6, 3);

Insert(New(PLabel, Init(R, InputName, FileName)));

R.Assign(31, 3, 34, 4);

Insert(New(PHistory, Init(R, FileName, HistoryId)));

{ Линейка скроллинга и список файлов }

R.Assign(3, 14, 34, 15);

ScrollBar:= New(PScrollBar, Init(R));

Insert(ScrollBar);

R.Assign(3, 6, 34, 14);

FileList:= New(PFileList, Init(R, ScrollBar));

Insert(FileList);

R.Assign(2, 5, 8, 6);

Insert(New(PLabel, Init(R, 'Файлы', FileList)));

{ Задание кнопок }

R.Assign(35, 3, 46, 5);

if AOptions and fdOpenButton <> 0 then

begin

Insert(New(PButton, Init(

R, 'Открыть', cmFileOpen, bfDefault)));

Inc(R.A.Y,3); Inc(R.B.Y,3);

end;

if AOptions and fdOkButton <> 0 then

begin

Insert(New(PButton, Init(

R, 'Ага', cmFileOpen, bfNormal)));

Inc(R.A.Y,3); Inc(R.B.Y,3);

end;

if AOptions and fdReplaceButton <> 0 then

begin

Insert(New(PButton, Init(

R, 'Замена',cmFileReplace, bfNormal)));

Inc(R.A.Y,3); Inc(R.B.Y,3);

end;

if AOptions and fdClearButton <> 0 then

begin

Insert(New(PButton, Init(

R, 'Удал.',cmFileClear, bfNormal)));

Inc(R.A.Y,3); Inc(R.B.Y,3);

end;

Insert(New(PButton, Init(

R, 'Нека', cmCancel, bfNormal)));

{ Информационная панель с параметрами файла }

R.Assign(1, 16, 48, 18);

Insert(New(PFileInfoPane, Init(R)));

SelectNext(False);

{ Загрузка каталога }

if AOptions and fdNoLoadDir = 0 then

begin

FileList^.ReadDirectory(WildCard);

Directory:= NewStr(GetCurDir);

end;

end;

Var

MyApp: TMyApp; {Переменная основного объекта}

Begin

WriteLn('Система защиты данных от НСД. Версия 1.0 beta.'+

+' 1996 МГВРК Еганов М. Ю., Юзефович А. Г.');

GetIntVec($09,Int09_Save);

MyApp.Init;

MyApp.Run;

MyApp.Done;

SetIntVec($09, Int09_Save);

End.

Приложение 2

Листинг библиотек

{**************************************************************************

*}

{**************************************************************************

*}

{**

**}

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

**}

{** Выполнил учащийся гр.46491 ЕГАНОВ МАКСИМ

**}

{** 1996

**}

{**

**}

{** Программа инсталляции

**}

{**************************************************************************

*}

{**************************************************************************

*}

Program Install;

Uses

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

Views, Memory, StdDlg, CRT, DOS, SetConf;

Const {константы кодов команд}

cmAboutBox = 700;

cmCode = 1001;

cmDeCode = 1002;

cmSetPass = 1005;

cmLockDisk = 1006;

cmOptions = 1007;

cmKeyDisk = 1008;

cmPasswords = 1009;

RMenuBar: TStreamRec = ( {Запись для работы с потоком, TV}

ObjType: 2000;

VmtLink: Ofs(TypeOf(TMenuBar)^);

Load: @TMenuBar.Load;

Store: @TMenuBar.Store);

Var

Save23hInt : Pointer; {Переменные сохранения векторов прерываний}

Save1bhInt : Pointer;

MyApp : TApplication;

MyRes : TResourceFile;

MyStream : PBufStream;

{Формирование подменю "Файлы"}

function MyStdFileMenuItems(Next: pMenuItem): pMenuItem;

begin

MyStdFileMenuItems:=

NewItem('Выбрать...', 'F3', kbF3, cmOpen, hcOpen,

NewItem('Сменить каталог...', '',

kbNoKey, cmChangeDir, hcChangeDir,

NewLine(

NewItem('Выход в ДОС', '', kbNoKey, cmDosShell, hcDosShell,

NewItem('Завершение', 'Alt+X', kbAltX, cmQuit, hcExit,

Next)))));

end;

{Формирование основного меню}

procedure CreateMenuBar;

var

MenuBar: PMenuBar;

R : TRect;

begin

R.Assign(0, 0, 80, 1);

MenuBar:= New(pMenuBar, Init(R, NewMenu(

NewSubMenu('~Ф~айлы', hcNoContext, NewMenu(

MyStdFileMenuItems(nil)),

NewSubMenu('~З~ащита', hcNoContext, NewMenu(

NewItem('~У~становить пароль', 'F5', kbF5, cmSetPass, 1005,

NewItem('~Б~локировать винчестер', '', kbNoKey, cmLockDisk, 1006,

nil))),

NewSubMenu('~К~лючевая дискета', hcNoContext, NewMenu(

NewItem('~Д~обавить проверку по ключу', '', kbNoKey, cmKeyDisk,

1008, nil)),

NewSubMenu('~К~риптография', hcNoContext, NewMenu(

NewItem('Зашифровать файл данных','', kbNoKey, cmCode, 1001,

NewItem('Расшифровать файл данных','', kbNoKey, cmDeCode, 1002,

nil))),

NewSubMenu('~Н~астройки', hcNoContext, NewMenu(

NewItem('Криптография...','F9', kbF9, cmOptions, 1007,

NewItem('Пароли...','F8', kbF8, cmPasswords, 1008, nil))),

NewItem('~О~ программе', '', kbAltJ, cmAboutBox, 700, nil)))))))));

MyRes.Put(MenuBar, Config);

Dispose(MenuBar, Done);

end;

{Процедура управления формой курсора}

procedure SetCursorSize(c_start,c_end:byte);

var

regs: registers;

begin

with regs do

begin

ah:=$01;

ch:=c_start;

cl:=c_end;

end;

intr($10,regs);

end;

{Процедура замены вектора преываний}

{$F+}

procedure My23hInt;Interrupt;

begin

end;

{$F-}

{Процедура копирования файлов}

procedure CopyFyle(FromCopy: string);

const

TempLength = 1125.28;

var

ToCopy : string;

Source, Target : file;

NumRead, NumWrite: word;

buf : string;

TempPos, Temp : real;

begin

{Открыть файлы}

ToCopy := 'c:';

ToCopy := ToCopy + copy(FromCopy, 3, length(FromCopy) - 2);

assign(Source, FromCopy);

assign(Target, ToCopy);

reset(Source, 1);

rewrite(Target, 1);

Temp := 0;

{Копировать}

repeat

BlockRead(Source, Buf, Sizeof(Buf)-1, NumRead);

if FromCopy = 'a:\sub_rosa\sub_rosa.exe' then

begin

TempPos := 100*Temp/TempLength;

Temp := Temp + 2.5;

GotoXY(17, 25);

if (TempPos > 98) and (TempPos < 100) then write('100.0 %')

else write(TempPos: 4: 1, ' %');

end;

{Обработчик ошибок}

if (NumRead<>Sizeof(Buf)-1) and (not EOF(Source)) then

begin

WriteLn;

WriteLn('Ошибка чтения с диска');

SetIntVec($23, Save23hInt);

SetIntVec($1b, Save1bhInt);

halt;

end;

BlockWrite(Target,Buf,NumRead,NumWrite);

If NumRead<>NumWrite then

begin

WriteLn;

WriteLn('На диске не хватает места для записи');

SetIntVec($23, Save23hInt);

SetIntVec($1b, Save1bhInt);

halt;

end;

until NumRead=0;

close(Source);

close(Target);

end;

Var

Directory: string; {Куда копировать}

Begin {Основная часть программы}

GetIntVec($23, Save23hInt); {Подменить вектора прерываний 23h, 1bh}

GetIntVec($1b, Save1bhInt); {Отключение Ctrl-C или Ctrl-Break}

SetIntVec($23, @My23hInt);

SetIntVec($1b, @My23hInt);

SetCursorSize(32, 0);

{$I-}

Directory:='c:\sub_rosa'; {Создать каталог для установки}

MkDir(Directory);

if IOResult <> 0 then {Обработчик ошибок}

begin

WriteLn('Система уже была инсталлирована');

SetIntVec($23, Save23hInt);

SetIntVec($1b, Save1bhInt);

halt;

end;

{$I+}

{Создать файл ресурсов с привязкой к уникальным параметрам BIOS}

MyStream := New(PBufStream, Init('c:\sub_rosa\Setup.res', stCreate,

2048));

MyRes.Init(MyStream);

RegisterType(RMenuBar);

CreateMenuBar;

MyRes.Done;

{Копировать файлы}

CopyFyle('a:\sub_rosa\block.');

CopyFyle('a:\sub_rosa\keydisk.');

CopyFyle('a:\sub_rosa\plus.');

CopyFyle('a:\sub_rosa\passw.');

CopyFyle('a:\sub_rosa\system.res');

GotoXY(1, 25);

Write('Инсталлировано');

CopyFyle('a:\sub_rosa\sub_rosa.exe');

WriteLn;

WriteLn('Система готова к работе');

ChDir('c:\sub_rosa');

Mem[$40:$1a]:=Mem[$40:$1c];

{Восстановить вектора прерываний}

SetIntVec($23, Save23hInt);

SetIntVec($1b, Save1bhInt);

End.

{**************************************************************************

*}

{**************************************************************************

*}

{**

**}

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

**}

{** Выполнил учащийся гр.46491 ЕГАНОВ МАКСИМ

**}

{** 1996

**}

{** **}

{** Модуль привязки к BIOS

**}

{**************************************************************************

*}

{**************************************************************************

*}

Unit SetConf;

Interface

function config: string; {Дата BIOS}

Implementation

{Получить дату BIOS}

function config: string;

var

conf, s: String;

Control: char absolute $F000:$FFF5;

i :byte;

begin

Move(Control, s[1], 8);

s[0] := #8;

for i := 1 to length(s) do conf[i] := chr(ord(s[i]) + 5*i);

conf[0] := #8;

config := conf;

end;

End.

{**************************************************************************

**}

{**************************************************************************

**}

{**

**}

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

**}

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

**}

{** 1996

**}

{**

**}

{** Дописывание к файлу

**}

{**************************************************************************

**}

{**************************************************************************

**}

code segment public

assume cs: code, ds: code, es: code, ss: code

org 80h ;Хвост команды

dta label byte

com_siz db ?

probel db ?

com_par db ?

org 100h

start:

jmp test_par

type_t db ? ;Тип расширения target

len_s dw ? ;Длина source_file

len_t_1 dw ? ;Длина target_file

len_t_2 dw ? ;Длина target_file

hand_1 dw ? ;Обработка source_file

hand_2 dw ? ;Обработка target_file

NameTarOff dw ? ;Смещение имени target_file

NameSouOff dw ? ;Смещение имени source_file

ext_a db 'com', 'exe' ;Допустимые расширения

mbad_use db 10, 13

syn db 10, 13

TEST_PAR:

lea si, dta+1 ;Далее идет проверка

l_0: ;параметров в командной

cmp byte ptr [si], 0Dh ;строке

je c_syn

cmp byte ptr [si], '?'

je c_h

cmp byte ptr [si], ' '

jne not_prob

inc si

jmp short l_0

c_syn:

int 20h

c_h:

int 20h

use:

int 20h

not_prob:

mov NameTarOff, si ;1-ый параметр правильный ?

l_1:

cmp byte ptr [si], 0Dh

je c_b_1_m_2

cmp byte ptr [si], ' '

je c_b_1

cmp byte ptr [si], '.'

je d_t_1

inc si

jmp short l_1

c_b_1_m_2:

jmp use ;Недопустимое расширение

c_b_1: ;у target_file

jmp use

D_T_1: ;Анализ расширения

inc si

call det_type

pop ax

mov type_t, al

cmp ax, 2

je C_B_1

add si, 3

lea cx, dta

add cl, byte ptr dta

adc ch, 0

cmp cx, si

jbe C_M_2

mov byte ptr [si], 0

l_2: ;2-ой параметр

правильный ?

inc si

cmp cx, si

jb c_m_2

cmp byte ptr [si], ' '

je l_2

mov NameSouOff, si

l_3:

cmp byte ptr [si], '.'

je d_t_2

inc si

cmp cx, si

jb c_b_2

jmp l_3 ;Отсутствует source_file

c_m_2:

jmp use

d_t_2:

inc si

call det_type

pop ax

cmp ax, 0

je test_end

c_b_2:

jmp use

test_end:

add si, 2

cmp cx, si

jb c_b_2

mov byte ptr [si+1], 0

OPEN_F: ;Открыть, определить

длину

mov ah, 3dh ;и прочитать в буфер файл

mov al, 2 ;source_file

mov dx, NameSouOff

int 21h

jnc yes_open

int 20h

yes_open: ;Определить длину

mov bx, ax

mov hand_2, ax

mov ah, 42h

xor cx, cx

xor dx, dx

mov al, 2

int 21h

jnc yes_p_1

cn_mov_2:

int 20h

yes_p_1:

mov word ptr len_s, ax

mov ah, 42h

xor cx, cx

xor dx, dx

mov al, 0

int 21h

jc cn_mov_2

mov ah, 3Fh

lea dx, buff

mov cx, word ptr len_s

int 21h

jnc open_targ

int 20h

OPEN_TARG ;Открыть target_file

mov ah, 3Dh

mov al, 2

mov dx, NameTarOff

int 21h

jnc det_len_1

int 20h

det_len_1:

mov hand_1, ax

mov bx, hand_1

mov ah, 42h

xor cx, cx

xor dx, dx

mov al, 2

int 21h

jnc rest_len

jmp cn_mov_1

rest_len:

mov len_t_1, dx

mov len_t_2, ax

TO_PROC: ;Если target_file - COM,

cmp type_t, 0 ;то CALL WR2COM.

je c_com ;Если target_file - EXE,

call wr2exe ;то CALL WR2EXE.

jmp short CLOSE_F

c_com:

call wr2com

CLOSE_F: ;Закрыть файлы

mov ah, 3Eh ;source_file и target_file

mov bx, hand_1

int 21h

jnc cl_2

int 20h

cl_2:

mov ah, 3Eh

mov bx, hand_2

int 21h

jnc OK

int 20h

OK:

mov ah, 9

int 20h

det_type proc ;Подпрограммы

mov bp, sp

push ax

push cx

push di

xor ax, ax

lea di, ext_a

loo_1:

push si

push di

mov cx, 3

repe cmpsb

jne end_loo_1

pop di

pop si

mov [bp+2], ax

jmp d_ret

end_loo_1:

inc al

pop di

add di, 3

pop si

cmp al, 2

jb loo_1

mov [bp+2], ax

d_ret:

pop di

pop cx

pop ax

ret

det_type endp

wr2exe proc

push ax

push bx

push cx

push dx

push si

push di

jmp st_2exe

hdr label byte

dw ?

PartPag dw ?

PageCnt dw ?

dw ?

HdrSize dw ?

dw 5 dup(?)

ExeIP dw ?

ReloCS dw ?

len_hdr equ $-hdr ;Команды, записываемые

imit label byte ;в конец файла

mov ax, es ;Команды записи в стек

I_1: ;адреса начала EXE-файла

add ax, 0

add ax, 10h

push ax

I_2:

mov ax, 0

push ax ;Команды пердачи управления

mov ax, 100h ;source_file, как и для COM

push ax ;файла

db 0C3h

len_imit equ $-imit

st_2exe:

mov ah, 42h ;Читать заголовок EXE-файла

mov bx, hand_1 ;Установить указатель на

xor cx, cx ;начало файла

xor dx, dx

mov al, 0

int 21h

jc cn_mov_1

mov ah, 3Fh

lea dx, hdr

mov cx, len_hdr

int 21h

jnc prep_end

cn_r_1:

int 20h

prep_end: ;Настроить команды,

дописываемые

mov ax, ReloCS ;в конец файла target_file

mov word ptr i_1[1], ax ;Записать в стек адреса

mov ax, ExeIP ;начала EXE-файла

mov word ptr i_2[1], ax ;Передать управление файлу

mov cx, len_t_1 ;source_file по соглашениям

mov dx, len_t_2 ;системы DOS

mov si, cx ;Записать команды в конец

mov di, dx ;EXE-файла

mov ah, 42h

mov al, 0

mov bx, hand_1

int 21h

jnc yes_wr

cn_mov_1:

int 20h

yes_wr:

mov ah, 40h

lea dx, imit

mov cx, len_imit

int 21h

jnc wr_sour

cn_w_1:

int 20h

wr_sour: ;Записать source_file в

конец

mov cx, si ;EXE-файла

mov dx, di

add dx, len_imit

jnc m1

inc cx

m1:

add dx, 15

jnc m2

inc cx

m2:

and dx, 0FFF0h

mov si, cx

mov di, dx

mov ah, 42h

mov al, 0

int 21h

jc cn_mov_1

mov ah, 40h

lea dx, buff

mov cx, len_s

int 21h

jc cn_w_1

mov ax, si

mov bx, di

add bx, ax

mov cl, 4

ror bx, cl

sub bx, 10h

sub bx, HdrSize

mov ReloCS, bx

mov ax, PartPag

and ax, 000Fh

mov bx, ax

add ax, len_imit

add ax, 15

and ax, 0FFF0h

add bx, 100h

sub bx, ax

mov ExeIP, bx

mov ax, si

mov bx, di

add bx, len_s

jnc m3

inc ax

m3:

mov dx, bx

and dx, 1FFh

mov PartPag, dx

add bx, 511

jnc m4

inc ax

m4:

and bh, 0FEh

mov ah, bh

mov cl, 9

ror ax, cl

mov PageCnt, ax ;Записать настроенный

mov ah, 42h ;заголовок в начало

EXE-файла

mov bx, hand_1

xor cx, cx

xor dx, dx

mov al, 0

int 21h

jnc write_1

jmp cn_mov_1

write_1:

mov ah, 40h

lea dx, hdr

mov cx, len_hdr

int 21h

jnc m_ret

jmp cn_w_1

m_ret:

pop di

pop si

pop dx

pop cx

pop bx

pop ax

ret

wr2exe endp

wr2com proc ;Процедура дописывания в

;конец COM-файла

jmp st_2com

new_beg label byte

mov ax, cs

c_1:

add ax, 0

push ax

c_2:

mov ax, 0

push ax

db 0CBh

len_new_beg equ $-new_beg

com label byte

mov di, 100h

push cs

pop ds

c_3:

mov ax, 0

c_4:

add ax, 0

and AX, 000Fh

mov bx, 16

sub bx, ax

and bx, 000Fh

add bx, len_new_beg

mov ax, 100h

sub ax, bx

mov si, ax

mov cx, len_new_beg

rep movsb

push es

pop ds

push es

mov ax, 100h

push ax

push ax

db 0C3h

len_com equ $-com

old_beg label byte

db len_new_beg dup(?)

len_im equ $-com

st_2com:

mov bx, hand_1

mov ah, 42h

xor cx, cx

xor dx, dx

mov al, 0

int 21h

jnc read_beg

jmp cn_mov_2

read_beg:

mov ah, 3Fh

lea dx, old_beg

mov cx, len_new_beg

int 21h

jnc prep_beg

jmp cn_r_1

prep_beg:

mov ax, len_t_1

mov bx, len_t_2

add bx, len_im

jnc pr1

inc ax

pr1:

add bx, 15

and bx, 0FFF0h

add bx, ax

mov cl, 4

ror bx, cl

mov word ptr c_1[1], bx

mov ax, len_t_2

and ax, 000Fh

mov bx, ax

add ax, len_im

add ax, 15

and ax, 0FFF0h

add bx, 100h

sub bx, ax

mov word ptr c_2[1], bx

mov bx, hand_1

mov ah, 42h

xor cx, cx

xor dx, dx

mov al, 0

int 21h jnc wr_beg

jmp cn_mov_2

wr_beg:

mov ah, 40h

lea dx, new_beg

mov cx, len_new_beg

int 21h

jnc prep_c_end

jmp cn_w_1

prep_c_end:

mov ax, len_t_2

mov word ptr c_3[1], ax

mov word ptr c_4[1], len_im

mov bx, hand_1

mov ah, 42h

mov cx, len_t_1

mov dx, len_t_2

mov al, 0

int 21h

jnc wr_end

jmp cn_mov_2

wr_end:

mov ah, 40h

lea dx, com

mov cx, len_im

int 21h

jnc cal_b

jmp cn_w_1

cal_b:

mov cx, len_t_1

mov dx, len_t_2

add dx, len_im

jnc cal_1

inc cx

cal_1:

add dx, 15

jnc cal_2

inc cx

cal_2:

and dx, 0FFF0h

mov bx, hand_1

mov ah, 42h

mov al, 0

int 21h

jnc wr_sr

jmp cn_mov_2

wr_sr:

mov ah, 40h

lea dx, buff

mov cx, len_s

int 21h

jnc end_2com

jmp cn_w_1

end_2com:

ret

wr2com endp

buff label byte

copyright db 'Copyright(C) Юзефович Артем ( МГВРК,'

db ' Минск ), 1996'

db 0Dh, 0Ah, 'Программа дописывания'

db ' по вирусному принципу.', 0Dh, 0Ah

db 0Dh, 0Ah, 0Dh, 0Ah, '$'

code ends

end start

{**************************************************************************

**}

{**************************************************************************

**}

{**

**}

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

**}

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

**}

{** 1996

**}

{**

**}

{** Пароль на файл

**}

{**************************************************************************

**}

{**************************************************************************

**}

сode segment

assume cs: code, ds:code, es: code, ss: code

org 100h

start: jmp print

enter_pas label byte

db 'E'+60h, 80h,'n'+60h, 80h,'t'+60h, 80h,'e'+60h, 80h

db 'r'+60h, 80h

db 80h, 80h, 80h

db 'P'+60h, 80h,'a'+60h, 80h,'s'+60h, 80h,'s'+60h, 80h

db 'w'+60h, 80h,'o'+60h, 80h,'r'+60h, 80h,'d'+60h, 80h,

':'+60h

db 6Ah, 6Dh

len_enter equ $-enter_pas

password label byte

db 'm'+60h, '&'+60h, 'a'+60h ;Пароль m&a

len_pas equ $-password ;Счетчик повторов

count_err equ 3

buff label byte

db len_pas dup(?)

print:

push es

push ds

push cs

push cs ;Адресация регистров

pop es

mov cx, count_err ;Инициализация

счетчика

pr_1: ;Печать приглашения

mov ah, 2

mov bx, 0

pr_ent:

mov dl, enter_pas[bx]

sub dl, 60h

int 21h

inc bx

cmp bx, len_enter

jb pr_ent

push cx

mov cx, len_pas ;Ввести пароль

lea di, buff

rd_pass:

mov al, 7

mov ah, 0Ch

int 21h

stosb

loop rd_pass

pop cx

mov bx, 0

cmp_p:

mov al, password[bx] ;Сравнить пароль с

введенным

sub al, 60h

cmp al, buff[bx]

jne repeat

inc bx

cmp bx, len_pas

jb cmp_p

equal:

pop ds ;Пароль верный

pop es ;Перейти к основной

db 0CBh ;программе

repeat:

loop pr_1

dos:

jmp cs_1

ms_1 db '*', 10, 13, '$'

cs_1:

mov ah, 9 ;Пароль не верный

lea dx, ms_1

int 21h ;Вывести сообщение

mov ah, 4Ch

int 21h ;Выйти в DOS

copyright db 'Copyright(C) Юзефович Артем ( МГВРК,'

db ' Минск ), 1996'

db 0Dh, 0Ah, 'Запрос'

db ' пароля.', 0Dh, 0Ah

db 0Dh, 0Ah, 0Dh, 0Ah, '$'

code ends

end start

{**************************************************************************

**}

{**************************************************************************

**}

{**

**}

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

**}

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

**}

{** 1996

**}

{**

**}

{** Ключевая дискета

**}

{**************************************************************************

**}

{**************************************************************************

**}

code segment

assume cs: code, ds:code, es: code, ss: code

org 100h ;Счетчик команд-100h

start: jmp print

recsize equ 512 ;Размер сектора

buffer db recsize dup(?) ;Буферы ввода-вывода

bufrez db recsize dup(?)

buffer1 db recsize dup(?)

protect label byte

db 'T'+60h,'h'+60h,'i'+60h,'s'+60h

db 80h, 80h

db 'i'+60h,'s'+60h

db 80h, 80h

db 'k'+60h,'e'+60h,'y'+60h

db 80h, 80h

db 'd'+60h,'i'+60h,'s'+60h,'k'+60h

len_enter2 equ $-protect ;Длина сообщения

dsk_key label byte

db 'Э'+10h,'т'+10h,'о'+10h

db 30h, 30h

db 'н'+10h,'е'+10h

db 30h, 30h

db 'к'+10h,'л'+10h,'ю'+10h,'ч'+10h

db 'е'+10h,'в'+10h,'а'+10h,'я'+10h

db 30h, 30h

db 'д'+10h,'и'+10h,'с'+10h,'к'+10h

db 'е'+10h,'т'+10h,'а'+10h

db 6Ah-50h, 6Dh-50h

len_enter1 equ $-dsk_key ;Длина сообщения

enter_pas label byte

db 'В'+10h, 30h,'с'+10h, 30h,'т'+10h, 30h,'а'+10h, 30h

db 'в'+10h, 30h, 'ь'+10h, 30h, 'т'+10h, 30h, 'е'+10h, 30h

db 30h, 30h, 30h

db 'к'+10h, 30h,'л'+10h, 30h,'ю'+10h, 30h,'ч'+10h, 30h

db 'е'+10h, 30h,'в'+10h, 30h,'у'+10h, 30h,'ю'+10h, 30h

db 30h, 30h, 30h

db 'д'+10h, 30h,'и'+10h, 30h,'с'+10h, 30h,'к'+10h, 30h

db 'е'+10h, 30h,'т'+10h, 30h,'у'+10h, 30h

db 30h, 30h, 30h

db 'и'+10h

db 30h, 30h, 30h

db 'н'+10h, 30h,'а'+10h, 30h,'ж'+10h, 30h,'м'+10h, 30h

db 'и'+10h, 30h,'т'+10h, 30h,'е'+10h, 30h

db 30h, 30h

db 'В'+10h, 'В'+10h, 'О'+10h, 'Д'+10h

db 6Ah-50h, 6Dh-50h

len_enter equ $-enter_pas ;Длина сообщения

print:

push es ;Сохранение регистров

push ds

push cs

push cs

pop ds ;cs=>ds

pop es ;cs=>es

mov ah, 2

mov bx, 0

pr_ent:

mov dl, enter_pas[bx] ;Вывод сообщения

sub dl, 10h

int 21h

inc bx

cmp bx, len_enter

jb pr_ent

mov ah, 08h ;Ожидание нажатия Ввода

int 21h

mov al, 0

mov cx, 1

mov dx, 1

mov bx, offset buffer

int 25h ; считали FAT

pop dx ;25h и 26h оставляют лишнее

mov al, 0 ;слово в стеке, извлекаем его

mov cx, 1

mov dx, 1

mov bx, offset bufrez ;Сохраняем резервную копию

int 25h ;FAT

pop dx

mov bx, offset buffer ;Процедура,которая определяет

mov ax, 118 ;запись FAT по номеру сектора

mov cx, ax

shl ax, 1

add ax, cx

test ax, 1

pushf

shr ax, 1

add bx, ax

mov ax, [bx]

popf

jnz getFAT11

and ax, 0FFFh

jmp getFAT21

getFAT11:

shr ax, 4

getFAT21:

cmp ax, 0ff7h ;1-ая проверка. BAD-?

jne no_disk1 ;НЕТ

mov bx, offset buffer ;ДА

mov ax, 120

mov cx, ax

shl ax, 1

add ax, cx

test ax, 1

pushf

shr ax, 1

add bx, ax

mov ax, [bx]

popf

jnz getFAT111

and ax, 0FFFh

jmp getFAT212

getFAT111:

shr ax, 4

getFAT212:

cmp ax, 0ff7h ;2-ая проверка. BAD-?

jne no_disk1 ;НЕТ

jmp f1

no_disk1:

jmp no_disk

f1:

good macro x, y ;Макроопределение,

которое

mov bx, offset buffer ;помечает сектор, как

mov ax, x ;свободный(занятый, плохой)

mov cx, ax

shl ax, 1

add ax, cx

test ax, 1

pushf

shr ax, 1

add bx, ax

popf

mov ax, y

mov [bx], ax

endm

good 118, 0h ;Пометить, как свободный

good 120, 0h ;Пометить, как свободный

fat macro b

mov al, 0

mov cx, 1

mov dx, 1

mov bx, offset b

int 26h ;Записали 1-ую копию FAT

pop dx

endm

fat buffer ;Запись FAT

mov al, 0

mov cx, 1

mov dx, 248

mov bx, offset buffer1

int 25h ;Считываем сектор

pop dx

mov bx, 0

mov ax, 0

pr_ent2:

mov dh, protect[bx] ;3-яя проверка. Проверяется

cmp buffer1[bx], dh ;наличие на диске

jne g1 ;закодированной информации

jmp g2

g1:

inc ax

g2:

inc bx

cmp bx, len_enter2

jb pr_ent2

cmp ax, 0

jne no_disk

mov al, 0

mov cx, 1

mov dx, 244

mov bx, offset buffer

int 26h ;Попытка записи на сектор

pop dx

mov al, 0

mov cx, 1

mov dx, 244

mov bx, offset buffer1

int 25h ;Попытка чтения с сектора

pop dx

cld ;df=0

lea si, buffer

lea di, buffer1

mov cx, 512

mov ax, 0

l:

cmpsb ;Сравнение записанной и

jne l1 ;считаной информации

jmp l2

l1: inc ax

l2: loop l

cmp ax, 5

jl no_disk

fat bufrez ;Запись FAT

pop ds

pop es

db 0cbh ;RetF. Перейти на программу

no_disk: ;Это не ключевая дискета

mov ah, 2

mov bx, 0

pr_ent1:

mov dl, dsk_key[bx] ;Вывод сообщения

sub dl, 10h

int 21h

inc bx

cmp bx, len_enter1

jb pr_ent1

fat bufrez ;Запись FAT

mov ah, 4ch ;Выход в DOS

mov al, 0

int 21h

copyright db 'Copyright(C) Юзефович Артем ( МГВРК,'

db ' Минск ), 1996'

db 0Dh, 0Ah, 'Ключевая'

db ' дискета.', 0Dh, 0Ah

db 0Dh, 0Ah, 0Dh, 0Ah, '$'

code ends

end start

;**************************************************************************

**

;**************************************************************************

**

;**

**

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

**

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

**

;** 1996

**

;**

**

;** Защита винчестера

**

;**************************************************************************

**

;**************************************************************************

**

keybd_flags_1_ equ 417h ;Флаги клавиатуры

data_10e equ 0

seg_a segment byte public

assume cs:seg_a, ds:seg_a

org 100h ;Счетчик команд

Block proc far

start:

jmp real_start

data_1 db 1

data_2 dw 7241h, 6574h

data_4 dw 2E6dh, 2020h

data_6 dw 2020h, 2020h

flag1 db 0

flag2 db 0

flag3 db 0

allf db 0

nameF db 'C:\sub_rosa\block.com', 0

Block endp

int_09h_entry proc far ;Процедура обработки 09h

push ax ;прерывания

push ds

mov al,cs:allf

xor al,1

mov cs:allf,al

jmp k2

k:

mov cs:allf,1

k2:

in al,60h ;Обращение к порту

клавиатуры

cmp al,32h ;Проверка на нужную

je l1 ;комбинацию

cmp al,08h

je l2

cmp al,1eh

je l3

jmp loc_1

l1:

mov cs:flag1,1

jmp loc_2

l2:

cmp cs:flag1,0

je loc_1

mov cs:flag2,1

jmp loc_2

l3:

cmp cs:flag2,0

je loc_1

mov cs:flag3,1

jmp loc_2

loc_1:

pop ds

pop ax

cmp cs:allf,1

jne r2

mov cs:flag1,0

mov cs:flag2,0

mov cs:flag3,0

r2:

jmp dword ptr cs:data_2

loc_2:

sub ax,ax

mov ds,ax

test byte ptr ds:keybd_flags_1_,8

jz loc_1 ;Alt нажата ?

in al,61h

mov ah,al ;Слудующий код необходим

для

or al,80h ;отработки аппаратного

out 61h,al ;прерывания

xchg ah,al

out 61h,al

mov al,20h ;Послать сигнал "конец

out 20h,al ;прерывания" контроллеру

;прерываний 8259

push bx

mov ah,0Fh

int 10h ;Video display

;ah=functn 0Fh

;get state, al=mode,

bh=page

;ah=columns on screen

cmp cs:flag1,1

jne loc_6

cmp cs:flag2,1

jne loc_6

cmp cs:flag3,1

jne loc_6

cmp al,1

je loc_3 ;Jump if equal

cmp al,3

jne loc_6 ;Jump if not equal

loc_3:

mov ax,0B800h

mov ds,ax ;Установка ключа проверки

mov al,cs:data_1 ;для 13h прерывания

xor al,1

mov cs:data_1,al

test al,1

jz loc_4 ;Jump if zero

mov ax,7458h ;Вывод символа

jmp short loc_5

db 90h

loc_4:

mov ax,744Fh ;Вывод символа

loc_5:

mov cs:flag1,0

mov cs:flag2,0

mov cs:flag3,0

mov ds:data_10e,ax

loc_6:

mov cs:allf,1

pop bx

pop ds

pop ax

iret ;Interrupt return

int_09h_entry endp

int_2Fh_entry proc far ;Mультиплексное

прерывание

cmp ah,13h

je loc_7 ;Jump if equal

jmp dword ptr cs:data_6

loc_7:

mov bx,0F000h

mov es,bx

mov bx,0FFF0h

mov dx,bx

iret ;Interrupt return

int_2Fh_entry endp

sub_1 proc near

sub ax,ax

mov ds,ax

mov ax,[bx+2]

mov es,ax

mov bx,[bx]

mov byte ptr es:[bx],0CFh

retn

sub_1 endp

int_13h_entry proc far ;Процедура обработки 13h

cmp ax,1059h ;прерывания

jne loc_8 ;Jump if not equal

cmp dx,2517h

jne loc_8 ;Jump if not equal

xchg dx,ax

iret ;Interrupt return

int_13h_entry endp

loc_8:

test cs:data_1,1 ;Проверка на ключ

jnz loc_10 ;Jump if not zero

loc_9:

jmp dword ptr cs:data_4 ;Вернуться к 13h

прерыванию

loc_10:

push ax

push bx

push ds

push es

mov bx,4

call sub_1

mov bx,0Ch

call sub_1

pop es

pop ds ;Далее слудуют проверки

pop bx ;функций 13h прерывания

pop ax

cmp ah,3

je loc_11 ;Jump if equal

cmp ah,5

je loc_11 ;Jump if equal

cmp ah,6

je loc_11 ;Jump if equal

cmp ah,7

je loc_11 ;Jump if equal

cmp ah,0Bh

je loc_11 ;Jump if equal

cmp ah,1Ah

jne loc_9 ;Jump if not equal

loc_11:

mov dl,3

jmp short loc_9

real_start:

mov ax,1059h ;Block уже загружен ?

mov dx,2517h

int 13h

cmp ax,2517h

jne loc_12 ;Jump if not equal

cmp dx,1059h

jne loc_12 ;Jump if not equal

mov ax,4C01h ;Выход в DOS

int 21h

loc_12:

mov ax,3509h

int 21h

mov data_2,bx ;Запомнить адрес 09h INT

mov bx,es

mov word ptr data_2+2,bx

mov dx,offset int_09h_entry

mov ax,2509h

int 21h ;Установка нового 09h INT

mov ax,3513h

int 21h

mov data_4,bx ;Запомнить адрес 13h INT

mov bx,es

mov word ptr data_4+2,bx

mov dx,offset int_13h_entry

mov ax,2513h

int 21h ;Установка нового 13h INT

mov ax,352Fh

int 21h

mov data_6,bx ;Запомнить адрес 2Fh INT

mov bx,es

mov word ptr data_6+2,bx

mov dx,offset int_2Fh_entry

mov ax,252Fh

int 21h ;Установка нового 2Fh INT

;Необходимое число

параграфов

;памяти

mov cs:data_1, 0

mov ah, 41h

push cs

pop ds

mov dx, offset nameF

int 21h

mov cs:data_1, 1

mov dx,((offset pgm_len+15)/16)+10h

mov ax,3100h ;Завершить и оставить

int 21h ;резидентным

data_8 db 'Защита Винчестера. '

copyright db 'Copyright(C) Юзефович Артем ( МГВРК,'

db ' Минск ), 1996'

db 0Dh, 0Ah, 'Винчестер'

db ' блокирован.', 0Dh, 0Ah

db 0Dh, 0Ah, 0Dh, 0Ah, '$'

pgm_len equ $-Block ;Длина программы

seg_a ends

end start

Приложение 3

Пример работы программы

В качестве примера работы программы приведем текстовый файл до

зашифрования:

“Sub Rosa - втайне (буквально: под розой).

У древних римлян роза была эмблемой тайны. Когда хозяин дома вешал

розу над пиршественным столом, гости знали, что все сказанное должно

оставаться тайной.

Впоследствии изображение розы на потолке помещений, где

происходили совещания, свидетельствовало о том, что все сказанное

здесь не должно быть разглашено.”

и после зашифрования:

9

Страницы: 1, 2, 3


© 2010 БИБЛИОТЕКА РЕФЕРАТЫ