- •Системное программное обеспечение
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Системное программное обеспечение
- •Общие сведения о драйверах
- •Общие сведения о драйверах
- •Общие сведения о драйверах
- •Общие сведения о драйверах
- •Общие сведения о драйверах
- •Заголовок драйвера
- •Заголовок драйвера
- •Заголовок драйвера
- •Заголовок драйвера
- •Стратегия устройства
- •Стратегия устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Системное программное обеспечение
- •Общие сведения о резидентных программах
- •Общие сведения о резидентных программах
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
Защита резидентной программы от повторной установки
Если, однако, резидентная программа в процессе своей работы передает управление старому обработчику перехваченного ею прерывания, то новая копия резидентной программы, сохранившая в процессе инициализации адрес первой копии в качестве содержимого перехватываемого вектора, будет при каждой активизации вызывать и первую копию. В результате резидентная программа будет фактически выполняться при каждом вызове дважды. Во многих случаях такое повторное выполнение нарушит правильную работу программы. Поэтому обязательным элементом любой резидентной программы является процедура защиты ее от по вторной загрузки (установки).
Защита резидентной программы от повторной установки
Существует несколько способов обнаружения копии резидентной программы в памяти:
1.Внешняя привязка к перехваченному вектору прерывания. Суть этого метода заключается в том, что в теле программы помещается некоторый признак - обычно это слово. Далее делается предположение, что, поскольку резидентной программой был перехвачен определенный вектор, то он должен быть направлен в тело программы. Таким образом, имеется адрес входа в процедуру прерывания и по этому адресу ищется признак присутствия.
Защита резидентной программы от повторной установки
Пример. Фрагмент TSR-программы с признаком присутствия
; в резидентной процедуре |
|
||
PRIZN DW АВ12Н |
|
|
|
TSR |
РROC FAR |
|
|
|
... |
|
|
TSR |
ENDP |
|
|
|
... |
|
|
; в установочной части кода |
|
||
MOV |
АХ,3570Н |
|
|
INT |
21H |
|
|
MOV |
AX,PRIZN |
;проверяем на присутствие |
|
СМP |
WORD PTR ES:[BX-2],AX |
;проверяем на присутствие |
|
JE |
NO_SET_UP |
|
|
|
... |
|
|
NO_SET_UP: |
MOV AH,4CH |
; выход без установки |
|
|
INT 21H |
|
|
Излагаемый метод не слишком совершенен, т.к. после запуска программы другие резиденты могут перехватить ключевое прерывание, и программа перестанет обнаруживать себя в памяти.
Защита резидентной программы от повторной установки
2.Внутренняя привязка к перехваченному прерыванию. Как и в предыдущем случае, используется перехваченное программой прерывание. Используется заведомо не существующая функция этого прерывания. В ответ на вызов такой функции программа, находящаяся в памяти, посылает в ответ (в одном из регистров) код возврата, сигнализирующий о своем присутствии в памяти. Следует заметить, что таким способом можно не только определять присутствие программы в памяти, но и отдавать указания программе, находящейся в памяти. Через один из регистров можно передать, например, сегментный адрес резидента, который необходим для удаления его из памяти. Указанный метод более надежен, прост и универсален, чем предыдущий.
Защита резидентной программы от повторной установки
Пример. Фрагмент TSR-программы с кодом возврата
; в резидентной процедуре |
|
|
INT16 PROC FAR |
|
|
СМР АН,20Н |
|
|
JNZ CONT |
|
|
MOV АХ,789АН |
|
;код присутствия |
IRET |
|
|
CONT: |
|
|
JMP WORD PTR CS:OLD16 |
|
|
INT16 ENDP |
|
|
... |
|
|
; в установочной части кода |
|
|
MOV АН,20Н |
|
|
INT 16H |
|
|
CMP АХ,789АН |
|
|
JZ NO_SET_UP |
|
;программа в памяти |
... |
|
|
NO_SET_UP: |
MOV AH,4CH |
; выход без установки |
|
INT 21H |
|
Здесь, правда, существует одна не слишком приятная проблема. Могут совпасть номера функций, используемых разными программами. Выйти из этого положения можно следующим способом: программа должна реагировать не просто на посланный код, а на последовательность кодов. Тем самым можно свести почти до нуля вероятность совпадений.
Защита резидентной программы от повторной установки
3. Использование так называемого мультиплексного прерывания (2FH), которое предназначено именно для целей взаимодействия резидентных программ друг с другом, в том числе и для обнаружения себя в памяти. Входом этого прерывания является регистр AH, в котором указывается идентификатор программы:
01Н – резидентная порция команды MS DOS ‘PRINT’; 02Н – резидентная порция команды MS DOS ‘ASSIGN’; 10Н – резидентная порция команды MS DOS ‘SHARE’; 03H – 7FH – зарезервировано для MS DOS;
80H – 0FFH – предоставлены пользователю.
В регистре AL указывается номер подфункции: 00Н —проверка наличия программы в памяти; остальные функции — свои для каждой программы.
Защита резидентной программы от повторной установки
На выходе функции в регистре AX указывается код ошибки, если установлен флаг CF. В случае отсутствия ошибок в регистре AL содержится статус установки:
00Н – не установлен. Можно устанавливать. 01Н – не установлен. Нельзя устанавливать. 0FFH – установлен.
Для того чтобы резидентная программа могла отозваться на вызов прерывания int 2Fh, в ней должен иметься обработчик этого прерывания.
Резидентная программа на этапе инициализации должна выяснить, нет ли уже в памяти ранее установленного экземпляра той же программы. Для этого в секции инициализации выполняется команда int 2Fh.
Защита резидентной программы от повторной установки
Предварительно в регистр АН помещается номер функции, присвоенный данной программе (из диапазона 80Н...0FFН), а в регистр AL - номер подфункции, соответствующей запросу на наличие в памяти (т.е. 00h).
Обработчик прерывания 2Fh резидентной программы должен прежде всего проверить номер функции в регистре АН; при обнаружении своей функции обработчик анализирует содержимое регистра AL и выполняет затребованные действия, после чего командой iret передает управление вызвавшей его программе.
Если обработчик обнаружил в регистре АН чужую функцию, он должен командой jmp CS:old_2fh передать управление
по цепочке обработчику, адрес которого был ранее в векторе 2Fh.
Защита резидентной программы от повторной установки
В результате вызов int 2Fh будет проходить по цепочке через все загруженные резидентные программы, пока не достигнет "своей" программы или не вернет управление в вызвавшую программу через обработчик DOS (который всегда будет самым последним в цепочке).
Устанавливаемая резидентная программа, выполнив команду int 2fh, должна проанализировать содержимое регистра AL. Если AL=0FFh, т.е. сделана попытка повторной установки программы, секция инициализации завершает выполнение программы вызовом функции DOS 4Ch и повторной установки не происходит. Если же в AL вернулось исходное значение 0, это говорит о том, что вызов int 2fh не был перехвачен первой копией устанавливаемой программы, которой, следовательно, не существует, и секция инициализации приступает к процедуре установки программы.
