- •Системное программное обеспечение
- •Общие сведения о резидентных программах
- •Общие сведения о резидентных программах
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
Установка резидентной программы
B oбoиx примерах уcтaнoвлeнa мeткa FINISH для oтмeтки кoнцa пpoцeдуpы пpepывaния. Для COM фaйлoв FINISH дaeт cмeщeниe oт нaчaлa PSP, кaк и тpeбуeтcя для пpepывaния 27H. Для EXE фaйлoв cмeщeниe oтcчитывaeтcя oт пepвoгo бaйтa, cлeдующeгo зa PSP, пoэтoму к нeму нeoбxoдимo пpибaвить 100H, чтoбы пepecчитaть нa нaчaлo PSP. Следует зaмeтить, чтo пoмecтив пpoцeдуpу в нaчaлo пpoгpaммы, мoжно иcключить уcтaнoвoчную чacть кoдa из peзидeнтнoй программы.
Прерывание 27H не может установить резидентную
программу, большую 64K.
Установка резидентной программы
Функция 31H пpepывaния 21H paбoтaeт aнaлoгичнo, зa иcключeниeм тoгo, чтo в DX дoлжнo coдepжaтьcя чиcлo 16- бaйтныx пapaгpaфoв oт нaчaлa PSP.
Пpeимущecтвoм этoй функции являeтcя тo, чтo oнa пepeдaeт poдитeльcкoй пpoгpaммe кoд выxoдa в регистре AL, дaющий инфopмaцию o cтaтуce пpoцeдуpы.
Poдитeльcкaя пpoгpaммa пoлучaeт этoт кoд c пoмoщью функции 4DH пpepывaния 21H (в AH – номер функции,
вAL - код выхода).
Вслучае использования этой функции нужно правильно рассчитать длину оставляемого в памяти блока программы.
Установка резидентной программы
|
Пример. |
;сегмент данных |
|
DSEG SEGMENT |
|
BUFFER |
DВ 2000 DUP(?) |
P1 |
DD ? |
DSEG ENDS |
|
;сегмент стека |
|
SSEG SEGMENT STACK |
|
ST |
DW 100 DUP(?) |
SSEG ENDS |
|
;сегмант кода |
|
CODE SEGMENT |
|
ASSUME CS:CODE, DS:DSEG, SS:SSEG |
|
BEGIN: |
|
. |
|
. |
|
. |
|
;все, что ниже в памяти не останется |
|
|
|||
NO_RES: |
|
|
|
|
|
MOV |
AX, |
SIZE |
BUFER+SIZE P1+16 |
; сегмент |
данных |
MOV |
BX, |
SIZE |
ST+16 |
; сегмент |
стека |
Установка резидентной программы
MOV |
DX,NO_RES-BEGIN+16 ; часть сегмента кода |
|
MOV |
CL,4 |
|
SHR |
AX,CL |
; делим на 16 |
SHR |
BX,CL |
|
SHR |
DX,CL |
|
ADD |
AX,BX |
|
ADD |
DX,AX |
|
ADD |
DX,10H |
; учтем PSP - 10H параграфов |
MOV |
AX,3100H |
|
INT |
21H |
|
CODE |
ENDS |
|
END |
BEGIN |
|
Защита резидентной программы от повторной установки
Может получиться, что пользователь, установив резидентную программу, забудет об этом и запустит ту же программу повторно. В этом случае в память будет загружена и останется резидентной вторая копия той же программы.
Это плохо не только потому, что понапрасну расходуется память; более неприятным является вторичный перехват тех же векторов. Если резидентная программа после ее активизации не обращается к старому содержимому перехваченных ею векторов, то вторая копия полностью лишит первую работоспособности и тогда повторная загрузка приведет только к расходованию памяти.
Защита резидентной программы от повторной установки
Если, однако, резидентная программа в процессе своей работы передает управление старому обработчику перехваченного ею прерывания, то новая копия резидентной программы, сохранившая в процессе инициализации адрес первой копии в качестве содержимого перехватываемого вектора, будет при каждой активизации вызывать и первую копию. В результате резидентная программа будет фактически выполняться при каждом вызове дважды. Во многих случаях такое повторное выполнение нарушит правильную работу программы. Поэтому обязательным элементом любой резидентной программы является процедура защиты ее от по вторной загрузки (установки).
Защита резидентной программы от повторной установки
Существует несколько способов обнаружения копии резидентной программы в памяти:
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 |
|
Здесь, правда, существует одна не слишком приятная проблема. Могут совпасть номера функций, используемых разными программами. Выйти из этого положения можно следующим способом: программа должна реагировать не просто на посланный код, а на последовательность кодов. Тем самым можно свести почти до нуля вероятность совпадений.
