Что значит резидентная программа

Когда в реальном режиме выполняется команда INT, управление передается по адресу, который считывается из специального массива, таблицы векторов прерываний, начинающегося в памяти по адресу 0000h:0000h. Каждый элемент этого массива представляет собой дальний адрес обработчика прерывания в формате сегмент:смещение или 4 нулевых байта, если обработчик не установлен. Команда INT помещает в стек регистр флагов и дальний адрес возврата, поэтому, чтобы завершить обработчик, надо выполнить команды popf и retf или одну команду iret, которая в реальном режиме полностью им аналогична.

; Пример обработчика программного прерывания

int_handler proc far

После того как обработчик написан, следующий шаг — привязка его к выбранному номеру прерывания. Это можно сделать, прямо записав его адрес в таблицу векторов прерываний, например так:

push 0; сегментный адрес таблицы векторов прерываний

pushf; поместить регистр флагов в стек

cli; запретить прерывания

; (чтобы не произошло аппаратного прерывания между следующими

Урок 43. Виртуальная память

; командами, обработчик которого теоретически может вызвать INT 87h

; в тот момент, когда смещение уже будет записано, а сегментный

; адрес еще нет, что приведет к передаче управления в неопределенную область памяти)

; поместить дальний адрес обработчика int_handler в таблицу

; векторов прерываний, в элемент номер 87h (одно из неиспользуемых прерываний)

mov word ptr es:[87h*4], offset int_handler

mov word ptr es:[87h*4+2], seg int_handler

popf; восстановить исходное значение флага IF

Теперь команда INT 87h будет вызывать наш обработчик, то есть приводить к записи 0 в регистр АХ.

Перед завершением работы программа должна восстанавливать все старые обработчики прерываний, даже если это были неиспользуемые прерывания типа 87h. Для этого надо перед предыдущим фрагментом кода сохранить адрес старого обработчика. Полный набор действий для программы, перехватывающей прерывание 87h, будет выглядеть следующим образом:

; скопировать адрес предыдущего обработчика в переменную old_handler

mov eax,dword ptr es:[87h*4]

; установить новый наш обработчик

mov word ptr es:[87h*4], offset int_handler

mov word ptr es:[87h*4+2], seg int_handler

; тело программы

; восстановить предыдущий обработчик

mov word ptr es:[87h*4],eax

Для изменения таблицы векторов прерываний в обычных программах, DOS предоставляет две системные функции: 25h и 35h — установить и считать адрес обработчика прерывания, которые и рекомендуются к использованию в обычных условиях.

; скопировать адрес предыдущего обработчика в переменную old_handler

mov ax,3587h; АН = 35h, AL = номер прерывания

int 21h; функция DOS: считать адрес обработчика прерывания

mov word ptr old_handler,bx; возвратить смещение в ВХ

mov word ptr old_handler+2,es; и сегментный адрес в ES,

КАРЬЕРА ХАКЕРА. Книга 1 — Основы MASM32. Глава 4 — Резидентная программа

; установить наш обработчик

mov ax,2587h; АН = 25h, AL = номер прерывания

mov dx,seg int_handler; сегментный адрес

mov dx,offset int_handler; смещение в DX

int 21h; функция DOS: установить обработчик

; восстановить предыдущий обработчик

lds dx,old_handler; сегментный адрес в DS и смещение в DX

mov ax,2587h; АН = 25h, AL = номер прерывания

int 21h; установить обработчик

Обычно обработчики прерываний используют для того, чтобы обрабатывать прерывания от внешних устройств или чтобы обслуживать запросы других программ.

Программы, остающиеся в памяти, после того как управление возвращается в DOS, называются резидентными. Превратить программу в резидентную просто — достаточно вызвать специальную системную функцию DOS.

Функция DOS 31h: Оставить программу резидентной

Ввод: АН = 31h AL = код возврата DX = размер резидента в 16-байтных параграфах (больше 06h), считая от начала PSP

Кроме того, существует и иногда используется предыдущая версия этой функции — прерывание 27h:

INT 27h: Оставить программу резидентной

Ввод: АН = 27h DX = адрес последнего байта программы (считая от начала PSP) + 1

Эта функция не может оставлять резидентными программы размером больше 64 Кб, но многие программы, написанные на ассемблере, соответствуют этому условию. Так как резидентные программы уменьшают объем основной памяти, их всегда пишут на ассемблере и оптимизируют для достижения минимального размера.

Принято разделять резидентные программы на активные и пассивные, в зависимости от того, перехватывают ли они прерывания от внешних устройств или получают управление, только если программа специально вызовет команду INT с нужным номером прерывания и параметрами.

Программа N 01 (первый обработчик прерывания). Записывает в оперативную память пассивный резидент, который для любой программы реагирует на прерывание 21h так, что выводит свою строку ‘My string!$’.

assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG

;Переходим на метку инициализации. Нам нужно будет перехватить прерывание 21h, а также оставить программу резидентной в памяти

; Ниже идет, код обработчика прерывания 21h прерывания (он будет резидентный). После того, как программа выйдет, процедура Int_21h_proc останется в памяти и будет контролировать функцию 09 прерывания 21h.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Источник: studopedia.ru

Резидентные программы

В данной работе рассмотрено явление, которое в операционной системе MSDOS играет роль многозадачности. С истинной многозадачностью можно столкнуться, рассматривая программирование в операционной системе Windows. Многозадачность же, рассматриваемая в этой курсовой работе, может быть названа нелегальной.

Термин TSR происходит от английской фразы Terminate State Resident, т.е. «завершить и остаться резидентным». Резидентная программа, находясь в памяти, выполняет свои функции через перехваченные прерывания. Связь с резидентной программой также осуществляется посредством прерываний.

Читайте также:
Устройство хранения программы данных это

1 РЕЗИДЕНТНЫЕ ПРОГРАММЫ 4
2 ЗАЩИТА РЕЗИДЕНТНЫХ ПРОГРАММ ОТ ПОВТОРНОЙ УСТАНОВКИ . 8
3 ВЫГРУЗКА РЕЗИДЕНТНЫХ ПРОГРАММ ИЗ ПАМЯТИ 12
4 ОПИСАНИЕ ПРОГРАММЫ 13
Заключение 21
Литература 22
Приложение-листинг 23
Приложение-рисунок 35

Работа состоит из 1 файл

1 РЕЗИДЕНТНЫЕ ПРОГРАММЫ 4

2 ЗАЩИТА РЕЗИДЕНТНЫХ ПРОГРАММ ОТ ПОВТОРНОЙ УСТАНОВКИ . 8

3 ВЫГРУЗКА РЕЗИДЕНТНЫХ ПРОГРАММ ИЗ ПАМЯТИ 12

4 ОПИСАНИЕ ПРОГРАММЫ 13

В данной работе рассмотрено явление, которое в операционной системе MSDOS играет роль многозадачности. С истинной многозадачностью можно столкнуться, рассматривая программирование в операционной системе Windows. Многозадачность же, рассматриваемая в этой курсовой работе, может быть названа нелегальной.

Термин TSR происходит от английской фразы Terminate State Resident, т.е. «завершить и остаться резидентным». Резидентная программа, находясь в памяти, выполняет свои функции через перехваченные прерывания. Связь с резидентной программой также осуществляется посредством прерываний. Часто такие программы играют роль драйверов -программ поддержки, каких-либо внешних устройств.

Наиболее часто употребляемые резидентные драйверы обеспечивают русифицированную работу экрана и клавиатуры или поддерживают работу мыши. Популярны резидентные переводчики и различные резидентные детекторы, позволяющие на ранней стадии обнаруживать появление вируса.

Наличие в памяти резидентных программ предполагает как бы некое подобие многозадачного режима, в котором, однако, есть главная задача, выполняющаяся в данный момент. Остальные же задачи получают управление время от времени через перехваченные ими прерывания либо «по милости» главной задачи. Таким образом, операционная система фактически не «знает» об их существовании. Многие авторы говорят в этой связи об изначальной порочности TSR-программ. Однако, надо заметить, что:

1. На TSR-программах держится значительная часть как чисто системной, так и прикладной программной поддержки в операционной системе MS DOS.

2. При написании любой программы нужно придерживаться определенных правил, а ошибка в программе приводит к полной и частичной ее неработоспособности.

3. Многие проблемы, рассмотренные в настоящей главе, носят общий характер для любых многозадачных сред.

1 РЕЗИДЕНТНЫЕ ПРОГРАММЫ

Структура типичной резидентной программы выглядит следующим образом:

org lOOh main proc

jmp init ;Переход на секцию инициализации

;Данные резидентной секции программы

entry: ;Текст резидентной секции программы

init proc ;Секция инициализации

mov DX,(init-main+10Fh)/16 ;Размер в параграфах

mov АН,3100h ;Функция «Завершить и оставить в

int 21 h ; памяти»

text ends end main

Программа пишется в формате .СОМ, поэтому в ней предусматривается только один сегмент, с которым связываются сегментные регистры CS и DS; в начале сегмента резервируется lOOh байт для PSP. При запуске программы с клавиатуры управление передается (в соответствии с параметром директивы end) на начало процедуры main.

Командой jmp сразу же осуществляется переход на секцию инициализации, которая может быть оформлена в виде отдельной процедуры или входить в состав процедуры main. В секции инициализации выполняются некоторые начальные действия, о которых мы поговорим позже.

Последними строками секции инициализации вызывается функция DOS 3 lh, которая выполняет завершение программы с оставлением в памяти указанной ее части. Размер резидентной части программы (в параграфах) передается DOS в регистре DX. Определить этот размер можно, например, следующим образом.

К разности смещений init-main, которая равна длине резидентной части программы в байтах, прибавляется размер PSP (lOOh) и еще число 15 (Fh), чтобы после целочисленного деления на 16 (для получения размера программы в параграфах) результат был округлен в большую сторону. С целью экономии памяти секция инициализации располагается в конце программы и отбрасывается при ее завершении.

Функция 3lh, закрепив за резидентной программой необходимую для ее функционирования память, передает управление командному процессору (как и обычная функция завершения программы 4Ch), и вычислительная система переходит в исходное состояние. Наличие программы, резидентной в памяти, никак не отражается на ходе вычислительного процесса, за исключением того, что уменьшается объем свободной памяти. Одновременно в память может быть загружено любое число резидентных программ. Процесс первичного запуска резидентной программы, приводящего к ее загрузке в память, обычно называют установкой программы. На рисунке 1 показаны элементы резидентной программы и их взаимодействие.

Точка входа при

Точка входа при актквнзадни —

> Резидентная часть программы

: c*xw« инициализации mov AH, 31h

tot 21h init endp end main

Часть программы» > отбрасываемая после установки в памяти

Рис. 1. Взаимодействие элементов резидентной программы

Любая резидентная программа имеет по крайней мере две точки входа. При запуске с клавиатуры программы типа .СОМ управление всегда передается на первый байт после PSP (IP=100h). Поэтому практически всегда первой командой резидентной программы является команда jmp, передающая управление на начало секции инициализации.

После отработки функции DOS 3 lh программа остается в памяти в пассивном состоянии. Для того чтобы активизировать резидентную программу, ей надо как-то передать управление. Вызвать к жизни резидентную программу можно разными способами, но наиболее употребительным является механизм аппаратных или программных прерываний.

В этом случае в процессе инициализации необходимо заполнить соответствующий вектор адресом точки входа в программу (entry на рис.1). Адрес entry образует вторую точку входа в программу, через которую осуществляется ее активизация. Очевидно, что резидентная секция программы должна заканчиваться командой выхода из прерывания iret.

2 ЗАЩИТА РЕЗИДЕНТНЫХ ПРОГРАММ ОТ ПОВТОРНОЙ УСТАНОВКИ

Некоторые резидентные программы имеют серьезный недостаток: они не защищены от повторной загрузки. Вспомним, что для работы с резидентной программой ее следует прежде всего установить, запустив с клавиатуры как обычную программу.

Читайте также:
Что означает понятие диагональный характер программы

В этом случае управление передается на секцию инициализации, в которой подготавливаются условия для дальнейшей работы программы в резидентном состоянии. Как правило, в секции инициализации загружаются векторы прерываний, через которые программа будет активизироваться.

Может получиться, что пользователь, установив программу, забудет об этом и запустит ту же программу повторно. В этом случае в память будет загружена и останется резидентной вторая копия той же программы. Это плохо не только потому, что понапрасну расходуется память; более неприятным является вторичный перехват тех же векторов.

Если резидентная программа после ее активизации не обращается к старому содержимому перехваченных ею векторов, то вторая копия полностью лишит первую работоспособности и тогда повторная загрузка приведет только к расходованию памяти. Если, однако, как это обычно и имеет место, резидентная программа в процессе своей работы передает управление старому обработчику перехваченного ею прерывания, то новая копия резидентной программы, сохранившая в процессе инициализации адрес первой копии в качестве содержимого перехватываемого вектора, будет при каждой активизации вызывать и первую копию.

В результате резидентная программа будет фактически выполняться при каждом вызове дважды. Во многих случаях такое повторное выполнение нарушит правильную работу программы. Поэтому обязательным элементом любой резидентной программы является процедура защиты ее от повторной загрузки (установки).

Наиболее распространенным методом защиты резидентной программы от повторной установки является использование прерывания 2Fh, называемого мультиплексным и специально предназначенного для связи с резидентными программами. При вызове этого прерывания в регистре АН задается номер функции (от 00h до FFh), а в регистре AL — номер подфункции (в том же диапазоне).

Функции с 00h по BFh зарезервированы для использования системой (например, функции 00h и Olh закреплены за резидентной программой DOS PRTNT.COM, а 1 Oh — за программой SHARE.EXE), а функции с COh по FFh могут использоваться прикладными программами. Для того чтобы резидентная программа могла отозваться на вызов прерывания int 2Fh, в ней должен иметься обработчик этого прерывания (рис. 1).

Фактически все резидентные программы, как системные, так и прикладные, имеют такие обработчики, через которые осуществляется не только проверка на повторную установку, но и вообще вся связь с резидентной программой: смена режима ее работы или получение от нее требуемой информации. Задание действия, которое надлежит выполнить обработчику прерывания 2Fh конкретной резидентной программы, осуществляется с помощью номера подфункции, помещаемого перед вызовом прерывания в регистр AL. Обычно для проверки на наличие в памяти используется подфункция OOh.

‘. Обработчик прерывания 2Fh

Резидентная теть программы

Первый экземпляр TSE.COM, загруже ими й * память командой TSR,СОМ

Второй экземшяр TSR.COM, запущенны й повторной командой TSR.COM и приступивший к своей инициализаций

Признак наличия к памяти первого экземпляра программы

рис. 2. Проверка, осуществляемая запущенной с клавиатуры резидентной программой, на наличие в памяти ранее установленного экземпляра той же программы.

Резидентная программа на этапе инициализации должна выяснить, нет ли уже в памяти ранее установленного экземпляра той же программы. Для этого в секции инициализации выполняется команда int 2Fh (см. рис. 1). Предварительно в регистр АН помещается номер функции, присвоенный данной программе (из диапазона COh.

FFh), а в регистр AL — номер подфункции, соответствующей запросу на наличие в памяти, например,ООп. Обработчик прерывания 2Fh резидентной программы должен прежде всего проверить номер функции в регистре АН; при обнаружении своей функции обработчик анализирует содержимое регистра AL и выполняет затребованные действия, после чего командой iret передает управление вызвавшей его программе. Если, однако, обработчик обнаружил в регистре АН чужую функцию, он должен командой jmp CS:old_2fh передать управление по цепочке тому обработчику, адрес которого был ранее в векторе 2Fh. В результате вызов int 2Fh из любой программы будет проходить по цепочке через все загруженные резидентные программы, пока не достигнет «своей» программы или йе вернет управление в вызвавшую программу через обработчик DOS (который, очевидно, всегда будет самым последним в цепочке).

4 ОПИСАНИЕ ПРОГРАММЫ

Защита резидентной программы от повторной установки

Как правило, в секции инициализации загружаются векторы прерываний, через которые будет активизироваться программа. Последними строками секции инициализации вызывается функция DOS 31h, которая выполняет завершение программы с оставлением в памяти ее резидентной части.

Если программу запустить с клавиатуры повторно, в память будет загружена и останется резидентной ее вторая копия. Это плохо не только потому, что понапрасну расходуется память, более неприятным является вторичный перехват тех же векторов.

Если резидентная программа после ее активизации не обращается к старому содержимому перехваченных ею векторов, то вторая копия полностью лишит первую работоспособности, и тогда повторная загрузка приведет только к расходованию памяти. Если, однако, как это обычно и имеет место, резидентная программа в процессе своей работы передаст управление старому обработчику перехваченного ею прерывания, то новая копия резидентной программы, сохранившая в процессе инициализации адрес первой копии в качестве содержимого перехватываемого вектора, будет при каждой активизации вызывать и первую копию. В результате резидентная программа будет фактически выполняться при каждом вызове дважды. Во многих случаях такое повторное выполнение нарушит правильную работу программы. Поэтому обязательным элементом любой резидентной программы является процедура защиты ее от повторной загрузки, или, как говорят, установки.

Читайте также:
Удалили файлы с компьютера как восстановить программа

Наиболее распространенным методом защиты резидентной программы от повторной установки является использование прерывания 2Fh, специально предназначенного для связи с резидентными программами. При вызове этого прерывания в регистре АН задается номер функции (от 00h до FFh), а в регистре AL — номер подфункции (в том же диапазоне). 00h — 7Fh зарезервировано для DOS/Windows 0B8h — 0BFh зарезервировано для сетевых функций 0C0h — 0FFh отводится для программ.

Для того, чтобы резидентная программа могла отозваться на вызов прерывания int 2Fh, в ней должен иметься обработчик этого прерывания. Фактически все резидентные программы, как системные, так и прикладные, имеют такие обработчики, через которые осуществляется не только проверка на повторную установку, но и вообще связь с резидентной программой: смена режима ее работы или получение от неё в транзитную программу каких-то параметров. Задание действия, которое надлежит выполнить обработчику прерывания 2Fh конкретной резидентной программы, осуществляется с помощью номера подфункции, помещаемого перед вызовом прерывания в регистр AL

Таким образом, обработчик прерывания 2Fh резидентной программы должен, прежде всего, проверить номер функции в регистре АН; при обнаружении «своей» функции обработчик анализирует содержимое регистра AL и выполняет затребованные действия, после чего командой iret передаст управление вызвавшей его программе. Если, однако, обработчик обнаружил в регистре АН «чужую» функцию, он должен командой jmp CS:old_2fh передать управление по цепочке тому обработчику, адрес которого был ранее в векторе 2Fh. В результате вызов int 2Fh из любой программы будет проходить по цепочке через все загруженные резидентные программы, пока не достигнет «своей» программы или не вернет управление в вызвавшую программу через обработчик DOS (который, очевидно, всегда будет самым последним в цепочке).

Естественно, для коммуникации с резидентной программой должен быть установлен некоторый интерфейс. Обычно при проверке на повторную установку резидентная программа, если она уже находится в памяти, возвращает в регистре AL значение FFh, которое является признаком запрета вторичной загрузки.

Иногда для большей надежности идентификации «своей» функции резидентная программа, помимо значения FFh в регистре AL, возвращает еще какие-то обусловленные заранее коды в других регистрах. Часто через дополнительные регистры передастся символьная информация, например, имя программы. В этом случае, если вызвавшая программа с именем DUMP.COM (т.е. вторая копия резидентной программы, выясняющая, можно ли ей остаться резидентной в памяти) получает после вызова int 2Fh в регистре AL значение FFh, а в регистрах СХ и DX символьные коды ‘DU’ и ‘МР’, она может быть уверена, что ее первая копия уже находится в памяти. Если же в регистре AL вернулся код FFh, а в регистрах СХ и DX -коды, например, ‘ОК’ и ‘RB’, это, скорее всего означает, что закрепленная за нашей программой функция мультиплексного прерывания ухе используется другой резидентной программой. В этом случае стоит сменить функцию, чтобы не возбуждать конфликтных ситуаций.

В резидентную часть следует включить обработчик прерывания 2Fh. Его расположение в пределах текста программы не имеет особого значения; мы поместили его в начале резидентной части. Секция инициализации претерпела большие изменения. Она должна начинаться с вызова прерывания 2Fh с соответствующей функций для проверки на повторную установку.

Если первая копия программы уже загружена, текущую программу следует завершить не функцией 3th (завершить и оставить в памяти), а обычной функцией завершения 4Ch. Если же нашей программы в памяти нет, то в секции инициализации, помимо заполнения ее «рабочего» вектора, в данном случае 03h, следует также установить наш обработчик мультиплексного прерывания.

Среди функций мультиплексного прерывания, предназначенных для прикладных программ, мы произвольно выбрали для нашей программы функцию F1h, а для проверки на повторную установку подфункцию 00h. Резидентный обработчик прерывания 2Fh, включенный в нашу программу, проверяет номера функции и подфункции и при обнаружении каких-либо других кодов передает управление следующему обработчику этого прерывания. Если же вызвана функция F1h с подфункцией 00h, обработчик устанавливает в регистре AL значение FFh («я уже загружен») и возвращает управление в вызвавшую программу командой iret.

Секция инициализации начинается с проверки на повторную установку. После загрузки в регистр АН номера функции (F1h), а в регистр AL — номера подфункции (00h), вызывается прерывание 2Fh. После возврата из прерывания анализируется содержимое регистра AL Если обработчик вернул значение FFh, программа должна завершиться без оставления в памяти. Эти действия выполняются по метке installed.

Если возвращено другое значение, инициализация продолжается (для надежности стоило проверить, возвращен ли именно 0). Сохраняется старое содержимое вектора 2Fh, устанавливается наш обработчик этого прерывания, после чего выполняются все действия по установке, предусмотренные в старом варианте программы динамического дампа. При переходе на метку installed на экран выводится сообщение о невозможности повторной установки и выполняется функция завершения 4Сh с кодом возврата 01h. Последнее, конечно, имеет символический характер, поскольку этот код в дальнейшем не анализируется.

Источник: poisk-ru.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru