Смекни!
smekni.com

Захист файлів від запису (стр. 2 из 2)

3.2 Реалізація задачі

Задача по забезпеченню захисту файлу на гнучкому диску від несанкціонованого запису передбачає створення такої програми, яка б при читанні диску не давала б змоги недозволеному користувач читати інформацію на ній.

Після того, як користувач запустить програму і введе ім’я файлу (File. Txt), що необхідно захистити від запису, програма відкриє цей файл, і витягне з нього один кластер. Місце, де знаходився цей кластер буде помічене як БЕД - блок. Потім програма створить файл на жорсткому диску (File_), в який буде занесено номер кластеру і пароль (пароль користувач повинно ввести в процесі роботи програми). Створивши такий файл програма закінчує свою роботу. Після цього файл на гнучкому диску не можна ні прочитати, ні скопіювати, ні знищити. Цей алгоритм програми дозволяє захистити файл від несанкціонованого копіювання на інший диск. Навіть коли дискету буде втрачено без наявності файлу File_ не можна надати файлу попереднього вигляду.

Список літератури

1. Финогенов К.Г. “Самоучитель по системным функциям MS-DOC".

2. Скэнлон Л. “Персональные ЭВМ IBM PC и XT”

3. Фигурнов: "Работа пользователя с IBM PC".

4. Громов В.И. Васильев Г.А. "Энциклопедия компьютерной безопасности"

5. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT: Пер. с англ. - Финансы и статистика, 1992. - 544 с.

6. Браун Р., Кайл Дж. Справочник по прерываниям для IBM PC: В 2-х томах: Т.1. Пер. с англ. - М.: Мир, 1994. - 558 с. Т.2. Пер. с англ. - М.: Мир, 1994. - 480 с.

Додатки

Текст програми

. model tiny

. data

Boot db 512 dup (0)

Fat1 db 512*9 dup (0)

Root db 512*9 dup (0)

DTA db 2Ch dup (0)

RootRecord db 32 dup (0)

Size_Fat db 0

Clust dw 0

CntSim dw 0

el_DTA dw 0

el_Root dw 0

Save_di dw 0

MassOne dw 0

Sim dw 0

Handle dw?

FileName db 13 dup (0)

File_Nam db 13 dup (0)

New_File db 13 dup (0)

Password db 8 dup (0)

Passwd db 8 dup (0)

InFile db " "

Path db "a: \ "

Inp_file db "Input name of file: $"

Inp_Pass db "Input password: $"

Err_file db "Error name of file... $"

Err_Pass db "Error password... $"

Err_WrtF db "Error write Fat... $"

Err_WrtR db "Error write Root... $"

Select db "Select operatiom: ",13,10,"1 - Protected file",13,10,"2 - DeProtected file",13,10,"$"

. code

SetDTA Proc

mov ah,1ah

mov dx,offset DTA

int 21h

Ret

SetDTA Endp

Perevod Proc

mov ah,2

mov dl,13

int 21h

mov ah,2

mov dl,10

int 21h

Ret

Perevod Endp

ReadBoot Proc; Процедура читання BOOT сектора

mov al,0

mov dx,0

mov cx,1

mov bx,offset Boot

int 25h

pop dx

Ret

ReadBoot Endp

CntFat Proc

mov ah,Boot [16h]

mov Size_Fat,ah

Ret

CntFat Endp

ReadFat Proc; Процедура читання FAT

mov cx,0

mov al,0

mov dx,1

mov cl,Size_Fat

mov bx,offset Fat1

int 25h

pop dx

Ret

ReadFat Endp

ReadRoot Proc

mov al,0

mov dx, 19

mov cx,8

mov bx,offset Root

int 25h

pop dx

Ret

ReadRoot Endp

ReadNameFile Proc; Процедура читання ім’я файлу

mov ah,09h

mov dx,offset Inp_File

int 21h

call SetDTA

mov di,0

NewSimFileName:

mov ah,1

int 21h

cmp al,13

je EndVvod

cmp al,'a'

jl NotBig

cmp al,'z'

jg NotBig

sub al, 20h

NotBig:

mov FileName [di],al

mov File_Nam [di],al

inc di

cmp di,13

jne NewSimFileName

EndVvod:

mov di,0

NewSimPath:

mov ah,FileName [di]

mov Path [di+3],ah

cmp ah,0

je EndPath

inc di

jmp NewSimPath

EndPath:

mov ah,4eh

mov dx,offset Path

mov cx,3Fh

int 21h

jnc FileOk

call Perevod

mov ah,09h

mov dx,offset Err_File

int 21h

mov ah,1

int 21h

jmp Exit0

FileOk:

mov di,12

mov si,10

NewSimName:

mov ah,FileName [di]

dec di

cmp ah,0

je NewS

mov FileName [si],ah

mov bh,0

mov FileName [di+1],bh

dec si

NewS:

cmp ah,'. '

jne NewSimName

mov bh,0

mov FileName [si+1],bh

mov di,0

NewS1:

mov ah,FileName [di]

cmp ah,0

jne NewS2

mov bh,' '

mov FileName [di],bh

NewS2:

inc di

cmp di,11

jne NewS1

Ret

ReadNameFile Endp

NumClust Proc; Процедура, що зчитує номер кластера

mov di,0

NewSimRoot:

mov di,el_Root

mov ah,Root [di]

mov di,el_DTA

mov al,FileName [0]

cmp ah,al

jne Dalee

mov bx,el_Root

mov di,0

mov el_DTA,di

NewSimEqu:

mov di,el_Root

mov ah,Root [di]

mov di,el_DTA

mov al,FileName [di]

cmp ah,al

jne NotEqu

inc CntSim

NotEqu: inc el_Root

inc el_DTA

mov di,el_DTA

cmp di,11

jne NewSimEqu

cmp di,CntSim

jne NotThisFile

sub di,11

mov Save_di,di

jmp Read_Clust

NotThisFile:

mov di,0

mov el_DTA,di

mov CntSim,di

mov el_Root,bx

Dalee: inc di

inc el_Root

mov di,el_Root

cmp di,3200

jne NewSimRoot

Read_Clust:

mov di,el_Root

sub di,11

mov al,Root [di+1ah]

mov ah,Root [di+1bh]

mov Clust,ax

mov bx,0

NewSimRecord:

mov ah,Root [di+bx]

mov RootRecord [bx],ah

inc bx

cmp bx,32

jne NewSimRecord

Ret

NumClust Endp

ReadClusts Proc; Процедура читання кластера

mov ax,Clust

mov bx,0

mov dx,0

mov ax,Clust

mov bx,3

mul bx

mov bx,2

div bx

mov bx,ax

mov cx,Clust

and cx,1

jne NeChet

mov al,Fat1 [bx]

mov ah,Fat1 [bx+1]

mov cx,ax

shr cx,12

shl cx,12

add cx,0FF7h

mov Fat1 [bx],cl

mov Fat1 [bx+1],ch

shl ax,4

shr ax,4

mov MassOne,ax

jmp EndClust

NeChet:

mov al,Fat1 [bx]

mov ah,Fat1 [bx+1]

mov cx,ax

shl cx,12

shr cx,12

add cx,0FF70h

mov Fat1 [bx],cl

mov Fat1 [bx+1],ch

shr ax,4

mov MassOne,ax

EndClust:

Ret

ReadClusts Endp

ReadPassword Proc; Процедура, що читає пароль

call Perevod

mov ah,09h

mov dx,offset Inp_Pass

int 21h

mov di,0

NewSimPassword:

mov ah,8

int 21h

cmp al,13

je EndVvodPass

mov Password [di],al

inc di

cmp di,8

jne NewSimPassword

EndVvodPass:

Ret

ReadPassword Endp

WriteFile Proc; Процедура запису в файл

mov di,0

NewSimN_File:

mov ah,File_Nam [di]

cmp ah,0

je EndVvodN_File

mov New_File [di],ah

inc di

cmp di,13

jne NewSimN_File

EndVvodN_File:

mov ah,'_'

mov New_File [di-1],ah

mov ah,3Ch

mov dx,offset New_File

mov cx,0

int 21h

jnc N_FileOk

mov ah,09h

mov dx,offset Err_File

int 21h

mov ah,1

int 21h

jmp Exit0

N_FileOk:

mov Handle,ax

mov di,Save_di

mov ah,40h

mov bx,Handle

mov cx,32

mov dx,offset RootRecord

int 21h

mov di,0

mov ax,MassOne

mov si,5

NewDec:

mov dx,0

mov bx,10

div bx

mov cx,ax

add dl,30h

mov InFile [si-1],dl

dec si

mov ax,cx

cmp si,0

jne NewDec

mov ah,40h

mov bx,Handle

mov cx,5

mov dx,offset Infile

int 21h

call ReadPassword; Викликаємо процедуру ReadPassword

mov ah,40h

mov bx,Handle

mov cx,di

mov dx,offset Password

int 21h

mov ah,3eh

mov bx,Handle

int 21h

Ret

WriteFile Endp

WriteData Proc; Процедура запису в файл даних

mov ax,0

mov cx,0

mov al,0

mov dx,1

mov cl,Size_Fat

mov bx,offset Fat1

int 26h

pop dx

jnc no_err

call Perevod

mov ah,09h

mov dx,offset Err_WrtF

int 21h

mov ah,1

int 21h

jmp Exit0

no_err:

Ret

WriteData Endp

Coder Proc

call Perevod

call ReadBoot

call CntFat

call ReadFat

call ReadRoot

call ReadNameFile

call NumClust

call ReadClusts

call WriteFile

call WriteData

Ret

Coder Endp

FindNullRecord Proc; Процедура знаходження нульового запису

mov di,0

NewSimFindRecord:

mov ah,Root [di]

inc di

cmp ah,229

jne NewSimFindRecord

dec di

mov Save_di,di

Ret

FindNullRecord Endp

ReadNameFileW Proc; Процедура читання імені записаного файлу

mov ah,09h

mov dx,offset Inp_File

int 21h

call SetDTA

mov di,0

W_NewSimFileName:

mov ah,1

int 21h

cmp al,13

je W_EndVvod

cmp al,'a'

jl W_NotBig

cmp al,'z'

jg W_NotBig

sub al, 20h

W_NotBig:

mov FileName [di],al

inc di

cmp di,13

jne W_NewSimFileName

W_EndVvod:

mov ah,4eh

mov dx,offset FileName

mov cx,3Fh

int 21h

jnc W_FileOk

call Perevod

mov ah,09h

mov dx,offset Err_File

int 21h

mov ah,1

int 21h

jmp Exit0

W_FileOk:

Ret

ReadNameFileW Endp

ReadFile Proc; Процедура читання файлу

mov ah,3dh

mov dx,offset FileName

mov al,2

int 21h

jnc R_FileOk

call Perevod

mov ah,09h

mov dx,offset Err_File

int 21h

mov ah,1

int 21h

jmp Exit0

R_FileOk:

mov Handle,ax

mov ah,3fh

mov bx,Handle

mov cx,32

mov dx,offset RootRecord

int 21h

mov di,0

mov ah,3fh

mov bx,Handle

mov cx,5

mov dx,offset InFile

int 21h

mov di,0

mov ax,0

mov MassOne,ax

mov bx,10000

mov cx,10

NewDec_R:

mov dx,0

mov al, InFile [di]

sub al,30h

mul bx

mov Sim,ax

mov dx,0

mov ax,bx

div cx

mov bx,ax

mov ax,Sim

add MassOne,ax

mov ax,0

inc di

cmp di,5

jne NewDec_R

mov ax,MassOne

call ReadPassword

mov ah,3fh

mov bx,Handle

mov cx,8

mov dx,offset Passwd

int 21h

mov bx,ax

mov ax,0

mov di,0

mov CntSim,ax

NewSimPw:

mov ah,Password [di]

mov al,Passwd [di]

cmp ah,al

jne Dalee0

inc CntSim

Dalee0:

inc di

cmp di,bx

jne NewSimPw

cmp di,CntSim

je PasswdOk

call Perevod

mov ah,09h

mov dx,offset Err_Pass

int 21h

mov ah,1

int 21h

jmp Exit0

PasswdOk:

mov di,Save_di

mov bx,0

NewRR:

mov ah,RootRecord [bx]

mov Root [di+bx],ah

inc bx

cmp bx,32

jne NewRR

Ret

ReadFile Endp

WriteClusts Proc; Процедура запису в файл кластера

mov al,RootRecord [1ah]

mov ah,RootRecord [1bh]

mov Clust,ax

mov ax,Clust

mov bx,0

mov dx,0

mov ax,Clust

mov bx,3

mul bx

mov bx,2

div bx

mov bx,ax

mov cx,Clust

and cx,1

jne NeChetW

mov al,Fat1 [bx]

mov ah,Fat1 [bx+1]

mov cx,ax

shr cx,12

shl cx,12

add cx,MassOne

mov Fat1 [bx],cl

mov Fat1 [bx+1],ch

jmp EndClustW

NeChetW:

mov al,Fat1 [bx]

mov ah,Fat1 [bx+1]

mov cx,MassOne

shl cx,4

mov MassOne,cx

mov cx,ax

shl cx,12

shr cx,12

add cx,MassOne

mov Fat1 [bx],cl

mov Fat1 [bx+1],ch

EndClustW:

Ret

WriteClusts Endp

DeleteFile Proc; Процедура знищення файлу

mov ah,41h

mov dx,offset FileName

int 21h

Ret

DeleteFile Endp

DeCoder Proc

call Perevod

call ReadBoot

call CntFat

call ReadFat

call ReadRoot

call FindNullRecord

call ReadNameFileW

call ReadFile

call WriteClusts

call WriteData

call DeleteFile

Ret

DeCoder Endp

Select_Operation Proc

NewSelect:

call Perevod

mov ah,09h

mov dx,offset Select

int 21h

mov ah,1

int 21h

cmp al,31h

jne NotCoder

call Coder

jmp EndSelect

NotCoder:

cmp al,32h

jne NotDeCoder

call DeCoder

jmp EndSelect

NotDeCoder:

jmp NewSelect

EndSelect:

call Perevod

Ret

Select_Operation Endp

Main Proc

mov ax,@data

mov ds,ax

call Select_Operation

Exit0: mov ah,04ch

int 21h

Main Endp

End Main


Блок-схема алгоритму


Продовження блок-схеми алгоритму: