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

jmp zamok_start

include video.asm

; начало исполняемого кода

zamok_start:

; сохранение адреса кодового сегмента для его последующего вывода

; через последнее слово первой видеостраницы

mov ax,cx

mov bx,0B800h

mov es,bx

mov bx,4000

mov es:[bx],ax

IFDEF BIOS

; код для расширения BIOS, который переносит код в оперативную память

; по адресу 07C0:0 (в данный адрес далее считывается загрузчик ОС)

; в регистре ax запоминаем адрес оперативной памяти 07C0h

mov ax,07C0h

; данный адрес также запоминаем в регистре es

mov es,ax

; сохраняем регистр cx в стеке

push cx

; переписываем содержимое стека в регистр ds

pop ds

mov si,offset zamok

mov cx,offset ozu_group_c

sub cx,offset zamok

mov di,offset zamok

cld

rep movsb

; переход на метку m_go

; переход выполнен путем записи команды перехода (jmp) с аргументами в

; виде данных (сегмент 07C)

db 0EAh

dw offset m_go

dw 07C0h

; на эту точку произойдет переход, поскольку смещения в рамках

; сегмента не изменились, и переменные перенесены вместе с кодом

m_go:

; адрес сегмента изменился, извлекаем сохраненное значение из видеобуфера

mov bx,0B800h

mov es,bx

mov bx,4000

mov ax,es:[bx]

ENDIF

; копируем регистр cs в регистры ds и es через стек

push cs

pop ds

push cs

pop es

IFNDEF BIOS

push cs

pop ax

ENDIF

mov pzu_seg,ax

call clear_screen

mov pb_col,1Fh

; вывод титульного сообщения

mov di,offset title_string

mov ch,0

mov cl,60

mov ah,0Fh

call Put_string

; вывод значения сегмента памяти

mov ch,24

mov cl,10

mov ah,02h

mov di,offset num_mem

call Put_string

mov dx,pzu_seg

mov ah,dh

call Hex2Char

mov al,dl

call Put_byte

mov al,dh

call Put_byte

mov dx,pzu_seg

mov ah,dl

call Hex2Char

mov al,dl

call Put_byte

mov al,dh

call Put_byte

ws_is_pas:

; запрос пароля

mov ah,1Eh

promt_password

mov di,offset use_pas

; ввод пароля

mov ch,12

mov cl,42

; сравнение введенного пароля с эталонным

mov di,offset user_pas

mov si,offset_etal_pas

mov cx,9

cld

rep cmpsb

je ws_good_pas

; неверный пароль

mov di,offset bad_pas

mov ch,16

mov cl,44

mov ah,0Ch

call Put_string

mov ah,0

int 16h

mov di,offset null_str

mov ch,16

mov cl,32

mov ah,07h

call Put_string

; увеличение счетчика попыток

cmp c_oper,2

je ws_err_pas

inc c_oper

jmp ws_is_pas

ws_err_pas:

; пароль трижды введен неправильно

mov di,offset ill_pass

mov ch,16

mov cl,36

mov ah,0Сh

call Put_string

mov ah,0

int 16h

; аппаратная перезагрузка ПЭВМ при неправильном вводе пароля

IFDEF BIOS

db 0EAh

db 0FFF0h

dw 0F000h

ELSE

mov ah,4Ch

int 21h

ENDIF

; верный пароль

ws_good_pas:

call clear_screen

; очистка рабочих переменных, включая буфер клавиатуры и переменные,

; куда был считан пароль и с чем он был сравнен

push es

xor ax,ax

mov es,ax

cmp byte prt es:[417h],20h

mov byte prt es:[417h],0

pop es

; очистка рабочих переменных

mov di,offset ozu_group

mov cx,offset ozu_group_c

sub cx,offset ozu_group

clear_lock2:

mov byte prt [di],0

inc di

loop clear_lock2

; очистка буфера клавиш

push ex

xor ax,ax

mov es,ax

mov byte prt es:[41Ah],1Eh

mov byte prt es:[41Ch],1Eh

pop es

; возврат к основному BIOS

IFDEF

reft

ELSE

mov ax,04C00h

int 21h

ENDIF

; переменные ПЗУ

title_string db "Электронный замок ",0

num_mem db "Память = ",0

end_pass db " Введите пароль ",0

null_str db " ",0

good_pass db "Правильный пароль ",0

bad_pass db "Неправильный пароль ",0

ill_pass db "Рестарт ",0

; переменные ОЗУ

ozu_group:

id_string db "Замок"

user_pass db 32 dup (0)