Скачайте в формате документа WORD

Система защиты от несанкционированного копирования

Факультет ИУ

Кафедра ИУ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