Система защиты от несанкционированного копирования
Факультет ИУ
Кафедра ИУ7
З А Д А Н И Е
на курсовой проект
По курсу Системное программирование
Студент Кожичкин Е.С. ИУ7-62
Руководитель Алексеев Ю.Е.
I. Система защиты от несанкционированного копирования
II. Провести анализ общей структуры систем защиты от несанкционированного копирования. Разработать систему защиты от копирования. Работ с ключевой дискетой с ограниченным числом инсталляций.
. 2 листов формата 21, расчётно-пояснительная записка на 40 листах формата II).
Дата выдачи л16 февраля 1998 г.
Дополнительные указания по проектированию
Запретить копирование инсталлированной программы с жёсткого диска на другие носители. Разрешить перемещение инсталлированной программы в пределах логического диска. Использовать программирование НГМД на физическом уровне. Реализация под DOS. Работ со стандартными дискетами 1.44 М.
СОДЕРЖАНИЕ
TOC o "1-3" 1. Введение.............................................................................................................. 4
2. Исследовательский раздел............................................................................... 8
2.1. Структура системы защиты от несанкционированного копирования. 8
2.2. Подсистема внедрения правляющих механизмов................................ 10
2.3. Блок установки характеристик среды..................................................... 12
2.4. Выбор структуры системы для реализации............................................ 14
3. Опытно-конструкторский раздел............................................................... 15
3.1. Выбор и обоснование языка программирования................................... 15
3.2. Структура программы................................................................................ 17
3.2.1. Модуль Frozen............................................................................................................................. 19
3.2.2. Модуль Install.............................................................................................................................. 20
3.2.3. Модуль Ind................................................................................................................................... 20
3.2.4. Запуск внешней программы.................................................................................................... 26
3.2.5. Работ с НГМД........................................................................................................................... 27
4. Выводы.............................................................................................................. 28
5. Литература..................................................................................................... 29
6. Приложение..................................................................................................... 31
6.1. Требования к аппаратуре.......................................................................... 31
6.2. Требования к программному обеспечению............................................. 31
6.3. Фрагменты программ................................................................................. 31
6.2.
1) DOS версии 6.22.
2)
6.3.
Фрагменты программ комплекса, реализующие работу с НГМД на физическом уровне.
1) ngmd.mac.)
;Передача байта в контроллер НГМД
out_ngmd MACRO byte
LOCAL @Ok
mov AH,byte
call OutFDC
jnc @Ok
FatalError
@Ok:
ENDM
; Приём байта из контроллера НГМД
in_ngmd MACRO Mem
LOCAL @Ok
push AX
call InFDC
jnc @Ok
jmp @ErrFatal
@Ok: IFNB <Mem>
mov Mem,AL
ENDIF
pop AX
ENDM
; Ожидание прерывания от контроллера НГМД
WaitInt MACRO
LOCAL @Ok
call _WaitInt
jnc @Ok
FatalError
@Ok:
ENDM
; Критическая ошибка
FatalError MACRO
jmp @ErrFatal
ENDM
; Позиционирование головки дисковода
; Вход:
; D Ц номер накопителя
; HDS Ц номер головки
; NCN Ц номер дорожки
ngmdSeek MACRO D,HDS,NCN
LOCAL @Ok
mov DL,D
mov DH,HDS
mov CH,NCN
shl DH,2
or DL,DH
call _ngmdSeek
jnc @Ok
FatalError
@Ok:
ENDM
; Чтение сектора
; D - номер дисковода
; HDS - номер головки (стороны)
; NCN - номер дорожки
; R - номер сектора
; Buf - буфер
ngmdRead MACRO D,HDS,NCN,R,Buf
mov DL,D
mov DH,HDS
mov CH,NCN
mov CL,R
mov AX,DS
mov ES,AX
lea DI,Buf
call _ngmdRead
ENDM
; Запись сектора
; D - номер дисковода
; HDS - номер головки (стороны)
; NCN - номер дорожки
; R - номер сектора
; Buf - буфер
ngmdWrite MACRO D,HDS,NCN,R,Buf
mov DL,D
mov DH,HDS
mov CH,NCN
mov CL,R
mov AX,DS
mov ES,AX
lea DI,Buf
call _ngmdWrite
ENDM
2) Frozen, демонстрирующий форматирование дорожки. (Файл frozen.asm.)
; Переменная для хранения старого вектора 8h
Old_8h dd 0
; Переменная для организации задержек
RtCounter dw 0
; Собственный обработчик прерывания 8h (Timer)
; для организации задержек
Int_8h PROC
push AX
cmp CS:RtCounter,0
je New08IRet
dec CS:RtCounter
New08IRet:
; Стандартные действия по корректировке времени
push DS
mov AX,40hа ;Настройка на область данных BIOS
mov DS,AX
add WORD PTR DS:[6Ch],1
adc WORD PTR DS:[6Eh],0
cmp WORD PTR DS:[6Eh],0018h
jne New08Time
cmp WORD PTR DS:[6Ch],00B0h
jne New08Time
mov BYTE PTR DS:[70h],1
mov WORD PTR DS:[6Ch],0
mov WORD PTR DS:[6Eh],0
New08Time: pop DS
mov AL,20h
out 20h, AL
jmp SHORT $+2
pop AX
iret
Int_8h ENDP
; Флаг для становки факта прихода прерывания
f_Int0Eh db 0
; Переменная для хранения старого вектора 0Eh
Old_0Eh dd 0
; Собственный обработчик прерывания 0Eh
; для определения факта прихода прерывания от НГМД
Int_0Eh PROC
push AX
mov CS:f_Int0Eh,1
mov AL,20h
out 20h, AL
jmp SHORT $+2
pop AX
iret
Int_0Eh ENDP
Main PROC
; Пропущено (skip)
; Настройка ES на таблицу векторов прерываний
xor AX,AX
mov ES,AX
; Сохранение вектора 8h (Timer)
GetIntVec 8h,CS:Old_8h
; становка своего обработчика прерывания 8h
SetIntVec 8h
; Сохранение вектора 0Eh (прерывание от НГМД)
GetIntVec 0Eh,CS:Old_0Eh
; становка своего обработчика прерывания 0Eh
SetIntVec 0Eh
; становка скорости передачи данных между контроллером и накопителем
xor AX,AX ;500 килобит/сек
mov DX,03F7h ;CCR
out DX,AL
jmp SHORT $+2
; Сброс контроллера НГМД
call _ngmdReset
; Подготовка таблицы формата
lea SI,FormatBuf
mov BYTE PTR DS:[SI],4Dh ;Код команды FORMAT
mov BYTE PTR DS:[SI+1],0 ;головка 0, накопитель A:
mov BYTE PTR DS:[SI+2],2 ;Размер сектора - 512 байт
mov BYTE PTR DS:[SI+3],18 ;Количество секторов
mov BYTE PTR DS:[SI+4],108 ;Размер GAP3
mov BYTE PTR DS:[SI+5],066h ;Символ-заполнитель
add SI,2
mov CX,18
xor AX,AX
PrepForFormat:
inc AL
add SI,4
mov BYTE PTR DS:[SI],80 ;Цилиндр
mov BYTE PTR DS:[SI+1],0 ;Поверхность
mov BYTE PTR DS:[SI+2], ALа ;Номер сектора
mov BYTE PTR DS:[SI+3],2 ;Код длины сектора
loop PrepForFormat
; Позиционирование головки дисковода A:
; головка - 0
; дорожка - 80
ngmdSeek 0,0,80
push DS
pop ES
mov AL,4Ah
mov CX,18*4
lea DI,FormatBuf
add DI,6
; Подготовка канала DMA для передачи данных в НГМД
call SetDMA
; Передача данных в НГМД - форматирование
mov CX,6
lea SI,FormatBuf
cld
FormatTableHeader:
lodsb
out_ngmd AL
loop FormatTableHeader
; Ожидание прерывания от НГМД
WaitInt
in_ngmd ST0
REPT 6
in_ngmd
ENDM
mov AH,ST0
and AH,11b
or AH,AH
jz @Ok1
@ErrFatal:
; Критическая ошибка
mov AH,9
lea DX,MesErrFatal
int 21h
jmp @MotorOff
@Ok1:
call _ngmdReset
ngmdWrite 0,0,80,1,Sector
@MotorOff:
; Сброс контроллера НГМД
call _ngmdReset
; Выключение электродвигателя НГМД
mov DX,3F2h
mov AL,0Ch
out DX, AL
mov AX,0
mov ES,AX
; Восстановление вектора 0Eh
RestoreIntVec 0Eh
; Восстановление вектора 8h
RestoreIntVec 8h
; Пропущено (skip)
Main ENDP
3) DMA. (Файлы frozen.asm и install.asm.)
; Передача данных в контроллер НГМД
;
; Вход:
; AH - байт для передачи
; Выход:
; CF = 1а -а Ошибка
; CF = 0а -а Байт передан
OutFDC PROC
push AX
push BX
push CX
push DX
mov DX,3F4h
mov BL,2
xor CX,CX
OutFDC1: in AL,DX
and AL,11b
cmp AL,1b
je OutFDC2
loop OutFDC1
dec BL
jnz OutFDC1
stc
jmp SHORT OutFDCRet
OutFDC2: inc DX
mov AL,AH
out DX,AL
jmp SHORT $+2
mov BX,29
call WaitTimer2
clc
OutFDCRet:
pop DX
pop CX
pop BX
pop AX
ret
OutFDC ENDP
; Приём байта из контроллера НГМД
;
; Выход:
; AL - принятый байт
; CF = 1а -а Ошибка
; CF = 0а -а Байт принят
InFDC PROC
push BX
push CX
push DX
mov DX,3F4h
InFDC0: mov BL,2
xor CX,CX
InFDC1: in AL,DX
and AL,11b
cmp AL,11b
je InFDC2
loop InFDC1
dec BL
jnz InFDC1
stc
jmp SHORT InFDCRet
InFDC2: inc DX
in AL,DX
mov BX,29
call WaitTimer2
clc
InFDCRet:
pop DX
pop CX
pop BX
ret
InFDC ENDP
; Инициализация DMA
;
; Вход:
; AL - код операции
; AL = 4Ah - передать в НГМД
; AL = 46h - передавать из НГМД
; ES:DI - адрес буфера
; CX - длина данных
SetDMA PROC
push AX
push CX
cli
push AX
mov AL,110b
out 0Ah,AL
jmp SHORT $+2
pop AX
out 0Ch,AL
jmp SHORT $+2
out 0Bh,AL
jmp SHORT $+2
push CX
mov AX,ES
mov CL,4
rol AX,CL
mov CH,AL
and AL,0F0h
add AX,DI
adc CH,0
out 4,AL
jmp SHORT $+2
mov AL,AH
out 4,AL
jmp SHORT $+2
mov AL,CH
and AL,0Fh
out 81h,AL
jmp SHORT $+2
pop AX
dec AX
out 5,AL
jmp SHORT $+2
mov AL,AH
out 5,AL
jmp SHORT $+2
mov AL,2
out 0Ah,AL
jmp SHORT $+2
sti
pop CX
pop AX
ret
SetDMA ENDP
; Ожидание прерывания от НГМД
_WaitInt PROC
mov CS:f_Int0Eh,0
mov CS:RtCounter,2/55 ;2 сек.
WaitIntLoop:
cmp CS:f_Int0Eh,0
jne WaitIntCF0
cmp CS:RtCounter,0
jne WaitIntLoop
stc
jmp SHORT WaitIntRet
WaitIntCF0: clc
WaitIntRet: ret
_WaitInt ENDP
; Выполнение команды НГМД Считать состояние прерывания
; (Sense Interrupt Status)
Sensl PROC
out_ngmd 1b
in_ngmd ST0
in_ngmd
ret
Sensl ENDP
; Seek
; DL - номер дисковода и номер головки
; CH - номер дорожки
_ngmdSeek PROC
push AX
out_ngmd 0Fh ; Код команды для поиска
out_ngmd DL ; Номер дисковода и номер головки
out_ngmd CH ; Номер дорожки
WaitInt
Delay 5 ; Время становки головки (225 ms)
call Sensl
mov AL,ST0
and AL,b
cmp AL,001b
je @SeekOk
stc
jmp SHORT @SeekRet
@SeekOk: clc
@SeekRet: pop AX
ret
_ngmdSeek ENDP
; Чтение сектора
;
; Вход:
; DL - номер дисковода
; DH - номер головки стороны
; CH - номер дорожки
; CL - номер сектора
; ES:DI - буфер
_ngmdRead PROC
push DX
; Позиционирование головки
and DL,11b
and DH,1b
shl DH,2
or DL,DH
shr DH,2
call _ngmdSeek
; Инициализация контроллера DMA
push CX
mov CX,512
mov AL,46h
call SetDMA
pop CX
out_ngmd 46h ; Код команды чтения
out_ngmd DL ; Номер головки и накопителя
out_ngmd CH ; Номер дорожки
out_ngmd DH ; Номер головки
out_ngmd CL ; Номер сектора
out_ngmd 2 ; Код длины сектора
out_ngmd 18 ; Количество секторов на дорожке
out_ngmd 108 ; Длина межсекторного промежутка
out_ngmd 0FFh ; Длина передаваемых данных
; Ожидание прерывания от НГМД
WaitInt
REPT 7
in_ngmd
ENDM
pop DX
ret
_ngmdRead ENDP
; Запись сектора
;
; Вход:
; DL - номер дисковода
; DH - номер головки (стороны)
; CH - номер дорожки
; CL - номер сектора
; ES:DI - буфер
_ngmdWrite PROC
push DX
; Позиционирование головки
and DL,11b
and DH,1b
shl DH,2
or DL,DH
shr DH,2
call _ngmdSeek
; Инициализация контроллера DMA
push CX
mov CX,512
mov AL,4Ah
call SetDMA
pop CX
out_ngmd 45h ; Код команды записи
out_ngmd DL ; Номер головки и накопителя
out_ngmd CH ; Номер дорожки
out_ngmd DH ; Номер головки
out_ngmd CL ; Номер сектора
out_ngmd 2 ; Код длины сектора
out_ngmd 18 ; Количество секторов на дорожке
out_ngmd 108 ; Длина межсекторного промежутка
out_ngmd 0FFh ; Длина передаваемых данных
; Ожидание прерывания от НГМД
WaitInt
REPT 7
in_ngmd
ENDM
pop DX
ret
_ngmdWrite ENDP
; Сброс контроллера НГМД
_ngmdReset PROC
; Начальный сброс
cli
mov AL,11b
mov DX,3F2h
out DX,AL
jmp SHORT $+2
mov BX,29
call WaitTimer2
mov AL,00b
out DX,AL
jmp SHORT $+2
sti
; Ожидание прерывания от НГМД
WaitInt
mov CX,4
mov DL,11b
ResetSens:
; Считать состояние прерывания
call Sensl
mov AH,ST0
cmp AH,DL
je @Ok3
FatalError
@Ok3: inc DL
loop ResetSens
; Задержка
Delay 1/55
out_ngmd 11b ;Код команды Specify
out_ngmd 0AFh ;Параметры SRT|HUT
out_ngmd 2h ;Параметры HLT|ND
mov CX,2
RecalRestart:
cli
out_ngmd b ;Код команды Recalibrate
out_ngmd 0 ;Накопитель - A:
sti
; Ожидание прерывания от НГМД
WaitInt
; Считать состояние прерывания
call Sensl
mov AH,ST0
test AH,001b
jz RecalTry
and AH,11b
test AH,11b
jz RecalCompl
RecalTry:
loop RecalRestart
jmp @ErrFatal
RecalCompl:
; Задержка
mov BX,18750
call WaitTimer2
ret
_ngmdResetа ENDP