Міністерство освіти та науки України
Кіровоградський Державний Технічний університет
Кафедра програмного забезпечення
Курсовий проект
з дисципліни “Програмування на мові ASM-86”
на тему:
“Контроль доступу
до вибраних файлів з веденням протоколу"
Зміст
1. Вступ
2. Постановка задачі
3. Обґрунтування вибору методів розв’язку задачі
4. Алгоритм програми
5. Реалізація програми
6. Системні вимоги
7. Інструкція для користувача
Висновки
Використана література
Додаток
Лістинг програми
1. Вступ
У деяких випадках буває необхідно вестипротокол роботи комп’ютера. Наприклад, записувати клавіші, які натискаються,записувати імена файлів, до яких звертається користувач. Описана програмадозволяє задати список розширень файлів і заносити у файл час і дату доступу доних.
2. Постановка задачі
Треба написати програму, яка б дозволяла вестипротокол доступу до потрібних файлів на диску, використовуючи мовупрограмування асемблер.
3. Обґрунтування вибору методіврозв’язку задачі
Для того, щоб вести контроль доступу дофайлів, необхідно “впіймати" момент, в який відбувається доступ. Системнийсервіс MS-DOS (переривання 21h) містить кілька функцій, які викликаються длязвертання до файлів. Це функції створення, відкриття, закриття, запису тачитання з файлів. Існують функції переміщення позиції та вилучання файлів.
При виклику переривання 21h код функціїзаноситься в регістр AH, і в інші регістри — інша інформація. Якщо перехопитипереривання 21h, то перед обробкою можна перевірити, чи є код в регістрі АНкодом відкриття файла. В цьому випадку перед обробкою файла можна занести вінший файл дату, час та назву файла, до якого звертаються.
Для того, щоб не виникло за циклювання (длязапису в протокол теж використовується функція відкриття!), перед викликомзапису встановлюється прапорець, який вказує, що іде запис протоколу, іпротоколювати цей виклик не треба. По завершенні він скидається.
4. Алгоритм програми
Алгоритм основної частини
1. Перевірити наявність програми у пам’яті.
2. Прочитати з файла filelist. dat списокрозширень файлів.
3. Перехопити вектор переривання 21h
4. Завершитись і залишитись резидентно.
Алгоритм обробника переривання 21h.
1. Перевірити код функції. Якщо це не код 3dh(відкриття файлу), то передати керування стандартному обробнику.
2. Перевірити розширення файла. Якщо воно неспівпадає з жодним з заданих, то передати керування стандартному обробнику.
3. Визначити та сформувати в текстовомувигляді дату і час
4. Відкрити файл, перейти на його останнюпозицію та записати туди ім’я, час та дату.
5. Закрити файл
6. Передати керування стандартному обробнику.
5. Реалізація програми
Програма написана на мові програмуваннянизького рівня Assembler. Її скомпільовано у вигляді COM-файла.
Після початку роботи, згідно алгоритму,відбувається перевірка наявності програми у пам’яті і перехоплення переривання21h. Після цього програма починає обробку.
Програма містить декілька процедур:
read_extensions-читання розширень з filelist. dat
check_extension — перевірка співпаданнярозширень
process_file-запис у файл протоколу інформації
new_21h-новий обробник переривання 21h.
Для доступу до файлів використовуються функціїпереривання 21h. Для отримання часу використовується функція BIOS 1Ah.
6. Системні вимоги
Операційна система MS-DOS (НЕ Windows)
Процесор80286+
Пам’ять640K+
Жорсткий диск 5M+7. Інструкція для користувача
Спочатку необхідно задати типи файлів, якітреба контролювати. У файл filelist. dat необхідно записати розширення іменфайлів, які треба контролювати, наприклад:
exe
com
bat
sys
txt
Після цього необхідно, знаходячись в ДОС,запустити програму filelist. doc. Якщо не виникне помилок, то програмазавантажиться у пам’ять. Якщо програму вже завантажено, то вона видастьвідповідне повідомлення.
Після цього буде створено (якщо немає) файл зпротоколом (по змовчанню c: \temp\filelist. log). При спробі відкрити абозапустити файл з одним із вказаних розширень у протокол буде занесено ім’яфайлу, дату і час події.
Висновки
Отже, за допомогою написаної програми можназаписувати у файл імена, дату і час виклику файлів заданого типу. Програмазаймає мало місця у пам’яті та невибаглива.
Також розглянуто методи побудови резидентнихпрограм і роботу з перериванням 21h.
Використана література
1. П. Абель «Моваасемблера для IBM PC та програмування.» М.: Вища школа, 1992.
2. Конспект лекцій здисципліни “Програмування на мові ASM-86"
ДодатокЛістинг програми
.286
. model tiny
. code
org 100h
start:
jmp begin
old_21h dd 0
flag db 0
log_file db 'c: \temp\filelist. log',0
filename db 200 dup (0)
data_str db '00-00-00 00: 00: 00 — '
eoln db 10,13
extensions db 100*3 dup (0)
fileerror db 'FILELIST. DAT Error! ',10,13,'$'
datname db 'filelist. dat',0
a_load db 'Program is in memory already!!! ',10,13,'$'
check_extension proc
mov di,offset filename-1
di_i:
inc di
mov al,byte ptr [di]
cmp al,0
jne di_i
sub di,3
mov ah,byte ptr [di]
mov bh,byte ptr [di+1]
mov ch,byte ptr [di+2]
mov si,offset extensions
new_name:
mov al,byte ptr [si]
mov bl,byte ptr [si+1]
mov cl,byte ptr [si+2]
cmp al,0
je exit_1
cmp bl,0
je exit_1
cmp cl,0
je exit_1
sub al,ah
sub bl,bh
sub cl,ch
add al,bl
add al,cl
cmp al,0
je exit_2
add si,3
jmp new_name
exit_1:
mov al,0
jmp exit_0
exit_2:
mov al,1
exit_0:
ret
check_extension endp
process_file proc
push es
push ds
pusha
push cs
pop es
; copy filename
mov si,dx
mov di,offset filename
mov cx, 200
rep movsb
push cs
pop ds
; check extension
call check_extension
cmp al,0
jne start_wr
jmp error_p
start_wr:
; open file
mov ah,3dh
mov al,1
mov dx,offset log_file
int 21h
jnc no_er
jmp error_p
no_er:
mov si,ax
; seek eof
mov ah,42h
mov al,2
mov bx,si
xor cx,cx
xor dx,dx
int 21h
mov di,offset data_str
mov ah,4
int 1ah
mov al,cl; year
and al,0fh
add al,30h
mov ah,cl
shr ah,4
add ah,30h
mov byte ptr [di],ah
mov byte ptr [di+1],al
mov al,dh; month
and al,0fh
add al,30h
mov ah,dh
shr ah,4
add ah,30h
mov byte ptr [di+3],ah
mov byte ptr [di+4],al
mov al,dl; day
and al,0fh
add al,30h
mov ah,dl
shr ah,4
add ah,30h
mov byte ptr [di+6],ah
mov byte ptr [di+7],al
mov ah,2
int 1ah
mov al,ch; hour
and al,0fh
add al,30h
mov ah,ch
shr ah,4
add ah,30h
mov byte ptr [di+9],ah
mov byte ptr [di+10],al
mov al,cl; min
and al,0fh
add al,30h
mov ah,cl
shr ah,4
add ah,30h
mov byte ptr [di+12],ah
mov byte ptr [di+13],al
mov al,dh; sec
and al,0fh
add al,30h
mov ah,dh
shr ah,4
add ah,30h
mov byte ptr [di+15],ah
mov byte ptr [di+16],al
; date
mov ah,40h
mov bx,si
mov dx,offset data_str
mov cx,22
int 21h
; write file name
xor cx,cx
mov bx,offset filename
lll:
mov al,byte ptr [bx]
cmp al,0
je st_l
inc cx
inc bx
jmp lll
st_l:; get filename length
mov ah,40h
mov bx,si
mov dx,offset filename
int 21h
; write eoln
mov ah,40h
mov bx,si
mov cx,2
mov dx,offset eoln
int 21h
; close file
mov bx,si
mov ah,3eh
int 21h
error_p:
popa
pop ds
pop es
ret
process_file endp
new_21h:
pushf
cmp ah,3dh
jne no_3d
cmp byte ptr cs: [flag],1
je no_3d
mov ah,2
mov dl,7
int 21h
mov byte ptr cs: [flag],1
call process_file
mov byte ptr cs: [flag],0
no_3d:
popf
jmp dword ptr cs: [old_21h]
rez_end:
buf db 1000 dup (0)
read_extensions proc
mov ah,3dh
mov al,0
mov dx,offset datname
int 21h
jnc all_ok
mov ah,9
mov dx,offset fileerror
int 21h
mov ah,4ch
int 21h
all_ok:
mov si,ax
mov ah,3fh
mov bx,si
mov cx,1000
mov dx,offset buf
int 21h
mov bx,si
mov ah,3eh
int 21h
mov di,offset extensions
mov si,dx
xor cx,cx
mm:
mov al,byte ptr [si]
cmp al,0
je stop_mm
cmp al,61h
jb skip_c
cmp al,7ah
ja skip_c
mov byte ptr [di],al
inc di
inc cx
skip_c:
inc si
cmp cx,290
ja stop_mm
jmp mm
stop_mm:
ret
read_extensions endp
begin:
xor ax,ax
mov es,ax
mov al,byte ptr es: [505h]
cmp al,106
je loaded
mov byte ptr es: [505h],106
push cs
pop es
call read_extensions
mov ah,3dh
xor al,al
mov dx,offset log_file
int 21h
jnc ook
mov ah,3ch
xor cx,cx
mov dx,offset log_file
int 21h
ook:
mov bx,ax
mov ah,3eh
int 21h
xor ax,ax
mov ds,ax
mov ax,word ptr ds: [21h*4]
mov word ptr cs: [old_21h],ax
mov ax,word ptr ds: [21h*4+2]
mov word ptr cs: [old_21h+2],ax
mov ax,offset new_21h
mov word ptr ds: [21h*4],ax
push cs
pop ax
mov word ptr ds: [21h*4+2],ax
mov dx,offset rez_end+1
int 27h
loaded:
mov ah,9
mov dx,offset a_load
int 21h
mov ah,4ch
int 21h
end start