|
Защита данных от несанкционированного доступа
begin
P[apColor, 50] := #$11; {1F}
P[apColor, 51] := #$11; {2F}
P[apColor, 1] := #$21; {71}
GetPalette := @P[AppPalette];
end;
{Изменить палитру окна выбора файлов}
function TMyFDialog.GetPalette: PPalette;
const
{Синяя палитра}
CMyCluster =
#64#65#66#67#68#69#70#71#72#73#74#75#76#77#78#79#80#81#82+
#83#84#85#86#87#88#89#90#91#92#93#94#95;
P: string [32] = CMyCluster;
begin
GetPalette := @P;
end;
{Инициализировать окно выбора файлов}
constructor TMyFileDialog.Init(AWildCard: tWildStr;
const ATitle, InputName: string;
AOptions: Word; HistoryId: Byte);
var
ScrollBar: PScrollBar;
R : TRect;
begin
{ Создание окна диалога }
R.Assign(15, 1, 64, 20);
TDialog.Init(R, ATitle);
Options:= Options or ofCentered;
WildCard:= AWildCard;
{ Строка ввода имени файла }
R.Assign(3, 3, 31, 4);
FileName:= New(PFileInputLine, Init(R, 79));
FileName^.Data^:= WildCard;
Insert(FileName);
R.Assign(2, 2, 6, 3);
Insert(New(PLabel, Init(R, InputName, FileName)));
R.Assign(31, 3, 34, 4);
Insert(New(PHistory, Init(R, FileName, HistoryId)));
{ Линейка скроллинга и список файлов }
R.Assign(3, 14, 34, 15);
ScrollBar:= New(PScrollBar, Init(R));
Insert(ScrollBar);
R.Assign(3, 6, 34, 14);
FileList:= New(PFileList, Init(R, ScrollBar));
Insert(FileList);
R.Assign(2, 5, 8, 6);
Insert(New(PLabel, Init(R, 'Файлы', FileList)));
{ Задание кнопок }
R.Assign(35, 3, 46, 5);
if AOptions and fdOpenButton <> 0 then
begin
Insert(New(PButton, Init(
R, 'Открыть', cmFileOpen, bfDefault)));
Inc(R.A.Y,3); Inc(R.B.Y,3);
end;
if AOptions and fdOkButton <> 0 then
begin
Insert(New(PButton, Init(
R, 'Ага', cmFileOpen, bfNormal)));
Inc(R.A.Y,3); Inc(R.B.Y,3);
end;
if AOptions and fdReplaceButton <> 0 then
begin
Insert(New(PButton, Init(
R, 'Замена',cmFileReplace, bfNormal)));
Inc(R.A.Y,3); Inc(R.B.Y,3);
end;
if AOptions and fdClearButton <> 0 then
begin
Insert(New(PButton, Init(
R, 'Удал.',cmFileClear, bfNormal)));
Inc(R.A.Y,3); Inc(R.B.Y,3);
end;
Insert(New(PButton, Init(
R, 'Нека', cmCancel, bfNormal)));
{ Информационная панель с параметрами файла }
R.Assign(1, 16, 48, 18);
Insert(New(PFileInfoPane, Init(R)));
SelectNext(False);
{ Загрузка каталога }
if AOptions and fdNoLoadDir = 0 then
begin
FileList^.ReadDirectory(WildCard);
Directory:= NewStr(GetCurDir);
end;
end;
Var
MyApp: TMyApp; {Переменная основного объекта}
Begin
WriteLn('Система защиты данных от НСД. Версия 1.0 beta.'+
+' 1996 МГВРК Еганов М. Ю., Юзефович А. Г.');
GetIntVec($09,Int09_Save);
MyApp.Init;
MyApp.Run;
MyApp.Done;
SetIntVec($09, Int09_Save);
End.
Приложение 2
Листинг библиотек
{**************************************************************************
*}
{**************************************************************************
*}
{**
**}
{** КП "ЗАЩИТА ДАННЫХ ОТ НСД"
**}
{** Выполнил учащийся гр.46491 ЕГАНОВ МАКСИМ
**}
{** 1996
**}
{**
**}
{** Программа инсталляции
**}
{**************************************************************************
*}
{**************************************************************************
*}
Program Install;
Uses
App, Dialogs, Drivers, Menus, MsgBox, Objects,
Views, Memory, StdDlg, CRT, DOS, SetConf;
Const {константы кодов команд}
cmAboutBox = 700;
cmCode = 1001;
cmDeCode = 1002;
cmSetPass = 1005;
cmLockDisk = 1006;
cmOptions = 1007;
cmKeyDisk = 1008;
cmPasswords = 1009;
RMenuBar: TStreamRec = ( {Запись для работы с потоком, TV}
ObjType: 2000;
VmtLink: Ofs(TypeOf(TMenuBar)^);
Load: @TMenuBar.Load;
Store: @TMenuBar.Store);
Var
Save23hInt : Pointer; {Переменные сохранения векторов прерываний}
Save1bhInt : Pointer;
MyApp : TApplication;
MyRes : TResourceFile;
MyStream : PBufStream;
{Формирование подменю "Файлы"}
function MyStdFileMenuItems(Next: pMenuItem): pMenuItem;
begin
MyStdFileMenuItems:=
NewItem('Выбрать...', 'F3', kbF3, cmOpen, hcOpen,
NewItem('Сменить каталог...', '',
kbNoKey, cmChangeDir, hcChangeDir,
NewLine(
NewItem('Выход в ДОС', '', kbNoKey, cmDosShell, hcDosShell,
NewItem('Завершение', 'Alt+X', kbAltX, cmQuit, hcExit,
Next)))));
end;
{Формирование основного меню}
procedure CreateMenuBar;
var
MenuBar: PMenuBar;
R : TRect;
begin
R.Assign(0, 0, 80, 1);
MenuBar:= New(pMenuBar, Init(R, NewMenu(
NewSubMenu('~Ф~айлы', hcNoContext, NewMenu(
MyStdFileMenuItems(nil)),
NewSubMenu('~З~ащита', hcNoContext, NewMenu(
NewItem('~У~становить пароль', 'F5', kbF5, cmSetPass, 1005,
NewItem('~Б~локировать винчестер', '', kbNoKey, cmLockDisk, 1006,
nil))),
NewSubMenu('~К~лючевая дискета', hcNoContext, NewMenu(
NewItem('~Д~обавить проверку по ключу', '', kbNoKey, cmKeyDisk,
1008, nil)),
NewSubMenu('~К~риптография', hcNoContext, NewMenu(
NewItem('Зашифровать файл данных','', kbNoKey, cmCode, 1001,
NewItem('Расшифровать файл данных','', kbNoKey, cmDeCode, 1002,
nil))),
NewSubMenu('~Н~астройки', hcNoContext, NewMenu(
NewItem('Криптография...','F9', kbF9, cmOptions, 1007,
NewItem('Пароли...','F8', kbF8, cmPasswords, 1008, nil))),
NewItem('~О~ программе', '', kbAltJ, cmAboutBox, 700, nil)))))))));
MyRes.Put(MenuBar, Config);
Dispose(MenuBar, Done);
end;
{Процедура управления формой курсора}
procedure SetCursorSize(c_start,c_end:byte);
var
regs: registers;
begin
with regs do
begin
ah:=$01;
ch:=c_start;
cl:=c_end;
end;
intr($10,regs);
end;
{Процедура замены вектора преываний}
{$F+}
procedure My23hInt;Interrupt;
begin
end;
{$F-}
{Процедура копирования файлов}
procedure CopyFyle(FromCopy: string);
const
TempLength = 1125.28;
var
ToCopy : string;
Source, Target : file;
NumRead, NumWrite: word;
buf : string;
TempPos, Temp : real;
begin
{Открыть файлы}
ToCopy := 'c:';
ToCopy := ToCopy + copy(FromCopy, 3, length(FromCopy) - 2);
assign(Source, FromCopy);
assign(Target, ToCopy);
reset(Source, 1);
rewrite(Target, 1);
Temp := 0;
{Копировать}
repeat
BlockRead(Source, Buf, Sizeof(Buf)-1, NumRead);
if FromCopy = 'a:\sub_rosa\sub_rosa.exe' then
begin
TempPos := 100*Temp/TempLength;
Temp := Temp + 2.5;
GotoXY(17, 25);
if (TempPos > 98) and (TempPos < 100) then write('100.0 %')
else write(TempPos: 4: 1, ' %');
end;
{Обработчик ошибок}
if (NumRead<>Sizeof(Buf)-1) and (not EOF(Source)) then
begin
WriteLn;
WriteLn('Ошибка чтения с диска');
SetIntVec($23, Save23hInt);
SetIntVec($1b, Save1bhInt);
halt;
end;
BlockWrite(Target,Buf,NumRead,NumWrite);
If NumRead<>NumWrite then
begin
WriteLn;
WriteLn('На диске не хватает места для записи');
SetIntVec($23, Save23hInt);
SetIntVec($1b, Save1bhInt);
halt;
end;
until NumRead=0;
close(Source);
close(Target);
end;
Var
Directory: string; {Куда копировать}
Begin {Основная часть программы}
GetIntVec($23, Save23hInt); {Подменить вектора прерываний 23h, 1bh}
GetIntVec($1b, Save1bhInt); {Отключение Ctrl-C или Ctrl-Break}
SetIntVec($23, @My23hInt);
SetIntVec($1b, @My23hInt);
SetCursorSize(32, 0);
{$I-}
Directory:='c:\sub_rosa'; {Создать каталог для установки}
MkDir(Directory);
if IOResult <> 0 then {Обработчик ошибок}
begin
WriteLn('Система уже была инсталлирована');
SetIntVec($23, Save23hInt);
SetIntVec($1b, Save1bhInt);
halt;
end;
{$I+}
{Создать файл ресурсов с привязкой к уникальным параметрам BIOS}
MyStream := New(PBufStream, Init('c:\sub_rosa\Setup.res', stCreate,
2048));
MyRes.Init(MyStream);
RegisterType(RMenuBar);
CreateMenuBar;
MyRes.Done;
{Копировать файлы}
CopyFyle('a:\sub_rosa\block.');
CopyFyle('a:\sub_rosa\keydisk.');
CopyFyle('a:\sub_rosa\plus.');
CopyFyle('a:\sub_rosa\passw.');
CopyFyle('a:\sub_rosa\system.res');
GotoXY(1, 25);
Write('Инсталлировано');
CopyFyle('a:\sub_rosa\sub_rosa.exe');
WriteLn;
WriteLn('Система готова к работе');
ChDir('c:\sub_rosa');
Mem[$40:$1a]:=Mem[$40:$1c];
{Восстановить вектора прерываний}
SetIntVec($23, Save23hInt);
SetIntVec($1b, Save1bhInt);
End.
{**************************************************************************
*}
{**************************************************************************
*}
{**
**}
{** КП "ЗАЩИТА ДАННЫХ ОТ НСД"
**}
{** Выполнил учащийся гр.46491 ЕГАНОВ МАКСИМ
**}
{** 1996
**}
{** **}
{** Модуль привязки к BIOS
**}
{**************************************************************************
*}
{**************************************************************************
*}
Unit SetConf;
Interface
function config: string; {Дата BIOS}
Implementation
{Получить дату BIOS}
function config: string;
var
conf, s: String;
Control: char absolute $F000:$FFF5;
i :byte;
begin
Move(Control, s[1], 8);
s[0] := #8;
for i := 1 to length(s) do conf[i] := chr(ord(s[i]) + 5*i);
conf[0] := #8;
config := conf;
end;
End.
{**************************************************************************
**}
{**************************************************************************
**}
{**
**}
{** КП "ЗАЩИТА ДАННЫХ ОТ НСД"
**}
{** Выполнил учащийся гр.46491 ЮЗЕФОВИЧ АРТЕМ
**}
{** 1996
**}
{**
**}
{** Дописывание к файлу
**}
{**************************************************************************
**}
{**************************************************************************
**}
code segment public
assume cs: code, ds: code, es: code, ss: code
org 80h ;Хвост команды
dta label byte
com_siz db ?
probel db ?
com_par db ?
org 100h
start:
jmp test_par
type_t db ? ;Тип расширения target
len_s dw ? ;Длина source_file
len_t_1 dw ? ;Длина target_file
len_t_2 dw ? ;Длина target_file
hand_1 dw ? ;Обработка source_file
hand_2 dw ? ;Обработка target_file
NameTarOff dw ? ;Смещение имени target_file
NameSouOff dw ? ;Смещение имени source_file
ext_a db 'com', 'exe' ;Допустимые расширения
mbad_use db 10, 13
syn db 10, 13
TEST_PAR:
lea si, dta+1 ;Далее идет проверка
l_0: ;параметров в командной
cmp byte ptr [si], 0Dh ;строке
je c_syn
cmp byte ptr [si], '?'
je c_h
cmp byte ptr [si], ' '
jne not_prob
inc si
jmp short l_0
c_syn:
int 20h
c_h:
int 20h
use:
int 20h
not_prob:
mov NameTarOff, si ;1-ый параметр правильный ?
l_1:
cmp byte ptr [si], 0Dh
je c_b_1_m_2
cmp byte ptr [si], ' '
je c_b_1
cmp byte ptr [si], '.'
je d_t_1
inc si
jmp short l_1
c_b_1_m_2:
jmp use ;Недопустимое расширение
c_b_1: ;у target_file
jmp use
D_T_1: ;Анализ расширения
inc si
call det_type
pop ax
mov type_t, al
cmp ax, 2
je C_B_1
add si, 3
lea cx, dta
add cl, byte ptr dta
adc ch, 0
cmp cx, si
jbe C_M_2
mov byte ptr [si], 0
l_2: ;2-ой параметр
правильный ?
inc si
cmp cx, si
jb c_m_2
cmp byte ptr [si], ' '
je l_2
mov NameSouOff, si
l_3:
cmp byte ptr [si], '.'
je d_t_2
inc si
cmp cx, si
jb c_b_2
jmp l_3 ;Отсутствует source_file
c_m_2:
jmp use
d_t_2:
inc si
call det_type
pop ax
cmp ax, 0
je test_end
c_b_2:
jmp use
test_end:
add si, 2
cmp cx, si
jb c_b_2
mov byte ptr [si+1], 0
OPEN_F: ;Открыть, определить
длину
mov ah, 3dh ;и прочитать в буфер файл
mov al, 2 ;source_file
mov dx, NameSouOff
int 21h
jnc yes_open
int 20h
yes_open: ;Определить длину
mov bx, ax
mov hand_2, ax
mov ah, 42h
xor cx, cx
xor dx, dx
mov al, 2
int 21h
jnc yes_p_1
cn_mov_2:
int 20h
yes_p_1:
mov word ptr len_s, ax
mov ah, 42h
xor cx, cx
xor dx, dx
mov al, 0
int 21h
jc cn_mov_2
mov ah, 3Fh
lea dx, buff
mov cx, word ptr len_s
int 21h
jnc open_targ
int 20h
OPEN_TARG ;Открыть target_file
mov ah, 3Dh
mov al, 2
mov dx, NameTarOff
int 21h
jnc det_len_1
int 20h
det_len_1:
mov hand_1, ax
mov bx, hand_1
mov ah, 42h
xor cx, cx
xor dx, dx
mov al, 2
int 21h
jnc rest_len
jmp cn_mov_1
rest_len:
mov len_t_1, dx
mov len_t_2, ax
TO_PROC: ;Если target_file - COM,
cmp type_t, 0 ;то CALL WR2COM.
je c_com ;Если target_file - EXE,
call wr2exe ;то CALL WR2EXE.
jmp short CLOSE_F
c_com:
call wr2com
CLOSE_F: ;Закрыть файлы
mov ah, 3Eh ;source_file и target_file
mov bx, hand_1
int 21h
jnc cl_2
int 20h
cl_2:
mov ah, 3Eh
mov bx, hand_2
int 21h
jnc OK
int 20h
OK:
mov ah, 9
int 20h
det_type proc ;Подпрограммы
mov bp, sp
push ax
push cx
push di
xor ax, ax
lea di, ext_a
loo_1:
push si
push di
mov cx, 3
repe cmpsb
jne end_loo_1
pop di
pop si
mov [bp+2], ax
jmp d_ret
end_loo_1:
inc al
pop di
add di, 3
pop si
cmp al, 2
jb loo_1
mov [bp+2], ax
d_ret:
pop di
pop cx
pop ax
ret
det_type endp
wr2exe proc
push ax
push bx
push cx
push dx
push si
push di
jmp st_2exe
hdr label byte
dw ?
PartPag dw ?
PageCnt dw ?
dw ?
HdrSize dw ?
dw 5 dup(?)
ExeIP dw ?
ReloCS dw ?
len_hdr equ $-hdr ;Команды, записываемые
imit label byte ;в конец файла
mov ax, es ;Команды записи в стек
I_1: ;адреса начала EXE-файла
add ax, 0
add ax, 10h
push ax
I_2:
mov ax, 0
push ax ;Команды пердачи управления
mov ax, 100h ;source_file, как и для COM
push ax ;файла
db 0C3h
len_imit equ $-imit
st_2exe:
mov ah, 42h ;Читать заголовок EXE-файла
mov bx, hand_1 ;Установить указатель на
xor cx, cx ;начало файла
xor dx, dx
mov al, 0
int 21h
jc cn_mov_1
mov ah, 3Fh
lea dx, hdr
mov cx, len_hdr
int 21h
jnc prep_end
cn_r_1:
int 20h
prep_end: ;Настроить команды,
дописываемые
mov ax, ReloCS ;в конец файла target_file
mov word ptr i_1[1], ax ;Записать в стек адреса
mov ax, ExeIP ;начала EXE-файла
mov word ptr i_2[1], ax ;Передать управление файлу
mov cx, len_t_1 ;source_file по соглашениям
mov dx, len_t_2 ;системы DOS
mov si, cx ;Записать команды в конец
mov di, dx ;EXE-файла
mov ah, 42h
mov al, 0
mov bx, hand_1
int 21h
jnc yes_wr
cn_mov_1:
int 20h
yes_wr:
mov ah, 40h
lea dx, imit
mov cx, len_imit
int 21h
jnc wr_sour
cn_w_1:
int 20h
wr_sour: ;Записать source_file в
конец
mov cx, si ;EXE-файла
mov dx, di
add dx, len_imit
jnc m1
inc cx
m1:
add dx, 15
jnc m2
inc cx
m2:
and dx, 0FFF0h
mov si, cx
mov di, dx
mov ah, 42h
mov al, 0
int 21h
jc cn_mov_1
mov ah, 40h
lea dx, buff
mov cx, len_s
int 21h
jc cn_w_1
mov ax, si
mov bx, di
add bx, ax
mov cl, 4
ror bx, cl
sub bx, 10h
sub bx, HdrSize
mov ReloCS, bx
mov ax, PartPag
and ax, 000Fh
mov bx, ax
add ax, len_imit
add ax, 15
and ax, 0FFF0h
add bx, 100h
sub bx, ax
mov ExeIP, bx
mov ax, si
mov bx, di
add bx, len_s
jnc m3
inc ax
m3:
mov dx, bx
and dx, 1FFh
mov PartPag, dx
add bx, 511
jnc m4
inc ax
m4:
and bh, 0FEh
mov ah, bh
mov cl, 9
ror ax, cl
mov PageCnt, ax ;Записать настроенный
mov ah, 42h ;заголовок в начало
EXE-файла
mov bx, hand_1
xor cx, cx
xor dx, dx
mov al, 0
int 21h
jnc write_1
jmp cn_mov_1
write_1:
mov ah, 40h
lea dx, hdr
mov cx, len_hdr
int 21h
jnc m_ret
jmp cn_w_1
m_ret:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
wr2exe endp
wr2com proc ;Процедура дописывания в
;конец COM-файла
jmp st_2com
new_beg label byte
mov ax, cs
c_1:
add ax, 0
push ax
c_2:
mov ax, 0
push ax
db 0CBh
len_new_beg equ $-new_beg
com label byte
mov di, 100h
push cs
pop ds
c_3:
mov ax, 0
c_4:
add ax, 0
and AX, 000Fh
mov bx, 16
sub bx, ax
and bx, 000Fh
add bx, len_new_beg
mov ax, 100h
sub ax, bx
mov si, ax
mov cx, len_new_beg
rep movsb
push es
pop ds
push es
mov ax, 100h
push ax
push ax
db 0C3h
len_com equ $-com
old_beg label byte
db len_new_beg dup(?)
len_im equ $-com
st_2com:
mov bx, hand_1
mov ah, 42h
xor cx, cx
xor dx, dx
mov al, 0
int 21h
jnc read_beg
jmp cn_mov_2
read_beg:
mov ah, 3Fh
lea dx, old_beg
mov cx, len_new_beg
int 21h
jnc prep_beg
jmp cn_r_1
prep_beg:
mov ax, len_t_1
mov bx, len_t_2
add bx, len_im
jnc pr1
inc ax
pr1:
add bx, 15
and bx, 0FFF0h
add bx, ax
mov cl, 4
ror bx, cl
mov word ptr c_1[1], bx
mov ax, len_t_2
and ax, 000Fh
mov bx, ax
add ax, len_im
add ax, 15
and ax, 0FFF0h
add bx, 100h
sub bx, ax
mov word ptr c_2[1], bx
mov bx, hand_1
mov ah, 42h
xor cx, cx
xor dx, dx
mov al, 0
int 21h jnc wr_beg
jmp cn_mov_2
wr_beg:
mov ah, 40h
lea dx, new_beg
mov cx, len_new_beg
int 21h
jnc prep_c_end
jmp cn_w_1
prep_c_end:
mov ax, len_t_2
mov word ptr c_3[1], ax
mov word ptr c_4[1], len_im
mov bx, hand_1
mov ah, 42h
mov cx, len_t_1
mov dx, len_t_2
mov al, 0
int 21h
jnc wr_end
jmp cn_mov_2
wr_end:
mov ah, 40h
lea dx, com
mov cx, len_im
int 21h
jnc cal_b
jmp cn_w_1
cal_b:
mov cx, len_t_1
mov dx, len_t_2
add dx, len_im
jnc cal_1
inc cx
cal_1:
add dx, 15
jnc cal_2
inc cx
cal_2:
and dx, 0FFF0h
mov bx, hand_1
mov ah, 42h
mov al, 0
int 21h
jnc wr_sr
jmp cn_mov_2
wr_sr:
mov ah, 40h
lea dx, buff
mov cx, len_s
int 21h
jnc end_2com
jmp cn_w_1
end_2com:
ret
wr2com endp
buff label byte
copyright db 'Copyright(C) Юзефович Артем ( МГВРК,'
db ' Минск ), 1996'
db 0Dh, 0Ah, 'Программа дописывания'
db ' по вирусному принципу.', 0Dh, 0Ah
db 0Dh, 0Ah, 0Dh, 0Ah, '$'
code ends
end start
{**************************************************************************
**}
{**************************************************************************
**}
{**
**}
{** КП "ЗАЩИТА ДАННЫХ ОТ НСД"
**}
{** Выполнил учащийся гр.46491 ЮЗЕФОВИЧ АРТЕМ
**}
{** 1996
**}
{**
**}
{** Пароль на файл
**}
{**************************************************************************
**}
{**************************************************************************
**}
сode segment
assume cs: code, ds:code, es: code, ss: code
org 100h
start: jmp print
enter_pas label byte
db 'E'+60h, 80h,'n'+60h, 80h,'t'+60h, 80h,'e'+60h, 80h
db 'r'+60h, 80h
db 80h, 80h, 80h
db 'P'+60h, 80h,'a'+60h, 80h,'s'+60h, 80h,'s'+60h, 80h
db 'w'+60h, 80h,'o'+60h, 80h,'r'+60h, 80h,'d'+60h, 80h,
':'+60h
db 6Ah, 6Dh
len_enter equ $-enter_pas
password label byte
db 'm'+60h, '&'+60h, 'a'+60h ;Пароль m&a
len_pas equ $-password ;Счетчик повторов
count_err equ 3
buff label byte
db len_pas dup(?)
print:
push es
push ds
push cs
push cs ;Адресация регистров
pop es
mov cx, count_err ;Инициализация
счетчика
pr_1: ;Печать приглашения
mov ah, 2
mov bx, 0
pr_ent:
mov dl, enter_pas[bx]
sub dl, 60h
int 21h
inc bx
cmp bx, len_enter
jb pr_ent
push cx
mov cx, len_pas ;Ввести пароль
lea di, buff
rd_pass:
mov al, 7
mov ah, 0Ch
int 21h
stosb
loop rd_pass
pop cx
mov bx, 0
cmp_p:
mov al, password[bx] ;Сравнить пароль с
введенным
sub al, 60h
cmp al, buff[bx]
jne repeat
inc bx
cmp bx, len_pas
jb cmp_p
equal:
pop ds ;Пароль верный
pop es ;Перейти к основной
db 0CBh ;программе
repeat:
loop pr_1
dos:
jmp cs_1
ms_1 db '*', 10, 13, '$'
cs_1:
mov ah, 9 ;Пароль не верный
lea dx, ms_1
int 21h ;Вывести сообщение
mov ah, 4Ch
int 21h ;Выйти в DOS
copyright db 'Copyright(C) Юзефович Артем ( МГВРК,'
db ' Минск ), 1996'
db 0Dh, 0Ah, 'Запрос'
db ' пароля.', 0Dh, 0Ah
db 0Dh, 0Ah, 0Dh, 0Ah, '$'
code ends
end start
{**************************************************************************
**}
{**************************************************************************
**}
{**
**}
{** КП "ЗАЩИТА ДАННЫХ ОТ НСД"
**}
{** Выполнил учащийся гр.46491 ЮЗЕФОВИЧ АРТЕМ
**}
{** 1996
**}
{**
**}
{** Ключевая дискета
**}
{**************************************************************************
**}
{**************************************************************************
**}
code segment
assume cs: code, ds:code, es: code, ss: code
org 100h ;Счетчик команд-100h
start: jmp print
recsize equ 512 ;Размер сектора
buffer db recsize dup(?) ;Буферы ввода-вывода
bufrez db recsize dup(?)
buffer1 db recsize dup(?)
protect label byte
db 'T'+60h,'h'+60h,'i'+60h,'s'+60h
db 80h, 80h
db 'i'+60h,'s'+60h
db 80h, 80h
db 'k'+60h,'e'+60h,'y'+60h
db 80h, 80h
db 'd'+60h,'i'+60h,'s'+60h,'k'+60h
len_enter2 equ $-protect ;Длина сообщения
dsk_key label byte
db 'Э'+10h,'т'+10h,'о'+10h
db 30h, 30h
db 'н'+10h,'е'+10h
db 30h, 30h
db 'к'+10h,'л'+10h,'ю'+10h,'ч'+10h
db 'е'+10h,'в'+10h,'а'+10h,'я'+10h
db 30h, 30h
db 'д'+10h,'и'+10h,'с'+10h,'к'+10h
db 'е'+10h,'т'+10h,'а'+10h
db 6Ah-50h, 6Dh-50h
len_enter1 equ $-dsk_key ;Длина сообщения
enter_pas label byte
db 'В'+10h, 30h,'с'+10h, 30h,'т'+10h, 30h,'а'+10h, 30h
db 'в'+10h, 30h, 'ь'+10h, 30h, 'т'+10h, 30h, 'е'+10h, 30h
db 30h, 30h, 30h
db 'к'+10h, 30h,'л'+10h, 30h,'ю'+10h, 30h,'ч'+10h, 30h
db 'е'+10h, 30h,'в'+10h, 30h,'у'+10h, 30h,'ю'+10h, 30h
db 30h, 30h, 30h
db 'д'+10h, 30h,'и'+10h, 30h,'с'+10h, 30h,'к'+10h, 30h
db 'е'+10h, 30h,'т'+10h, 30h,'у'+10h, 30h
db 30h, 30h, 30h
db 'и'+10h
db 30h, 30h, 30h
db 'н'+10h, 30h,'а'+10h, 30h,'ж'+10h, 30h,'м'+10h, 30h
db 'и'+10h, 30h,'т'+10h, 30h,'е'+10h, 30h
db 30h, 30h
db 'В'+10h, 'В'+10h, 'О'+10h, 'Д'+10h
db 6Ah-50h, 6Dh-50h
len_enter equ $-enter_pas ;Длина сообщения
print:
push es ;Сохранение регистров
push ds
push cs
push cs
pop ds ;cs=>ds
pop es ;cs=>es
mov ah, 2
mov bx, 0
pr_ent:
mov dl, enter_pas[bx] ;Вывод сообщения
sub dl, 10h
int 21h
inc bx
cmp bx, len_enter
jb pr_ent
mov ah, 08h ;Ожидание нажатия Ввода
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
|
|