Главная Учебники - Разные Лекции (разные) - часть 33
Міністерство освіти та науки України Кіровоградський Державний Технічний університет Кафедра програмного забезпечення Курсовий проект
з дисципліни “Програмування на мові ASM-86” на тему: “Контроль доступу до вибраних файлів з веденням протоколу" Зміст 1. Вступ 2. Постановка задачі 3. Обґрунтування вибору методів розв’язку задачі 4. Алгоритм програми 5. Реалізація програми 6. Системні вимоги 7. Інструкція для користувача Висновки Використана література Додаток Лістинг програми У деяких випадках буває необхідно вести протокол роботи комп’ютера. Наприклад, записувати клавіші, які натискаються, записувати імена файлів, до яких звертається користувач. Описана програма дозволяє задати список розширень файлів і заносити у файл час і дату доступу до них. Треба написати програму, яка б дозволяла вести протокол доступу до потрібних файлів на диску, використовуючи мову програмування асемблер. Для того, щоб вести контроль доступу до файлів, необхідно “впіймати" момент, в який відбувається доступ. Системний сервіс MS-DOS (переривання 21h) містить кілька функцій, які викликаються для звертання до файлів. Це функції створення, відкриття, закриття, запису та читання з файлів. Існують функції переміщення позиції та вилучання файлів. При виклику переривання 21h код функції заноситься в регістр AH, і в інші регістри - інша інформація. Якщо перехопити переривання 21h, то перед обробкою можна перевірити, чи є код в регістрі АН кодом відкриття файла. В цьому випадку перед обробкою файла можна занести в інший файл дату, час та назву файла, до якого звертаються. Для того, щоб не виникло за циклювання (для запису в протокол теж використовується функція відкриття!), перед викликом запису встановлюється прапорець, який вказує, що іде запис протоколу, і протоколювати цей виклик не треба. По завершенні він скидається. Алгоритм основної частини 1. Перевірити наявність програми у пам’яті. 2. Прочитати з файла filelist. dat список розширень файлів. 3. Перехопити вектор переривання 21h 4. Завершитись і залишитись резидентно. Алгоритм обробника переривання 21h. 1. Перевірити код функції. Якщо це не код 3dh (відкриття файлу), то передати керування стандартному обробнику. 2. Перевірити розширення файла. Якщо воно не співпадає з жодним з заданих, то передати керування стандартному обробнику. 3. Визначити та сформувати в текстовому вигляді дату і час 4. Відкрити файл, перейти на його останню позицію та записати туди ім’я, час та дату. 5. Закрити файл 6. Передати керування стандартному обробнику. Програма написана на мові програмування низького рівня Assembler. Її скомпільовано у вигляді COM-файла. Після початку роботи, згідно алгоритму, відбувається перевірка наявності програми у пам’яті і перехоплення переривання 21h. Після цього програма починає обробку. Програма містить декілька процедур: read_extensions-читання розширень з filelist. dat check_extension - перевірка співпадання розширень process_file-запис у файл протоколу інформації new_21h-новий обробник переривання 21h. Для доступу до файлів використовуються функції переривання 21h. Для отримання часу використовується функція BIOS 1Ah. Операційна система MS-DOS (НЕ Windows) Процесор80286+ Пам’ять640K+ Жорсткий диск 5M+ Спочатку необхідно задати типи файлів, які треба контролювати. У файл 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
|