Міністерство освіти та науки України
Кіровоградський Державний Технічний університет
Кафедра програмного забезпечення
Курсовий проект
з дисципліни “Програмування на мові 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: empfilelist. 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: empfilelist. 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