|
Контроль програм, які запускаються на даному комп'ютер
Контроль програм, які запускаються на даному комп'ютер
7 Міністерство освіти і науки України Кiровоградський Державний Технiчний Унiверситет Факультет автоматики енергетики та програмування Кафедра програмного забезпечення Курсовая работа з дисципліни “ASM-86 ” на тему: "Контроль програм, які запускаються на даному комп'ютері" Зміст - 1. Вступ
- 2. Постановка задачі
- 3. Обґрунтування вибору методів розв'язку задачі
- 4. Алгоритм програми
- 5. Реалізація програми
- 6. Системні вимоги
- 7. Інструкція для користувача
- 8. Висновки
- Використана література
- Додаток
- Лістинг програми
1. ВступТепер комп'ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп'ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп'ютери одержали широке розповсюдження, комп'ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина.Але в наш час комп'ютер використовується і як ігровий автомат, на якому можна грати в різні ігри. Тому програма, яка б дозволяла контролювати ті програми, які запускаються на комп'ютері, була б дуже корисною.2. Постановка задачіРозробити програму “Контроль програм, які запускались на даному комп'ютері" на мові програмування ASM-86.Програма розміщується резидентно в пам'ятi, тож не заважатиме pоботi iнших пpогpам, з якими може працювати користувач.3. Обґрунтування вибору методів розв'язку задачіОтже, необхідно написати програму, яка здійснює контроль програм, що запускалися на комп'ютері. При виборі алгоритму програми у мене не виникло варіантів. Тут все дуже просто. В int 21h є функція 4BH, яка запускає другі програми. Перепризначаємо цю функцію, та в процесі роботи цієї функції виділяємо ім'я, час та дату запуску програми, та записуємо цю інформацію до файлу. Також перевіряємо ім'я на присутність у стоповому файлі, і виходимо з функції, якщо ім'я присутнє в списку.4. Алгоритм програмиАлгоритм головної програми:Перевірка на присутність програми в пам'яті.Присутня, перехід на перевірку параметрів.Не присутня, встановлення нового обробника переривання 21h, залишення резидента в пам'яті.Перевірка параметрів на символи /r, /?, /s, /d.Якщо є символи /r, то вигрузка резидента з пам'яті (звільнення пам'яті, відновлення старого обробника переривання 21h).Якщо є символи /?, то вивід допомоги.Якщо є символи /s, то інвертування прапорцю зупинки (чи буде перевіряться ім'я на присутність в стоповому файлі).Якщо є символи /d, то вилучаємо файл, в якому записується інформація про програми, які запускаються на комп'ютері.Закінчити програму.Алгоритм обробника переривання 21h:Перевірка на функцію перевірки на присутність.Перевірка на функцію 4Bh.Якщо потрібно, перевірка на те, чи потрібно запускати дану програму.Аналізується та записується інформація про дану програму в файл.Виклик старого обробника переривання 21h.Вихід з обробника.5. Реалізація програмиПрограма написана на мові ASM-86 з використанням команд процесора 86/286. Вона складається з головної програми, яка перевіряє параметри, які задані в командному рядку, та функції-обробника переривання 21h, який й контролює програми, які запускалися.Перевага написаної мною програми-резидента в тому, що вона залишається постійно в пам'яті, завдяки чому користувач не помічає контролю.Програма компілюється Turbo Assembler, зв'язується за допомогою TLINK.6. Системні вимогиIBM сумісний комп'ютер із мікропроцесором Intel 80086 або старшим.Операційна система - ДОСПам'ять - 640 К і вище7. Інструкція для користувачаДля запуску резидентної програми, яка здійснює контроль програм, які запускалися на комп'ютері, потрібно в командному рядку набрати kontrol.com та натиснути Enter. Також в командному рядку можна задавати параметри:“/R" - вигрузити програму з пам'яті.“/? ” - виводе допомогу.“/D" - вилучення файлу зберігання програм, що запускалися.“/S" - Інвертування стопового прапору.Програма запам'ятовує імена, дату та час запуску всіх програм, які запускалися на комп'ютері, в файлі, який знаходиться в кореневому каталозі диску С з ім'ям history. asm. Також програма дозволяє задавати імена тих файлів, які не потрібно давати запускати. Ці імена задаються в файлі stop. asm в кореневому каталозі диску С.8. ВисновкиОтже, на мові ASM-86 створено програму, яка виконує контроль програм, що запускалися на комп'ютері.Використана література1) “Програмування на мові Асемблера ЕС ЕВМ" З.С. Брич, В.I. Воющ Москва 1989 р. ст. 1662) “Програмування на сучасних мовах програмування. ” Москва 1990 р. ст. 2063) “Основи мови” Асемблер” В.I. Криволап. Москва 1997р. ст.3094) “Ассемблер для початкiвцiв” М.П. Шукiн. Київ 1980р. ст.1555) “Турбо Асемблер” Л.В. Захаров. Харків 1995 р ст.1786) “Макро Асемблер” К.С. Кропiйко, О.Д. Богатирова. Київ - “Наука” 1991 р.7) Електронний довідник BOOK. ДодатокЛістинг програмиjumps;locals;Leng EQU 0080h; Смещение байтов с длиной строки параметр.Parametr EQU 0081h; Смещение параметровmodel tiny; Модель памяти TINY - крошечная.code; Начало сегмента кода.org 100h; Установка точки входа.start:; Метка с которой начинается программаjmp init; Переход на установки.old dw 0,0; Указатели на старые вектора прерываний.string db 100 dup (0); Имя запускаемой программыstring1 db 100 dup (0); Имя запускаемой программыcomp db 0; флаг сравненияerr1 db 0; флаг ошибкиstr1 db 0; буфер файлаstop1 db 0; проверять ли сравнениеlf db 13,10; сиволы перехода на новую строчкуnam db 'c: \history. asm',0; Имя файла, в котором будем сохранятьnam1 db 'c: \stop. asm',0; Имя файла, с запрещенными программамиlen dw 0; длина строки с именем программыOutFile dw 0; Номер канала файлаOutFile1 dw 0; Номер канала файлаtim db 25 dup (' '); Время и датаnew21 proc; - ---------------------------------------------------------------------------¬; ¦New21 - Процедура обработки 21h прерывания ¦; L----------------------------------------------------------------------------cmp ax,9090h; проверяем, если AX<>9090hjnz q1; то переходим на продолжение обработкиmov ax,12h; иначе возвращаем AX=12hiret; Выходим из прерыванияq1:cmp ah,4bh; проверяем, если AH=4bhje @@1; то переходим на продолжение обработкиjmp exit; иначе переходим на выход@@1:push ax bx cx dx ds si DI ES; сохраняем все используемые регистры в стекеpush dx; - ¬заносим в регистр SI сегмент, в которомpop si; - содержится имя запускаемой программыmov bx,0; обнуляем регистр BXm1:mov al,ds: [si+bx] ; =¬mov cs: string [bx],al; ¦ копируем имя программы в переменнуюinc bx; ¦ stringcmp al,0; =-jnz m1mov cs: len,bx; сохраняем длину строкиcmp cs: stop1,0; проверяем флаг проверкиjne noprov; надо проверятьcall prov; если надо, то на проверкуnoprov:; иначе не проверятьlea dx,cs: nam; адрес выходного файлаpush cspop dscall createFile; процедура создания файлаmov ah,40h; функция записи в файлmov bx,cs: outfile; номер файлаmov cx,cs: len; длина буфераlea dx,cs: string; адрес буфераpushfcall dword ptr cs: old; вызываем функцию записи в файлmov ah,02h; функция чтения текущего времениint 1ah; прерывание работы с часами реального времениmov ah,ch; - ¬mov al,ch; ¦and ah,11110000b; ¦выделяем цифры часовand al,1111b; ¦shr ah,4; ¦add ah,48; ¦add al,48; - -mov tim [2],ah; - ¬сохраняем часыmov tim [3],al; - -mov tim [4],': '; ставим двоеточиеmov ah,cl; - ¬mov al,cl; ¦and ah,11110000b; ¦выделяем цифры минутand al,1111b; ¦shr ah,4; ¦add ah,48; ¦add al,48; - -mov tim [5],ah; - ¬сохраняем минутыmov tim [6],al; - -mov tim [7],': '; ставим двоеточиеmov ah,dh; - ¬mov al,dh; ¦and ah,11110000b; ¦выделяем цифры секундand al,1111b; ¦shr ah,4; ¦add ah,48; ¦add al,48; - -mov tim [8],ah; - ¬сохраняем секундыmov tim [9],al; - -mov ah,04h; функция чтения текущей датыint 1ah; прерывание работы с часами реального времениmov ah,dl; - ¬mov al,dl; ¦and ah,11110000b; ¦выделяем цифры дняand al,1111b; ¦shr ah,4; ¦add ah,48; ¦add al,48; - -mov tim [12],ah; - ¬сохраняем деньmov tim [13],al; - -mov tim [14],': ';mov ah,dh; - ¬mov al,dh; ¦and ah,11110000b; ¦выделяем цифры месяцаand al,1111b; ¦shr ah,4; ¦add ah,48; ¦add al,48; - -mov tim [15],ah; - ¬сохраняем месяцmov tim [16],al; - -mov tim [17],': '; ставим двоеточиеmov ah,ch; - ¬mov al,ch; ¦and ah,11110000b; ¦выделяем цифры векаand al,1111b; ¦shr ah,4; ¦add ah,48; ¦add al,48; - -mov tim [18],ah; - ¬сохраняем векmov tim [19],al; - -mov ah,cl; - ¬mov al,cl; ¦and ah,11110000b; ¦выделяем цифры годаand al,1111b; ¦shr ah,4; ¦add ah,48; ¦add al,48; - -mov tim [20],ah; - ¬сохраняем годmov tim [21],al; - -mov ah,40h; Функция вывода в файлmov bx,cs: outfile; номер файлаmov cx,25; количество выводимых символов=25 (время и дата)lea dx,cs: tim; адрес выводимой строкиpushf; сохраняем регистр флагов в стекеcall dword ptr cs: old; вызываем старый обработчик прерыванияmov ah,40h; =¬mov bx,cs: outfile; ¦mov cx,2; ¦ переход в файле на следующую строкуlea dx,cs: lf; ¦pushf; ¦call dword ptr cs: old; =-mov ah,3eh; Функция закрытия файлаmov bx,cs: outfile; номер файлаpushf; сохраняем регистр флагов в стекеcall dword ptr cs: old; вызываем старый обработчик прерыванияlea di,cs: string; =¬push cs; ¦pop es; ¦ обнуляем строкуmov cx,100; ¦mov al,0; ¦rep stosb; =-pop ES DI si ds dx cx bx ax; восстанавливаем регистры из стекаcmp cs: stop1,0; надо ли проверятьjne exit; если ненадо то на старый обработчикcmp cs: comp,1; иначе проверяем на совпадениеje exxit; если совпадает то на eexitexit:jmp dword ptr cs: old; переходим на старый обработчикexxit:iret; выход из обработчикаnew21 endp; конец обработчика прерыванияCreateFile Proc; - ---------------------------------------------------------------------------¬; ¦CreateFile - процедура создания выходного файла, перед этим проверяется есть¦; ¦ли он уже на диске. Если есть, то он открывается и позиционируется на конец¦; ¦Вход DS: DX=имя файла ¦; ¦Выход cf=0 операция прошла успешно ¦ ¦; L----------------------------------------------------------------------------mov al,1; Разрешаем только записьmov ah,3dh; Функция DOS открытия файлаpushfcall dword ptr cs: old; вызываем старый обработчик прерыванияjc @@1; Проверка на существование:mov cs: outfile,ax; =¬mov ah,42h; ¦mov bx,cs: outfile; ¦mov cx,0; ¦позиционируется на конецmov dx,0; ¦mov al,2; ¦pushf; ¦call dword ptr cs: old; ¦ret; =-@@1:lea dx,cs: nam; =¬xor cx,cx; ¦mov cx,110b; ¦mov ah,3ch; ¦Если файла нет с таким именем, то онpushf; ¦call dword ptr cs: old; ¦создаётсяmov cs: outfile,ax; ¦ret; =-CreateFile endpProv proc; - --------------------------------------------------------------------¬; ¦Prov - процедура проверки имени программы которая запускается и имен¦; ¦программ, которые берутся из файла stop. asm. ¦; ¦Вход нет ¦; ¦Выход comp=1 имена совпали ¦ ¦; L---------------------------------------------------------------------push ds es di si; сохраняем все используемые регистры в стекеmov cs: comp,0; обнуляем флаг сравненияmov cs: err1,0; обнуляем флаг ошибкиmov ah,3dh; Функция DOS открытия файлаlea dx,cs: nam1; адрес имени файла с запрещаемыми программамиpush cspop dsmov al,0; открытие файла на чтениеpushfcall dword ptr cs: old; вызываем старый обработчик прерыванияjnc @@9; Проверка на существование: если не существует, тоpop si di es ds; восстанавливаем регистры из стекаret; выходим из процедуры@@9:; иначеmov cs: outfile1,ax; сохраняем номер файла@@12:lea di,cs: string1; адрес строки@@11:mov ah,3fh; Функция чтения из файлаmov bx,cs: outfile1; номер файла, который читаемmov cx,1; количество читаемых символовlea dx,cs: str1; адрес буфераpush cs;pop ds;pushf;call dword ptr cs: old; вызываем старый обработчик прерыванияcmp ax,-1; проверка на ошибкуje error1;cmp ax,0; проверка на количество прочитанных байтje error1;jmp noerror;error1:; ошибкаmov cs: err1,1; устанавливаем флаг ошибкиjmp error;noerror:; нет ошибкиcmp cs: str1,13; проверка на код перехода на новую строкуje @@21; если равно, то на @@21mov al,cs: str1; записываем в al символcmp al,'a'; если меньше, чем 'a', тоjb @@q1; на @@q1cmp al,'z'; если больше, чем 'z', тоja @@q1; на @@q1sub al,32; иначе вычитаем разницу между больш. и маленькими@@q1:;mov cs: [di],al; сохраняем символ в строкеinc di; увеличение текущей позицииjmp @@11; переход к следующему символу@@21:;mov ah,3fh; Функция чтения из файлаmov bx,cs: outfile1; номер файла, который читаемmov cx,1; количество читаемых символовlea dx,cs: str1; адрес буфераpush cs;pop ds;pushf;call dword ptr cs: old; вызываем старый обработчик прерыванияerror:;lea di,cs: string; адрес имени загружаемой программыpush cs;pop es;lea si,cs: string1; адрес имени программы, прочитанной из файлаpush cs;pop ds;mov al,0; загружаем в al символ с кодом 0mov cx,100; количество символов, в которых ищемcld; направление поиска впередrepne scasb; ищем символ с кодом 0std; направление поиска назадdec di; уменьшаем адрес поиска на 1mov cx,13; длина имени и расширения программыmov al,'\'; загружаем в al символ '\'repne scasb; ищем символ '\'cld; направление поиска впередinc di; увеличиваем адрес сравнения на 2inc di;mov cx,13; длина сравниваемых строкrepe cmpsb; сравниваем строкиje @@ex; если равно, то на @@ex; mov cs: comp,0;jmp @@ex1; иначе на @@ex1@@ex:;mov cs: comp,1; устанавливаем флаг равенства@@ex1:;mov cx,100; кол. байтmov al,0;lea di,cs: string1; адрес строкиpush cs;pop es;rep stosb; обнуляемcmp cs: comp,0; проверяем флаг сравненияjne @@31; если не равен то на @@31cmp cs: err1,1; проверяем флаг ошибкиje @@31; если равен то на @@31jmp @@12; переход на начало сравнения@@31:;mov ah,3eh; Функция закрытия файлаmov bx,cs: outfile1; номер файла, который закрываемpushf;call dword ptr cs: old; Вызываем старый обработчик прерыванияpop si di es ds; восстанавливаем регистры из стекаretprov endp; конец процедуры сравнения; - ---------------------------INIT----------------------------------------init:; Установки.mov ah,9h; функция вывода строкиmov dx,offset text; адрес сообщения о программеint 21h; выводим сообщениеmov ax,9090h; наша функция проверки, есть лди в памятиint 21h; вызываем нашу функцию проверкиcmp ax,12h; AX=12?jz exi; если да, то на проверку парвметровmov ah,35h; функция чтения адреса прерыванияmov al,21h; номер прерыванияint 21h; вызываем функцию чтения адреса прерыванияmov old,bx; сохраняем в переменной сегмент исмещениеmov old+2,es; обработчика прерыванияmov ah,25h; функция замены прерыванияmov al,21h; номер прерыванияmov dx,offset new21; адрес нового обработчикаint 21h; вызываем функцию замены прерыванияlea dx,cs: nam; адрес выходного файлаpush cspop dscall createFile; процедура создания файлаmov ah,40h; =¬mov bx,cs: outfile; ¦mov cx,2; ¦ переход в файле на следующую строкуlea dx,cs: lf; ¦pushf; ¦call dword ptr cs: old; =-mov ah,3eh; Функция закрытия файлаmov bx,cs: outfile; номер файлаpushf; сохраняем регистр флагов в стекеcall dword ptr cs: old; вызываем старый обработчик прерыванияmov dx,offset init; адрес конца обработчикаint 27h; Выйти и остаться резидентом.; Проверка параметровexi:push cspop dsxor ch,ch; обнуляем CHmov cl, [ds: Leng] ; CX=длина параметровinc cx; добавить символ возврата кареткиmov si,Parametr; поместить адрес параметров в SI; пропустить начальный пробелы и табуляцию@@100:call Separators; проверка на пробелыjne @@20; переход если пробелов и табул. нетinc si; иначе пропустить этот символloop @@100; переход пока не закончена обработка@@20:cmp cx,0; CX=0?jne @@30; если нет, то есть параметрыjmp noparam; нет параметров@@30:mov ah,ds: [si] ; в AH заносим символы строки параметровcmp ah,'/'; сравниваем AH с символом '/'je param; если равно то следующий символcmp ah,'-'; сравниваем AH с символом '-'je param; если равно то следующий символcmp ah,'r'; сравниваем AH с символом 'r'je release; если равно то на выгрузку резидентаcmp ah,'R'; сравниваем AH с символом 'R'je release; если равно то на выгрузку резидентаcmp ah,'d'; сравниваем AH с символом 'd'je delete; если равно то на удаление файлаcmp ah,'D'; сравниваем AH с символом 'D'je delete; если равно то на удаление файлаcmp ah,'s'; сравниваем AH с символом 's'je stoped; если равно то на инвертирование флага stop1cmp ah,'S'; сравниваем AH с символом 'S'je stoped; если равно то на инвертирование флага stop1cmp ah,'? '; сравниваем AH с символом '? 'je help; если равно то на выдачу помощиcmp ah,'h'; сравниваем AH с символом 'h'je help; если равно то на выдачу помощиcmp ah,'H'; сравниваем AH с символом 'H'je help; если равно то на выдачу помощиparam: inc simov ah,ds: [si] ; берем следующий символcmp ah,'d'; сравниваем AH с символом 'd'je delete; если равно то на удаление файлаcmp ah,'D'; сравниваем AH с символом 'D'je delete; если равно то на удаление файлаcmp ah,'s'; сравниваем AH с символом 's'je stoped; если равно то на инвертирование флага stop1cmp ah,'S'; сравниваем AH с символом 'S'je stoped; если равно то на инвертирование флага stop1cmp ah,'? '; сравниваем AH с символом '? 'je help; если равно то на выдачу помощиcmp ah,'h'; сравниваем AH с символом 'h'je help; если равно то на выдачу помощиcmp ah,'H'; сравниваем AH с символом 'H'je help; если равно то на выдачу помощиcmp ah,'r'; сравниваем AH с символом 'r'je release; если равно то на выгрузку резидентаcmp ah,'R'; сравниваем AH с символом 'R'jne noparam; если не равно то на noparamrelease:mov ah,09h; функция вывода строкиlea dx,mes2; адрес сообщения о выгрузкеint 21h; выводим сообщениеmov ah,35h; функция чтения адреса прерыванияmov al,21h; номер прерыванияint 21h; вызываем функцию чтения адреса прерыванияpush esmov ah,25h; функция замены прерыванияmov al,21h; номер прерывания 21hmov dx,es: old; адрес старого обработчикаmov ds,es: old+2int 21h; вызываем функцию замены прерыванияpop dsmov ah,49h; функция освобождения паиятиint 21h; освобождаем паиятьjmp ex_init; переход на выходdelete:mov ah,9; функция вывода строкиmov dx,offset cs: mes3; адрес сообщения о удаленииint 21h; выводим сообщениеmov ah,41h; функция удаления файлаmov dx,offset cs: nam; адрес удаляемого файлаint 21h; удаляем файлjmp noparamstoped:mov ah,35h; функция чтения адреса прерыванияmov al,21h; номер прерыванияint 21h; вызываем функцию чтения адреса прерыванияmov ah,9; функция вывода строкиnot es: stop1; инвертируем флаг проверкиstoped2: cmp es: stop1,0; сравниваем флаг проверки с 0jne stoped1; если не равно то на stoped1mov dx,offset cs: mes4; адрес сообщения о наличии проверкиint 21h; выводим сообщениеjmp noparamstoped1: mov dx,offset cs: mes5; адрес сообщения о не наличии проверкиint 21h; выводим сообщениеjmp noparamhelp: mov ah,9; функция вывода строкиmov dx,offset helpt; адрес сообщения помощиint 21h; выводим сообщениеmov ah,35h; функция чтения адреса прерыванияmov al,21h; номер прерыванияint 21h; вызываем функцию чтения адреса прерыванияmov ah,9; функция вывода строкиjmp stoped2noparam:lea dx,cs: mes1; адрес сообщения о наличии резидента в памятиmov ah,9; функция вывода строкиint 21h; выводим сообщениеex_init:mov ah,4ch; функция выхода из программыmov al,0; возвращает код ошибки 0int 21h; выход из программыSeparators Proc; - ---------------------------------------------------------------------------¬; ¦Separators - процедура проверки на пробелы ¦; ¦ВЫХОД: ¦; ¦zf=1: символ является пробелом, табуляцией или возвратом каретки ¦; ¦zf=0: символ не является разделителем ¦; L----------------------------------------------------------------------------mov al,ds: [si] ; взять символ из ds: sicmp al,020h; символ пробел?je @@10; Если да то переходcmp al,009h; символ табуляция?je @@10; Если да то переходcmp al,00dh; символ возврата каретки?@@10:retSeparators EndPText db 13,10,'History Version 1.0 Copyright (c) 1999 Мороз Р. ',13,10db 'Сохранение названий всех программ, которые запускались на компьютере',13,10,'$'Helpt db 'Syntax: History [/r|/R|-r|-R|r|R] [/d|/D|-d|-D|d|D] [/? |/h|/H|-? |-h|-H|? |h|H] ',13,10db ' /r - released History from memory',13,10db ' /d - delete files History',13,10db ' /s - invert stop flag ',13,10db ' /? - HELP',13,10,'$'mes1 db 13,10,' Program alredy in memory $'mes2 db 13,10,' Program released in memory $'mes3 db 13,10,' delete files History $'mes4 db 13,10,' stoped files $'mes5 db 13,10,' not stoped files $'end start; Конец программы, точка входа
|
|