{img1} |
резервное копирование баз данных |
|
Это также одна
из точек вставки "заплат", в которую гарантируется частый дос-
туп. Резидентная подпрограмма, вставленная в качестве "заплаты"
в этой точке, не может вызывать драйверы функций MS-DOS, т.к.
это приведет к сбою системы. |
win архиваторы |
|
{img2} |
резервное копирование файлов |
|
Резидентная подпрограмма также дол-
жна использовать свой собственный контекст для предотвращения
изменения существующего стека и регистров. Листинг 3-12 показы-
вает программные коды, необходимые для установки резидентной
подпрограммы в прерывании int 28h и поддержки этой резидентной
подпрограммы.
Листинг 3-12. |
avast 4 professional edition |
|
{img3} |
резервное копирование файлов |
|
Программа INIT28 - Вставка "заплат" в векторы
прерываний системы
----------------------------------------------------------------
; ==== INIT28 - Этот файл вырабатывает программу формата .COM ==
; ==== Установка резидентной подпрограммы путем вставки ========
; ==== "заплаты" в прерывание int 28h ==========================
PAGE 60,132
; ==== Соответствует установке прерывания ======================
VECT_NUM EQU 28h ; номер вектора для установки
OFF EQU 0h ; подпрограмма неактивна
ON EQU 0FFFFh ; подпрограмма активна
;
INCLUDE STDMAC.INC ; включение описания макробиблиотеки
; ==== НАЧАЛО ПРОГРАММНОЙ СЕКЦИИ ===============================
init28 SEGMENT
ASSUME cs:init28
ASSUME ds:init28
ORG 0
SEG_ORG EQU $
ORG 0100h
main PROC FAR
start: jmp init ; пропуск памяти "старого вектора"
old_v dd ? ; пространство для запоминания старого вектора
entry: jmp first ; пропуск "идентификации"
db 'TEST ROUTINE'
first: @SwapNewStack ; макрос для переключения в новый стек
cmp go_switch,ON ; проверка если я активна
jne bypass ; да - продолжить для выхода
mov go_switch,OFF ; нет - установка переключателя
; активна
;
; < ЗДЕСЬ ИДЕТ ВАША РЕЗИДЕНТНАЯ ПОДПРОГРАММА >
;
mov go_switch,ON ; установка состояния неактивна
bypass: @SwapOLDStack ; установка стека (и включение данных)
jmp cs:exit ; переход к подпр-ме обслуж-я прерыв-я
exit dd ?
go_switch dw ?
- 3-64 -
db 32 dup ('stack ')
TOS EQU $
LAST_BYTE EQU $
;
; ===== СЕКЦИЯ ИНИЦИАЛИЗАЦИИ - ПОСЛЕ ЗАГРУЗКИ НЕ НУЖНА =========
;
init: mov go_switch,OFF ; предупреждение активизации
mov ah,35h ; получение адреса вектора
mov al,VECT_NUM
@DosCall
mov word ptr exit,bx ; сохранение указателя IP для
; выхода
mov word ptr exit+2,es ; сохранение указателя CS для
; выхода
mov word ptr old_v,bx ; сохранение указателя IP для
; удаления
mov word ptr old_v+2,es ; сохранение указателя CS
; для удаления
mov ah,25h ; установка нового указателя
mov al,VECT_NUM
mov dx,offset entry ; установка указателя IP
; ... (CS и DS аналогично)
@DosCall
mov go_switch,ON
mov dx,9offset LAST_BYTE - SEG_ORG + 15) shr 4
mov ah,31h ; завершить и оставить резидентной
@DosCall
;
main ENDP
init28 ENDS
END start
----------------------------------------------------------------
Другие возможные точки вставки "заплат" зависят от типа ре-
зидентной подпрограммы и частоты, с которой она должна вызывать-
ся. |
kaspersky |
|
|
немецко русский словарь, архиватор winzip, программы архиваторы, программа резервного копирования, сетевой экран, .
системы управления базой данных
|
Для этого вектор прерывания клавиатуры изменяется на точку
для резидентной подпрограммы. Значение предыдущего вектора кла-
виатуры запоминается в адресе назначения инструкции перехода far
(далекий), которая используется при выходе из подпрограммы рези-
дентной памяти. Когда происходит прерывание клавиатуры, начина-
ется выполнение резидентной подпрограммы. После завершения обра-
ботки прерывания, резидентная подпрограмма передает управление
драйверу клавиатуры. Если резидентная подпрограмма действительно
использует ввод клавиатуры в некоторых случаях, которые не может
продолжить драйвер клавиатуры, то резидентная подпрограмма долж-
на сама обслужить и очистить прерывание, и затем вернуться в вы-
зывающую программу по инструкции IRET. Во всех случаях резидент-
ная подпрограмма должна сохранять контекст прерванной программы.
Другими возможными точками вставки "заплат", которые не вы-
полняют использование прерываний аппаратных средств, является
вставка "заплат" в один из векторов прерывания программного
обеспечения или в адрес перехода. Вставка "заплат" в MS-DOS че-
рез векторы прерываний программного обеспечения обычно не дела-
ется потому, что в операционной системе MS-DOS отсутствует воз-
- 3-63 -
можность распознавания таблицы переходов. Кроме того, в связи с
тем, что не существует стандартный интерфейс между MS-DOS и ин-
терфейсом ее BIOS, вставка "заплат" между MS-DOS и BIOS обычно
затруднительна. Использование прерываний программного обеспече-
ния остается проблематичным.
Одним из общих мест вставки "заплат" в векторы прерываний
MS-DOS является прерывание int 28h. Это, по-видимому, вспомога-
тельное прерывание, используемое внутри MS-DOS.
|
|
|