Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Лекция № 9 Резидентные программы в MS DOS.ppt
Скачиваний:
9
Добавлен:
07.08.2024
Размер:
708.1 Кб
Скачать

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

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 не был перехвачен первой копией устанавливаемой программы, которой, следовательно, не существует, и секция инициализации приступает к процедуре установки­ программы.

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

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

Иногда для большей надежности идентификации своей функции резидентная программа,­ помимо значения 0FFh в регистре AL, возвращает еще какие-то обусловленные заранее коды в других регистрах. Часто через дополнительные регистры передается символьная информация, например имя программы.

4. Сканирование блоков памяти, выделяемых программам, на предмет поиска признака разыскиваемой резидентной программы. Сканировать можно не все блоки программы, а только префиксы программного сегмента PSP, к которому можно «привязать» признак-идентификатор программы.

Данный метод наиболее сложен, но и при правильной его реализации, это самый надежный подход.

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

При реализации этого подхода может использоваться недокументированная функция 52H прерывания 21H MS DOS, которая позволяет получить доступ к DIB (DOS INFO BLOCK), С помощью DIB можно получить доступ к очень важным структурам MS DOS, которые нельзя достигнуть другим образом. Местоположение этих структур не фиксировано.

Формат этой функции следующий:

Вход:

AH = 52h

Выход:

ES:BX - адрес DIB. Вычтя из этого адреса 2, можно

 

получить адрес того слова памяти в котором DOS хранит

 

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

 

цепочке выделенных блоков

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

Каждый блок памяти пpедваpяется Упpавляющим Блоком Памяти (MCB – Memory Control Block). MCB имеет фиксиpованный pазмеp 1 паpагpаф и фоpмат, описываемый следующей стpуктуpой:

Поле type (DB) содеpжит код, показывающий, является ли этот MCB последним (код буквы Z ) или непоследним (код буквы M)

Поле owner (DW) содеpжит PID (Program IDentificator) пpогpаммы, котоpой данный блок памяти пpинадлежит. На самом деле, несмотря на громкое название, PID - это всего лишь сегмент PSP владельца блока. Если значение этого поля нулевое, то блок свободен

Поле size (DW) содеpжит pазмеp блока памяти в паpагpафах (в это число не включен 1 паpагpаф, занимаемый самим MCB)

Следующие 3 байта (поле reserved) заpезеpвиpованы во всех веpсиях

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

Поле pgmname заpезеpвиpовано (не используется) в веpсиях DOS ниже 4.0. Начиная с веpсии 4.0, в MCB, пpедваpяющем пpогpаммный сегмент, здесь записано имя (без pасшиpения) пpогpаммы, находящейся в этом сегменте (если длина имени меньше 8 символов, оно заканчивается нулевым байтом)

Местоположение MCB программы можно узнать, вычтя 1 от сегмента кода (CS-1), если это COM-файл, и от DS (DS-1) - если EXE (сегментные регистры в этом случае указывают на сегмент PSP). Все MCB увязаны в цепочку и находятся на границе параграфов. Получив при помощи функции DOS 52h сегментный адрес начала цепочки MCB, можно пройти по всей цепочке. Переход к следующему блоку производится прибавлением к адресу текущего MCB его поля size и еще 1. Завершение при достижении

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

Пример. Сканирование памяти и проверка признака-идентификатора программы, «привязанного» к PSP (COM программа)

 

MOV

SI, CS

 

 

MOV

AH, 52H

 

 

INT

21H

 

 

MOV

ES,ES:[BX-2]

START:

CMP

WORD PTR ES:[1], 0

 

JZ

NEXT

 

 

PUSH

ES

 

 

POP

BX

 

 

INC

BX

 

 

;не данный ли -это сегмент?

 

CMP

SI,BX

 

 

JZ

NEXT

 

 

MOV

DS,BX

 

 

;нет ли признака резидента в сегменте

 

MOV

BX,CS:PRIZN

 

; признак “привязан” к PSP

 

CMP

WORD PTR DS:[103H],BX

 

JNZ

LAST_BLK

 

 

MOV

AH,4CH

; выход без установки

 

INT

21H