Assembler - язык неограниченных возможностей


Пассивная резидентная программа


В качестве первой резидентной программы рассмотрим именно пассивный резидент, который будет активироваться при попытке программ вызывать INT 21h и запрещать удаление файлов с указанного диска.

; tsr.asm ; Пример пассивной резидентной программы. ; Запрещает удаление файлов на диске, указанном в командной строке, всем ; программам, использующим средства DOS .model tiny .code org 2Ch envseg dw ? ; сегментный адрес копии окружения DOS

org 80h cmd_len db ? ; длина командной строки cmd_line db ? ; начало командной строки

org 100h ; СОМ-программа start: old_int21h: jmp short initialize ; эта команда занимает 2 байта, так что dw 0 ; вместе с этими двумя байтами получим ; old_int21h dd ? int21h_handler proc far ; обработчик прерывания 21h pushf ; сохранить флаги cmp ah,41h ; Если вызвали функцию 41h (удалить je fn41h ; файл) cmp ax,7141h ; или 7141h (удалить файл с длинным именем), je fn41h ; начать наш обработчик, jmp short not_fn41h ; иначе - передать управление ; предыдущему обработчику fn41h: push ax ; сохранить модифицируемые push bx ; регистры mov bx,dx cmp byte ptr ds:[bx+1],':' ; если второй символ ASCIZ-строки, ; переданной INT 21h, ; двоеточие - первый символ ; должен быть именем диска, je full_spec mov ah,19h ; иначе: int 21h ; функция DOS 19h - определить текущий диск, add al,'А' ; преобразовать номер диска к заглавной букве, jmp short compare ; перейти к сравнению full_spec: mov al,byte ptr [bx] ; AL = имя диска из ASCIZ-строки and al,11011111b ; преобразовать к заглавной букве compare: cmp al,byte ptr cs:cmd_line[1] ; если диски je access_denied ; совпадают - запретить доступ, pop bx ; иначе: восстановить pop ax ; регистры not_fn41h: popf ; и флаги jmp dword ptr cs:old_int21h ; и передать управление ; предыдущему обработчику INT 21h access_denied: pop bx ; восстановить регистры pop ax popf push bp mov bp,sp or word ptr [bp+6],1 ; установить флаг переноса ; (бит 0) в регистре флагов, ; который поместила команда INT в стек ; перед адресом возврата pop bp mov ax,5 ; возвратить код ошибки "доступ запрещен" iret ; вернуться в программу int21h_handler endp




Начало  Назад  Вперед