|
Контроль доступу до вибраних файлів з веденням протоколу
Контроль доступу до вибраних файлів з веденням протоколу
4 Міністерство освіти та науки України Кіровоградський Державний Технічний університет Кафедра програмного забезпечення Курсовий проект з дисципліни “Програмування на мові ASM-86” на тему: “Контроль доступу до вибраних файлів з веденням протоколу" Зміст - 1. Вступ
- 2. Постановка задачі
- 3. Обґрунтування вибору методів розв'язку задачі
- 4. Алгоритм програми
- 5. Реалізація програми
- 6. Системні вимоги
- 7. Інструкція для користувача
- Висновки
- Використана література
- Додаток
- Лістинг програми
1. ВступУ деяких випадках буває необхідно вести протокол роботи комп'ютера. Наприклад, записувати клавіші, які натискаються, записувати імена файлів, до яких звертається користувач. Описана програма дозволяє задати список розширень файлів і заносити у файл час і дату доступу до них.2. Постановка задачіТреба написати програму, яка б дозволяла вести протокол доступу до потрібних файлів на диску, використовуючи мову програмування асемблер.3. Обґрунтування вибору методів розв'язку задачіДля того, щоб вести контроль доступу до файлів, необхідно “впіймати" момент, в який відбувається доступ. Системний сервіс MS-DOS (переривання 21h) містить кілька функцій, які викликаються для звертання до файлів. Це функції створення, відкриття, закриття, запису та читання з файлів. Існують функції переміщення позиції та вилучання файлів.При виклику переривання 21h код функції заноситься в регістр AH, і в інші регістри - інша інформація. Якщо перехопити переривання 21h, то перед обробкою можна перевірити, чи є код в регістрі АН кодом відкриття файла. В цьому випадку перед обробкою файла можна занести в інший файл дату, час та назву файла, до якого звертаються.Для того, щоб не виникло за циклювання (для запису в протокол теж використовується функція відкриття!), перед викликом запису встановлюється прапорець, який вказує, що іде запис протоколу, і протоколювати цей виклик не треба. По завершенні він скидається.4. Алгоритм програмиАлгоритм основної частини1. Перевірити наявність програми у пам'яті.2. Прочитати з файла filelist. dat список розширень файлів.3. Перехопити вектор переривання 21h4. Завершитись і залишитись резидентно.Алгоритм обробника переривання 21h.1. Перевірити код функції. Якщо це не код 3dh (відкриття файлу), то передати керування стандартному обробнику.2. Перевірити розширення файла. Якщо воно не співпадає з жодним з заданих, то передати керування стандартному обробнику.3. Визначити та сформувати в текстовому вигляді дату і час4. Відкрити файл, перейти на його останню позицію та записати туди ім'я, час та дату.5. Закрити файл6. Передати керування стандартному обробнику.5. Реалізація програмиПрограма написана на мові програмування низького рівня Assembler. Її скомпільовано у вигляді COM-файла.Після початку роботи, згідно алгоритму, відбувається перевірка наявності програми у пам'яті і перехоплення переривання 21h. Після цього програма починає обробку.Програма містить декілька процедур:read_extensions-читання розширень з filelist. datcheck_extension - перевірка співпадання розширеньprocess_file-запис у файл протоколу інформаціїnew_21h-новий обробник переривання 21h.Для доступу до файлів використовуються функції переривання 21h. Для отримання часу використовується функція BIOS 1Ah.6. Системні вимогиОпераційна система MS-DOS (НЕ Windows)Процесор80286+Пам'ять640K+Жорсткий диск 5M+7. Інструкція для користувачаСпочатку необхідно задати типи файлів, які треба контролювати. У файл filelist. dat необхідно записати розширення імен файлів, які треба контролювати, наприклад:execombatsystxtПісля цього необхідно, знаходячись в ДОС, запустити програму filelist. doc. Якщо не виникне помилок, то програма завантажиться у пам'ять. Якщо програму вже завантажено, то вона видасть відповідне повідомлення.Після цього буде створено (якщо немає) файл з протоколом (по змовчанню c: \temp\filelist. log). При спробі відкрити або запустити файл з одним із вказаних розширень у протокол буде занесено ім'я файлу, дату і час події.ВисновкиОтже, за допомогою написаної програми можна записувати у файл імена, дату і час виклику файлів заданого типу. Програма займає мало місця у пам'яті та невибаглива.Також розглянуто методи побудови резидентних програм і роботу з перериванням 21h.Використана література1. П. Абель "Мова асемблера для IBM PC та програмування." М.: Вища школа, 1992.2. Конспект лекцій з дисципліни “Програмування на мові ASM-86"ДодатокЛістинг програми.286. model tiny. codeorg 100hstart:jmp beginold_21h dd 0flag db 0log_file db 'c: \temp\filelist. log',0filename db 200 dup (0)data_str db '00-00-00 00: 00: 00 - 'eoln db 10,13extensions db 100*3 dup (0)fileerror db 'FILELIST. DAT Error! ',10,13,'$'datname db 'filelist. dat',0a_load db 'Program is in memory already!!! ',10,13,'$'check_extension procmov di,offset filename-1di_i:inc dimov al,byte ptr [di]cmp al,0jne di_isub di,3mov ah,byte ptr [di]mov bh,byte ptr [di+1]mov ch,byte ptr [di+2]mov si,offset extensionsnew_name:mov al,byte ptr [si]mov bl,byte ptr [si+1]mov cl,byte ptr [si+2]cmp al,0je exit_1cmp bl,0je exit_1cmp cl,0je exit_1sub al,ahsub bl,bhsub cl,chadd al,bladd al,clcmp al,0je exit_2add si,3jmp new_nameexit_1:mov al,0jmp exit_0exit_2:mov al,1exit_0:retcheck_extension endpprocess_file procpush espush dspushapush cspop es; copy filenamemov si,dxmov di,offset filenamemov cx, 200rep movsbpush cspop ds; check extensioncall check_extensioncmp al,0jne start_wrjmp error_pstart_wr:; open filemov ah,3dhmov al,1mov dx,offset log_fileint 21hjnc no_erjmp error_pno_er:mov si,ax; seek eofmov ah,42hmov al,2mov bx,sixor cx,cxxor dx,dxint 21hmov di,offset data_strmov ah,4int 1ahmov al,cl; yearand al,0fhadd al,30hmov ah,clshr ah,4add ah,30hmov byte ptr [di],ahmov byte ptr [di+1],almov al,dh; monthand al,0fhadd al,30hmov ah,dhshr ah,4add ah,30hmov byte ptr [di+3],ahmov byte ptr [di+4],almov al,dl; dayand al,0fhadd al,30hmov ah,dlshr ah,4add ah,30hmov byte ptr [di+6],ahmov byte ptr [di+7],almov ah,2int 1ahmov al,ch; hourand al,0fhadd al,30hmov ah,chshr ah,4add ah,30hmov byte ptr [di+9],ahmov byte ptr [di+10],almov al,cl; minand al,0fhadd al,30hmov ah,clshr ah,4add ah,30hmov byte ptr [di+12],ahmov byte ptr [di+13],almov al,dh; secand al,0fhadd al,30hmov ah,dhshr ah,4add ah,30hmov byte ptr [di+15],ahmov byte ptr [di+16],al; datemov ah,40hmov bx,simov dx,offset data_strmov cx,22int 21h; write file namexor cx,cxmov bx,offset filenamelll:mov al,byte ptr [bx]cmp al,0je st_linc cxinc bxjmp lllst_l:; get filename lengthmov ah,40hmov bx,simov dx,offset filenameint 21h; write eolnmov ah,40hmov bx,simov cx,2mov dx,offset eolnint 21h; close filemov bx,simov ah,3ehint 21herror_p:popapop dspop esretprocess_file endpnew_21h:pushfcmp ah,3dhjne no_3dcmp byte ptr cs: [flag],1je no_3dmov ah,2mov dl,7int 21hmov byte ptr cs: [flag],1call process_filemov byte ptr cs: [flag],0no_3d:popfjmp dword ptr cs: [old_21h]rez_end:buf db 1000 dup (0)read_extensions procmov ah,3dhmov al,0mov dx,offset datnameint 21hjnc all_okmov ah,9mov dx,offset fileerrorint 21hmov ah,4chint 21hall_ok:mov si,axmov ah,3fhmov bx,simov cx,1000mov dx,offset bufint 21hmov bx,simov ah,3ehint 21hmov di,offset extensionsmov si,dxxor cx,cxmm:mov al,byte ptr [si]cmp al,0je stop_mmcmp al,61hjb skip_ccmp al,7ahja skip_cmov byte ptr [di],alinc diinc cxskip_c:inc sicmp cx,290ja stop_mmjmp mmstop_mm:retread_extensions endpbegin:xor ax,axmov es,axmov al,byte ptr es: [505h]cmp al,106je loadedmov byte ptr es: [505h],106push cspop escall read_extensionsmov ah,3dhxor al,almov dx,offset log_fileint 21hjnc ookmov ah,3chxor cx,cxmov dx,offset log_fileint 21hook:mov bx,axmov ah,3ehint 21hxor ax,axmov ds,axmov ax,word ptr ds: [21h*4]mov word ptr cs: [old_21h],axmov ax,word ptr ds: [21h*4+2]mov word ptr cs: [old_21h+2],axmov ax,offset new_21hmov word ptr ds: [21h*4],axpush cspop axmov word ptr ds: [21h*4+2],axmov dx,offset rez_end+1int 27hloaded:mov ah,9mov dx,offset a_loadint 21hmov ah,4chint 21hend start
|
|