|
Защита данных от несанкционированного доступа
int 21h
mov al, 0
mov cx, 1
mov dx, 1
mov bx, offset buffer
int 25h ; считали FAT
pop dx ;25h и 26h оставляют лишнее
mov al, 0 ;слово в стеке, извлекаем его
mov cx, 1
mov dx, 1
mov bx, offset bufrez ;Сохраняем резервную копию
int 25h ;FAT
pop dx
mov bx, offset buffer ;Процедура,которая определяет
mov ax, 118 ;запись FAT по номеру сектора
mov cx, ax
shl ax, 1
add ax, cx
test ax, 1
pushf
shr ax, 1
add bx, ax
mov ax, [bx]
popf
jnz getFAT11
and ax, 0FFFh
jmp getFAT21
getFAT11:
shr ax, 4
getFAT21:
cmp ax, 0ff7h ;1-ая проверка. BAD-?
jne no_disk1 ;НЕТ
mov bx, offset buffer ;ДА
mov ax, 120
mov cx, ax
shl ax, 1
add ax, cx
test ax, 1
pushf
shr ax, 1
add bx, ax
mov ax, [bx]
popf
jnz getFAT111
and ax, 0FFFh
jmp getFAT212
getFAT111:
shr ax, 4
getFAT212:
cmp ax, 0ff7h ;2-ая проверка. BAD-?
jne no_disk1 ;НЕТ
jmp f1
no_disk1:
jmp no_disk
f1:
good macro x, y ;Макроопределение,
которое
mov bx, offset buffer ;помечает сектор, как
mov ax, x ;свободный(занятый, плохой)
mov cx, ax
shl ax, 1
add ax, cx
test ax, 1
pushf
shr ax, 1
add bx, ax
popf
mov ax, y
mov [bx], ax
endm
good 118, 0h ;Пометить, как свободный
good 120, 0h ;Пометить, как свободный
fat macro b
mov al, 0
mov cx, 1
mov dx, 1
mov bx, offset b
int 26h ;Записали 1-ую копию FAT
pop dx
endm
fat buffer ;Запись FAT
mov al, 0
mov cx, 1
mov dx, 248
mov bx, offset buffer1
int 25h ;Считываем сектор
pop dx
mov bx, 0
mov ax, 0
pr_ent2:
mov dh, protect[bx] ;3-яя проверка. Проверяется
cmp buffer1[bx], dh ;наличие на диске
jne g1 ;закодированной информации
jmp g2
g1:
inc ax
g2:
inc bx
cmp bx, len_enter2
jb pr_ent2
cmp ax, 0
jne no_disk
mov al, 0
mov cx, 1
mov dx, 244
mov bx, offset buffer
int 26h ;Попытка записи на сектор
pop dx
mov al, 0
mov cx, 1
mov dx, 244
mov bx, offset buffer1
int 25h ;Попытка чтения с сектора
pop dx
cld ;df=0
lea si, buffer
lea di, buffer1
mov cx, 512
mov ax, 0
l:
cmpsb ;Сравнение записанной и
jne l1 ;считаной информации
jmp l2
l1: inc ax
l2: loop l
cmp ax, 5
jl no_disk
fat bufrez ;Запись FAT
pop ds
pop es
db 0cbh ;RetF. Перейти на программу
no_disk: ;Это не ключевая дискета
mov ah, 2
mov bx, 0
pr_ent1:
mov dl, dsk_key[bx] ;Вывод сообщения
sub dl, 10h
int 21h
inc bx
cmp bx, len_enter1
jb pr_ent1
fat bufrez ;Запись FAT
mov ah, 4ch ;Выход в DOS
mov al, 0
int 21h
copyright db 'Copyright(C) Юзефович Артем ( МГВРК,'
db ' Минск ), 1996'
db 0Dh, 0Ah, 'Ключевая'
db ' дискета.', 0Dh, 0Ah
db 0Dh, 0Ah, 0Dh, 0Ah, '$'
code ends
end start
;**************************************************************************
**
;**************************************************************************
**
;**
**
;** КП "ЗАЩИТА ДАННЫХ ОТ НСД"
**
;** Выполнили учащиеся гр.46491 ЕГАНОВ МАКСИМ и ЮЗЕФОВИЧ АРТЕМ
**
;** 1996
**
;**
**
;** Защита винчестера
**
;**************************************************************************
**
;**************************************************************************
**
keybd_flags_1_ equ 417h ;Флаги клавиатуры
data_10e equ 0
seg_a segment byte public
assume cs:seg_a, ds:seg_a
org 100h ;Счетчик команд
Block proc far
start:
jmp real_start
data_1 db 1
data_2 dw 7241h, 6574h
data_4 dw 2E6dh, 2020h
data_6 dw 2020h, 2020h
flag1 db 0
flag2 db 0
flag3 db 0
allf db 0
nameF db 'C:\sub_rosa\block.com', 0
Block endp
int_09h_entry proc far ;Процедура обработки 09h
push ax ;прерывания
push ds
mov al,cs:allf
xor al,1
mov cs:allf,al
jmp k2
k:
mov cs:allf,1
k2:
in al,60h ;Обращение к порту
клавиатуры
cmp al,32h ;Проверка на нужную
je l1 ;комбинацию
cmp al,08h
je l2
cmp al,1eh
je l3
jmp loc_1
l1:
mov cs:flag1,1
jmp loc_2
l2:
cmp cs:flag1,0
je loc_1
mov cs:flag2,1
jmp loc_2
l3:
cmp cs:flag2,0
je loc_1
mov cs:flag3,1
jmp loc_2
loc_1:
pop ds
pop ax
cmp cs:allf,1
jne r2
mov cs:flag1,0
mov cs:flag2,0
mov cs:flag3,0
r2:
jmp dword ptr cs:data_2
loc_2:
sub ax,ax
mov ds,ax
test byte ptr ds:keybd_flags_1_,8
jz loc_1 ;Alt нажата ?
in al,61h
mov ah,al ;Слудующий код необходим
для
or al,80h ;отработки аппаратного
out 61h,al ;прерывания
xchg ah,al
out 61h,al
mov al,20h ;Послать сигнал "конец
out 20h,al ;прерывания" контроллеру
;прерываний 8259
push bx
mov ah,0Fh
int 10h ;Video display
;ah=functn 0Fh
;get state, al=mode,
bh=page
;ah=columns on screen
cmp cs:flag1,1
jne loc_6
cmp cs:flag2,1
jne loc_6
cmp cs:flag3,1
jne loc_6
cmp al,1
je loc_3 ;Jump if equal
cmp al,3
jne loc_6 ;Jump if not equal
loc_3:
mov ax,0B800h
mov ds,ax ;Установка ключа проверки
mov al,cs:data_1 ;для 13h прерывания
xor al,1
mov cs:data_1,al
test al,1
jz loc_4 ;Jump if zero
mov ax,7458h ;Вывод символа
jmp short loc_5
db 90h
loc_4:
mov ax,744Fh ;Вывод символа
loc_5:
mov cs:flag1,0
mov cs:flag2,0
mov cs:flag3,0
mov ds:data_10e,ax
loc_6:
mov cs:allf,1
pop bx
pop ds
pop ax
iret ;Interrupt return
int_09h_entry endp
int_2Fh_entry proc far ;Mультиплексное
прерывание
cmp ah,13h
je loc_7 ;Jump if equal
jmp dword ptr cs:data_6
loc_7:
mov bx,0F000h
mov es,bx
mov bx,0FFF0h
mov dx,bx
iret ;Interrupt return
int_2Fh_entry endp
sub_1 proc near
sub ax,ax
mov ds,ax
mov ax,[bx+2]
mov es,ax
mov bx,[bx]
mov byte ptr es:[bx],0CFh
retn
sub_1 endp
int_13h_entry proc far ;Процедура обработки 13h
cmp ax,1059h ;прерывания
jne loc_8 ;Jump if not equal
cmp dx,2517h
jne loc_8 ;Jump if not equal
xchg dx,ax
iret ;Interrupt return
int_13h_entry endp
loc_8:
test cs:data_1,1 ;Проверка на ключ
jnz loc_10 ;Jump if not zero
loc_9:
jmp dword ptr cs:data_4 ;Вернуться к 13h
прерыванию
loc_10:
push ax
push bx
push ds
push es
mov bx,4
call sub_1
mov bx,0Ch
call sub_1
pop es
pop ds ;Далее слудуют проверки
pop bx ;функций 13h прерывания
pop ax
cmp ah,3
je loc_11 ;Jump if equal
cmp ah,5
je loc_11 ;Jump if equal
cmp ah,6
je loc_11 ;Jump if equal
cmp ah,7
je loc_11 ;Jump if equal
cmp ah,0Bh
je loc_11 ;Jump if equal
cmp ah,1Ah
jne loc_9 ;Jump if not equal
loc_11:
mov dl,3
jmp short loc_9
real_start:
mov ax,1059h ;Block уже загружен ?
mov dx,2517h
int 13h
cmp ax,2517h
jne loc_12 ;Jump if not equal
cmp dx,1059h
jne loc_12 ;Jump if not equal
mov ax,4C01h ;Выход в DOS
int 21h
loc_12:
mov ax,3509h
int 21h
mov data_2,bx ;Запомнить адрес 09h INT
mov bx,es
mov word ptr data_2+2,bx
mov dx,offset int_09h_entry
mov ax,2509h
int 21h ;Установка нового 09h INT
mov ax,3513h
int 21h
mov data_4,bx ;Запомнить адрес 13h INT
mov bx,es
mov word ptr data_4+2,bx
mov dx,offset int_13h_entry
mov ax,2513h
int 21h ;Установка нового 13h INT
mov ax,352Fh
int 21h
mov data_6,bx ;Запомнить адрес 2Fh INT
mov bx,es
mov word ptr data_6+2,bx
mov dx,offset int_2Fh_entry
mov ax,252Fh
int 21h ;Установка нового 2Fh INT
;Необходимое число
параграфов
;памяти
mov cs:data_1, 0
mov ah, 41h
push cs
pop ds
mov dx, offset nameF
int 21h
mov cs:data_1, 1
mov dx,((offset pgm_len+15)/16)+10h
mov ax,3100h ;Завершить и оставить
int 21h ;резидентным
data_8 db 'Защита Винчестера. '
copyright db 'Copyright(C) Юзефович Артем ( МГВРК,'
db ' Минск ), 1996'
db 0Dh, 0Ah, 'Винчестер'
db ' блокирован.', 0Dh, 0Ah
db 0Dh, 0Ah, 0Dh, 0Ah, '$'
pgm_len equ $-Block ;Длина программы
seg_a ends
end start
Приложение 3
Пример работы программы
В качестве примера работы программы приведем текстовый файл до
зашифрования:
“Sub Rosa - втайне (буквально: под розой).
У древних римлян роза была эмблемой тайны. Когда хозяин дома вешал
розу над пиршественным столом, гости знали, что все сказанное должно
оставаться тайной.
Впоследствии изображение розы на потолке помещений, где
происходили совещания, свидетельствовало о том, что все сказанное
здесь не должно быть разглашено.”
и после зашифрования:
9
Страницы: 1, 2, 3, 4, 5, 6, 7
|
Приглашения
09.12.2013 - 16.12.2013
09.12.2013 - 16.12.2013
|