Ю. Косивцов

Двухкомпонентная антивирусная система


Пример 1

; Пример абсолютно бесполезной программы перехвата
; 13-го прерывания, которая якобы запретит вирусу
; запись на жесткий диск
CODE SEGMENT
ASSUME cs:CODE, ds:CODE
ORG 100h
START:
        jmp short INIT  ; Переход на процедуру инициализации

INT_13_ENTRY PROC FAR   ; Обработчик 13-го прерывания

        sti         ; Разрешить прерывания
        cmp ah,3    ; Функция записи секторов
        jne LOC_1   ; Если нет, то ничего не делать
        cmp dl,80h  ; Запись производится на жесткий диск ?
        jb LOC_1    ; Если нет, то ничего не делать,
        mov ah,3    ; иначе код ошибки "Устройство защищено от записи"
        stc         ; Взвести CARRY-флаг
        ret 2       ; Возврат в вызывающую программу

LOC_1:      ; Сюда передается управление при "безобидных" функциях
        cli         ; Запретить прерывания
        DB 0EAh     ; ─┐ Инструкция JMP FAR на оригинальный
IP_13   DW ?        ;  │ обработчик 13-го прерывания
CS_13   DW ?        ; ─┘

INT_13_ENTRY ENDP       ; Конец обработчика 13-го прерывания

INIT PROC NEAR          ; Начало процедуры инициализации

        mov ds,ax        ; ds = ax = 0
        lds ax,ds:[4Ch]  ; ds:ax - адрес обработчика 13-го прерывания
        mov es:CS_13,ds  ; Сохранение адреса обработчика и построение
        mov es:IP_13,ax  ; инструкции JMP FAR на него
        mov ds,bx        ; ds = bx = 0
        cli              ; Запретить прерывания
        mov ds:[4Eh],cs  ; Занести в таблицу векторов прерываний адрес
        mov word ptr ds:[4Ch], OFFSET INT_13_ENTRY ; процедуры обработки
        sti              ; Разрешить прерывания
        mov dx, OFFSET INIT ; Смещение первого байта за резидентной частью
        int 27h          ; Завершить и остаться резидентным

INIT ENDP

CODE ENDS
END START
Пример 2

; Пример трассировщика 13-го прерывания

INT_1 PROC NEAR            ; Обработчик 1-го прерывания
        push bp    ; Сохранить BP
        mov bp,sp  ; Загрузить в BP указатель стека
        cmp word ptr ss:[bp+4],0C000h  ; Проверка сегмента
        jae _EXIT  ; Если сегмент BIOS, то конец трассировки
; Далее должен быть анализатор "опасных" команд
        ...
        pop BP     ; Восстановление BP
        iret       ; Возврат (продолжение трассировки)

_EXIT:  mov ax,[bp+4]  ; В AX сегмент INT 13h
        mov bx,[bp+2]  ; В BX смещение INT 13h
        jmp _OK_TRACE  ; Выход из обработчика (конец трассировки)

INT_1 ENDP                  ; Конец обработчика 1-го прерывания

; Пример вызова трассировщика 13-го прерывания
        ...
        push ds         ; Сохранить DS
        mov SAVE_SS, ss ; Cохранить состояние стека в переменных
        mov SAVE_SP, sp ;
        pushf           ; Флаги в стек для эмуляции инструкции INT
        pushf           ; Флаги в стек для взведения флага трассировки
        pop ax          ; Флаги в AX
        or ax,100h      ; Выставление 8-го бита
        push ax         ; Запись AX в стек
        xor ax,ax       ; Обнуление AX
        mov ds,ax       ; Обнуление DS
        mov ax,0401H    ; Проверять один сектор
        mov cx,1        ; Дорожка 0, сектор 1
        mov dx,80h      ; Сторона 0, устройство 80h
        mov bx,OFFSET BUFFER    ;  Буфер на всякий случай
        push cs         ; Выставление ES на буфер
        pop es          ;
        popf            ; Взведение флага трассировки
        call dword ptr ds:[4CH] ; CALL FAR на обработчик INT 13h
        pop ds          ;  Если вернулось управление, значит флаг
        jmp _ERROR_TRACE  ;  трассировки был сброшен, ошибка
_OK_TRACE:                ; Сюда управление передается в случае удачи
        mov dx,cs:SAVE_SS    ; Загрузка DX сохраненным SS
        cli               ; Запретить прерывания
        mov ss,dx         ; Восстановить стек из переменных
        mov sp,cs:SAVE_SP    ;
        sti               ; Разрешить прерывания
        pop ds            ; Восстановить DS
; Далее можно использовать полученное значение точки входа INT 13h,
; которое содержится в AX:BX
        ...
Пример 3

INT_60 PROC FAR  ; Обработчик 60-го прерывания
        sti            ; Разрешить прерывания
        push bp        ; Сохранить BP
        mov bp,sp      ; Установить BP на вершину стека
        ...
        add [bp+2],1   ; Изменить в стеке адрес возврата
        ...
        pop bp         ; Восстановить BP
        retf 2         ; Возврат из прерывания со сбросом
                       ; флага трассировки
INT_60 ENDP       ; Конец обработчика 60-го прерывания

; Участок кода, вызывающий обработчик 60-го прерывания
        ...
        pop es     ; Загрузка сегмента регистра для маскирования
        int 60h    ; Вызов прерывания
        nop        ; Сюда должно вернуться управление
        nop        ; Сюда управление вернется
        ...

Пример 4

; Листинги точек входа INT 21h

; DOS версий 3.x и 4.x (подробнее см.[1])

2E: 3A 26 ....  CMP AH,CS:DOS_MAX_FUNC_N ; Проверка допустимости
                                         ; номера функции
77 ..           JA ERROR_NO   ; Номер больше допустимого, ошибка
80 FC 51        CMP AH,51H    ; Номер функции 51h ?
74 ..           JE FUNC_51    ; Да, переход на обработчик
80 FC 62        CMP AH,62H    ; Номер функции 62h ?
74 ..           JE FUNC_62    ; Да, переход на обработчик
                ...           ; и т.д.

; DOS версии 5.00 пpи загpузке в младшие адpеса памяти

FA              CLI          ; Запретить прерывания
80 FC 6C        CMP AH,6CH   ; Проверка допустимости номера функции
77 ..           JA ERROR_NO  ; Номер больше допустимого, ошибка
                ...          ; и т.д.

; DOS версии 5.00 пpи загpузке в старшие адpеса памяти

90              NOP          ; Эти две команды выставляются при
90              NOP          ; загрузке драйвера HIMEM.SYS
E8 ....         CALL ....    ; Проверка включения адресной шины А20
2E FF 2E ....   JMP FAR CS:[....] ; Переход на обработчик DOS
                ...
