Защита информационных процессов на аппаратном уровне. Защита на уровне расширений BIOS. Защита на уровне загрузчиков операционной системы, страница 5

·  очищает текстовый видеобуфер;

·  фиксирует адрес прерывания работы с диском int 13h;

·  уменьшает на один килобайт размер ОЗУ в переменной ROM Bios;

·  перемещает резидентную часть модифицированного загрузчика в область памяти, которая после коррекции размера будет недоступна;

·  переопределяет вектор int 13h на установленный "резидентно" обработчик;

·  перемещает код на 512 байт назад и производит чтение исходного (первичного) загрузчика.

.MODEL TINY

.CODE

org 0

start:

; установка DS на экран

mov ax,0B800h

mov ds,ax

; очистка экрана

xor bx,bx

mov cx,4000

m17:

mov word prt ds:[bx],0700h

add bx,2

loop m17

; чтение адреса старого прерывания int 13h в переменную old_13

cli

xor ax,ax

mov ds,ax

mov bx,13h*4

mov ax,ds:[bx]

mov word prt cs:[old_13+7C00h],ax

add bx,2

mov ax,ds:[bx]

mov word prt cs:[old_13+7C02h],ax

sti

; уменьшение на килобайт объема доступной памяти

xor ax,ax

mov es,ax

mov bx,413h

mov ax,es:[bx]

dec ax

mov cx,ax

; вычисление физического адреса этой точки

mov bx,040h

mul bx

mov dx,cx

mov es,ax

mov ax,cs

mov ds,ax

; установка резидентной части в вычисленное место

mov cx,120

mov si,offset new_13

add si,7C00h

mov di,offset new_13

cld

rep movsw

; установка измененного объема доступной памяти

xor bx,bx

mov ds,bx

mov bx,413h

mov ds:[bx],dx

; подмена прерывания int 13h

cli

xor ax,ax

mov ds,ax

mov bx,13h*4

mov word prt ds:[bx],offset new_13

mov ax,es

add bx,2

mov ds:[bx],ax

sti

; перемещение кода на 512 байт назад

xor ax,ax

mov es,ax

mov ds,ax

mov cx,200h

mov di,7E00h

mov si,7C00h

cld

rep movsb

; переход на перемещенный код

db 0EAh

dw 07E889h

dw 0

; в эту точку загрузка старого BOOT сектора

mov ax,0201h

mov ch,0

mov cl,1

mov dh,0

mov dl,0

mov bx,cs

mov es,bx

mov bx,7C00h

int 13h

; блокирование клавиатуры

mov al,2

out 21h,al

; переход обратно на 0:7C00h

db 0EAh

db 07C00h

dw 0

; резидентная часть

new_13:

pushf

cmp cs:[tg],1

je ost

cmp dl,0

jne ost

cmp ah,3

jne read

cmp ch,0

jne ost

mov ch,10

jmp ost

read:

cmp ah,2

jne ost

cmp ch,0

jne ost

move ch,10

ost:

popf

jmp dword prt cx:[old_13]

old_13 dd 0

tg dw 0

db 291 dup(0)

db 55h

db 0AAh

end start

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

  После установки нового обработчика int 13h, как легко видеть, процедура чтения загрузчика, выполненная штатным образом приведет к чтению BOOT сектора с k-й дорожки (где и находится исходный BOOT сектор). Кроме того, все последующие процедуры операционной среды и прикладного ПО, работающего в загруженной таким образом ОС, будут работать с дискетой так, как с дискетой исходного формата (перемещения нулевой дорожки не было).

  Рассмотренная технология соответствует исторически самому раннему способу построения ИПС- "невидимая дискета". Этот способ заключается в том, что критичное к воздействию РПВ программное обеспечение выносится на системную дискету, пользование которой (в том числе и выполнение программ) невозможно без загрузки DOS именно с этой дискеты. Практически такая дискета выглядит довольно нетривиально: будучи вставленной в дисковод она выглядит как неформатированная (или, в исходном варианте, пустая). После загрузки с такой "пустой" дискеты пользователь сразу входит в заданную программную среду и работает с ней.