
- •6.170103 «Управління інформаційною безпекою»
- •1. Основні положення та теоретичні відомості
- •1.1. Методи побудови ключових ознак на дисках.
- •1.2. Захист програм від дизасемблерів та налагоджувачів
- •1.2.1. Захист програм від статичних методів дослідження.
- •1.2.2. Захист програм від динамічних методів дослідження.
- •2. Вихідні дані та варіанти завдань.
- •3. Приклади виконання курсової роботи та фрагменти програм що демонструють окремі методи захисту.
- •4. Тематика курсової роботи
- •5. Приклади варіантів виконання курсової роботи
- •6. Список рекомендованої літератури
2. Вихідні дані та варіанти завдань.
Варіанти завдань вибираються з таблиці 1, де В і А, відповідно, номери останньої та передостанньої цифр залікової книжки.
Таблиця 1
А |
Метод захисту програм від копіювання |
В |
Метод захисту програми від динамічних та статичних методів дослідження |
0 |
Неформатовані доріжки і сектори |
0 |
Перевірка вільної пам’яті та її доступних областей |
1 |
Зміна кількості доріжок і секторів |
1 |
Дозвіл та заборона переривань |
2 |
Зміна нумерації доріжок і секторів |
2 |
Контроль програми в пам'яті |
3 |
Неформатовані доріжки і зміна кількості секторів |
3
|
Контроль часу виконання
|
4 |
Неформатовані доріжки і зміна нумерації секторів |
4 |
Перевизначення та відновлення векторів переривань |
5 |
Неформатовані сектори і зміна кількості доріжок |
5 |
Блокування консолі |
6 |
Неформатовані сектори і зміна нумерації доріжок |
6 |
Неявний перехід |
7 |
Зміна кількості доріжок і зміна нумерації секторів |
7 |
Динамічний перехід |
8 |
Зміна кількості сектори і зміна нумерації доріжок |
8 |
Перевизначення кодів через стек |
9 |
Зміна розміру секторів |
9 |
Самогенерація виконуючих кодів |
3. Приклади виконання курсової роботи та фрагменти програм що демонструють окремі методи захисту.
В прикладі 1 подається програма що перешкоджає визначенню дизасемблером команди, на яку здійснюється перехід. У даному випадку застосовуються стекові операції і шифрування з допомогою логічної операції XOR для приховання переходу до команди за певною адресою. |
Приклад 1
code segment
assume cs:code, ds:code |
|
|
|
|
org 100h |
|
|
begin: |
|
|
|
|
а=100h+len_b |
; |
Визначаємо адреси команди |
|
а=а xor 5427h |
; |
Виконуємо логічну операцію "XOR" |
|
mov ax, а |
; |
Заносимо в регістр ах значення а |
|
xor ax, 5427h |
; |
Виконуємо логічну операцію "XOR" |
|
push ax |
; |
Заносимо значення регістра ах в стек |
|
ret |
; |
Переходимо на певну команду |
|
db 09ah |
; |
Відволікаючий код |
len_b equ $-begin _1: |
|
|
|
|
mov ah, 4ch |
; |
Завершення програми |
|
int 21h |
|
|
code ends end begin |
|
|
Після дизасемблювання за допомогою пакету Sourcer v6.09 бінарного модуля попередньої програми, отримуємо наступне значення коду.
88DC:0100 B8 552E |
mov |
ax, offset loc_1 |
|
88DC:0100 B8 2E 55 |
db |
0B8h, 2Eh, 55h |
|
88DC:0103 35 5427 |
xor |
ax, 5427h |
|
88DC:0106 50 |
push |
ax |
|
88DC:0107 C3 |
retn |
|
|
88DC:0108 9A 21CD4CB4 |
call |
far ptr sub_1 |
|
88DC:0108 9A |
db |
9Ah |
|
88DC:0109 4CB4 21CD |
dw |
4CB4h, 21CDh |
|
|
end |
|
|
В прикладі 2 наведена програма, що перешкоджає дизасемблеру визначити команду, на яку здійснюється перехід. У прикладі застосовується динамічна зміна адреси команди безумовного переходу. |
Приклад 2
code segment assume cs:code, ds:code |
|
|
|
|
org 100h |
|
|
begin: |
|
|
|
|
mov ax, 3456h |
; |
Заносимо в регістр АХ будь-яке значення |
|
org $-2 |
; |
Зменшуємо значення адресного лічильника, перевизначивши таким чином адресу наступної команди безумовного переходу |
|
|
; |
|
|
|
; |
|
|
jmp _ |
; |
Переходимо на мітку "_2" |
|
jmp $-2 |
; ; |
Переходимо на 2 байти назад, тобто на команду "jmp _2" |
|
db 09Ah |
; |
Відволікаючий код |
_2: |
|
|
|
|
mov h, 4ch |
; |
Завершення програми |
|
int 21h |
|
|
code ends end begin |
|
|
Після дизасемблювання за допомогою пакету Sourcer v6.09 бінарного модуля попередньої програми, отримуємо наступне значення коду.
8DF2:0100 B8 03EB |
|
mov |
ax, 3EBh |
8DF2:0103 EB FC |
;* |
jmp |
short loc_1 |
8DF2:0103 EB FC |
|
db |
0EBh, 0FCh |
8DF2:0105 9A 21CD4CB4 |
;* |
call |
far ptr sub_1 |
8DF2:0105 9A |
|
db |
9Ah |
8DF2:0106 4CB4 21CD |
|
dw |
4CB4h, 21CDh |
У прикладі 3 наведена програма здійснює за допомогою стека і логічної операції XOR "розшифрування вперед", що перешкоджає дизасемблеру розпізнавати подальші команди. Вказаний спосіб може також використовуватися для захисту від трасування. |
Приклад 3
code segment assume cs:code, ds:code |
|
|
|
org 100h begin: |
|
|
|
|
cli |
; |
Забороняємо переривання |
|
mov sss, sp |
; |
Запам'ятовуємо значення регістра SP |
|
lea sp, sme |
; |
Заносимо нове значення |
|
pop ax |
; |
Заносимо в регістр АХ код, який розташований за адресою SS:SP |
|
|
; |
|
|
mov bh, 4 xor 67h |
; |
Розшифровуємо його |
|
xor bh, 67h |
|
|
|
sub ah, bh |
; |
Вміщуємо розшифрований код |
|
push ax |
; |
на місце, зашифрованого |
|
mov sp, sss |
; |
Відновлюємо попереднє |
|
|
; |
значення SP |
|
jmp $+3 |
; |
Обходимо відволікаючий код |
|
db 09ah |
; |
Відволікаючий код |
|
mov ah, 4ch xor 23h |
; |
"Прихована" функція DOS - 4Сh |
|
xor ah, 23h |
; |
|
sme label word |
|
|
|
|
int 25h |
; |
Зашифрована команда |
sss dw? code ends end begin |
|
|
Після дизасемблювання за допомогою пакету Sourcer v6.09 бінарного модуля попередньої програми, отримуємо наступне значення коду.
88DC:0100 FA |
cli |
|
88DC:0101 89 26 011F |
mov |
ds:data_1e, sp |
88DC:0105 BC 011D |
mov |
sp, 11Dh |
88DC:0108 58 |
pop |
ax |
88DC:0109 B7 63 |
mov |
bh, 63h |
88DC:010B 80 F7 67 |
xor |
bh, 67h |
88DC:010E 2A E7 |
sub |
ah, bh |
88DC:0110 50 |
push |
ax |
88DC:0111 8B 26 011F |
mov |
sp, ds:data_1e |
88DC:0115 EB 01 |
jmp |
short loc_1 |
88DC:0115 EB 01 |
db |
0EBh, 01h |
88DC:0117 9A F4806FB4 |
call |
far ptr sub_1 |
88DC:0117 9A |
db |
9Ah |
88DC:0118 6FB4 F480 |
dw |
6FB4h, 0F480h |
88DC:011C 23 CD |
and |
cx, bp |
88DC:011E 25 0000 |
and |
ax, 0 |
|
end |
|
У прикладі 4 демонструється ряд способів захисту програм від налагоджувачів. |
Приклад 4
code segment
assume cs:code, ds:code
|
org 100h |
|
|
|||
begin: |
|
|
||||
|
mov ax, 351ch |
; |
Перехоплюємо переривання 1Ch |
|||
|
int 21h push es bx |
|
|
|||
|
push cs pop es mov ax, 251ch lea dx, rez int 21h |
|
|
|||
|
mov cx, cs |
; |
Перевіряємо на наявність вільної |
|||
|
cmp cx, 1583h |
; |
пам'яті |
|||
|
jbe ok2 |
|
|
|||
ok1: |
|
|
||||
|
jmp short ok1 db 09ah |
|
|
|||
ok2: |
|
|
||||
|
mov byte ptr ds:prv, 1 |
; |
Відновлюємо переривання 1Ch |
|||
|
pop dx int 1ch pop ds int 1ch mov ax, 251ch mov byte ptr cs:prv, 2 int 1ch int 21h |
|
|
|||
rtt label byte |
|
|
||||
|
jmp short $+5+2bh-25h |
; |
Якщо програма виконується без |
|||
|
db 09ch |
; |
Налагоджувача, то на екран буде |
|||
|
push cs |
; |
виведено повідомлення "OK" |
|||
|
pop ds lea dx, ki1 mov ah, 9 int 21h mov ah, 4ch int 21h |
|
|
|||
rez: |
; |
Далі слідує обробник |
||||
|
pushf |
; |
переривання 1Ch. |
|||
|
push ax cx si |
; |
Здійснюємо підрахунок часу |
|||
|
xor ax, ax |
; |
виконання програми і |
|||
|
lea si, begin |
; ; ; |
контрольної суми для виключення модифікування і можливості роботи під налагоджувачем |
|||
cvb: |
|
|
||||
|
add al, cs:[si] |
|
. |
|||
|
inc si |
; |
На основі цієї інформації |
|||
|
cmp si, offset ok1 |
; ; |
за адресою "rtt" змінюється команда "jmp" |
|||
|
jne cvb |
|
|
|||
|
pop si cx |
|
|
|||
|
cmp byte ptr cs:prv, 1 |
|
|
|||
|
je rez2 cmp byte ptr cs:prv, 2 je rez4 |
|
|
|||
rez3: |
|
|
||||
|
pop ax popf iret |
|
|
|||
rez2: |
|
|
||||
|
inc cs:[sum] jmp short rez3 |
|
|
|||
rez4: |
|
|
||||
|
push bx mov bl, cs:sum add bl, al sub bl, 025h sub byte ptr cs:[rtt+1], bl pop bx jmp short rez3 "ki1 db OK!$" prv db 0 sum db 0 code ends end begin |
|
|
|
У прикладі 5 демонструється комплексний захист від спільного використання статичних і динамічних методів дослідження.
Приклад 5
code segment
assume cs:code, ds:code
|
org 100h |
|
|
|
||||||||||||||
begin: |
|
|
|
|||||||||||||||
|
jmp begin2 |
|
|
|
||||||||||||||
|
db 09ah |
; |
Відволікаючий код |
|
||||||||||||||
;;; |
Далі до мітки "END_1" слідує фрагмент програми, що здійснює перетворення коду "вперед". Даний фрагмент містить алгоритми, перешкоджаючі його аналізу, і викликається за перериванням 1Ch. |
|
||||||||||||||||
|
rez: |
|
|
|||||||||||||||
|
|
pushf cli |
|
|
||||||||||||||
|
|
mov cs:_1,9090h xor 2376h |
|
|||||||||||||||
|
|
jmp $+4 |
; |
Обходимо відволікаючий код |
||||||||||||||
|
|
db 9ah |
; |
Відволікаючий код |
||||||||||||||
|
|
db 9ah xor cs:_1,2376h inc cs:prov mov cs:zax, ax mov cs:zds, ax xor ax, ax mov ds, ax |
|
|
||||||||||||||
|
|
jmp $+3 db 9ah |
; ; |
Обходимо відволікаючий код Відволікаючий код |
||||||||||||||
|
|
mov ax, cs:adr2 mov ds:[1ch*4], ax mov ax, cs:adr1 mov ds:[1ch*4+2], ax mov ax, cs:zax mov ds, cs:zds |
|
|
||||||||||||||
|
|
jmp $+4 db 9ah |
; ; |
Обходимо відволікаючий код Відволікаючий код |
||||||||||||||
|
|
db 9ah popf db 0eah |
; |
|
||||||||||||||
|
adr2 dw 0 adr1 dw 0 |
|
|
|||||||||||||||
|
|
db 9ah |
; |
Відволікаючий код |
||||||||||||||
; |
END_1 |
|
||||||||||||||||
;;; |
Нижче приведено фрагмент програми, що вимагає перетворення "вперед". Він містить алгоритми, перешкоджаючий його аналізу і установку переривання 1Ch на програму перетворення. |
|
||||||||||||||||
|
begin2: |
|
|
|
||||||||||||||
|
|
xor p1,7896h |
|
|
|
|||||||||||||
|
p1 label word |
|
|
|
||||||||||||||
|
|
mov ax, 351ch xor 4376h |
|
|
|
|||||||||||||
|
|
xor ax, 4376h |
|
|
|
|||||||||||||
|
|
jmp $+3 |
; |
Обходимо відволікаючий код |
|
|||||||||||||
|
|
db 9ah |
; |
Відволікаючий код |
|
|||||||||||||
|
|
int 21h |
|
|
|
|||||||||||||
|
|
jmp $+4 |
; |
Обходимо відволікаючий код |
|
|||||||||||||
|
|
db 9ah |
; |
Відволікаючий код |
|
|||||||||||||
|
|
db 9ah |
|
|
|
|||||||||||||
|
|
mov adr1, es |
|
|
|
|||||||||||||
|
|
mov adr2, bx mov ax, 251ch xor 4524h xor ax, 4524h |
|
|
|
|||||||||||||
|
|
jmp $+3 |
; |
Обходимо відволікаючий код |
|
|||||||||||||
|
|
db 9ah |
; |
Відволікаючий код |
|
|||||||||||||
|
|
lea dx, rez int 21h |
|
|
|
|||||||||||||
|
povt: |
|
|
|
||||||||||||||
|
|
cmp prov, 1 |
|
|
|
|||||||||||||
|
|
je rav jmp povt |
|
|
|
|||||||||||||
|
|
db 9ah |
; |
Відволікаючий код |
|
|||||||||||||
|
rav: |
|
|
|
||||||||||||||
|
|
mov ah, 40h xor 34h |
|
|
|
|||||||||||||
|
|
xor ah, 34h |
|
|
|
|||||||||||||
|
_1 label word |
|
|
|
||||||||||||||
|
|
jmp _2 |
|
|
|
|||||||||||||
|
|
mov ah, 4ch shl 1 shr ah, 1 jmp _2 |
|
|
|
|||||||||||||
|
|
db 9ah |
; |
Відволікаючий код |
|
|||||||||||||
|
_2: |
|
|
|
||||||||||||||
|
|
int 21h |
|
|
|
|||||||||||||
|
prov db 0 zax dw? zds dw? code ends end begin. |
|
|
|
Після дизасемблювання за допомогою пакету Sourcer v6.09 бінарного модуля попередньої програми, отримуємо наступне значення коду.
= 0070 |
data_1e |
equ |
70h |
|
= 0072 |
data_2e |
equ |
72h |
|
= 481E |
data_3e |
equ |
481Eh |
|
= 6038 |
data_4e |
equ |
6038h |
|
= 923E |
data_5e |
equ |
923Eh |
|
= 0193 |
data_8e |
equ |
193h |
|
= 0195 |
data_9e |
equ |
195h |
|
88DC:0100 EB 4B |
jmp |
short real_start |
||
88DC:0100 EB 4B |
db |
0EBh, 4Bh |
||
88DC:0102 9A C72EFA9C |
call |
far ptr sub_7 |
||
88DC:0102 9A |
db |
9Ah |
||
88DC:0103 FA9C C72E |
dw |
0FA9Ch, 0C72Eh |
||
88DC:0107 06 |
push |
es |
||
88DC:0108 87 01 |
xchg |
[bx+di], ax |
||
88DC:010A E6 B3 |
out |
0B3h, al |
||
88DC:010C EB 02 |
jmp |
short loc_1 |
||
88DC:010C EB 02 |
db |
0EBh, 02h |
||
88DC:010E 9A 36812E9A |
call |
far ptr sub_5 |
||
88DC:010E 9A |
db |
9Ah |
||
88DC:010F 2E9A 3681 |
dw |
2E9Ah, 3681h |
||
88DC:0113 87 01 |
xchg |
[bx+di], ax |
||
88DC:0115 76 23 |
jbe |
short loc_3 |
||
88DC:0115 76 23 |
db |
76h, 23h |
||
88DC:0117 2E: FE 06 0192 |
inc |
byte ptr cs:[192h] |
||
88DC:011C 2E: A3 0193 |
mov |
cs:data_8e, ax |
||
88DC:0120 2E: A3 0195 |
mov |
cs:data_9e, ax |
||
88DC:0124 33 C0 |
xor |
ax, ax |
||
88DC:0126 8E D8 |
mov |
ds, ax |
||
88DC:0128 EB 01 |
jmp |
short loc_2 |
||
88DC:0128 EB 01 |
db |
0EBh, 01h |
||
88DC:012A 9A 0148A12E |
call |
far ptr sub_3 |
||
88DC:012A 9A |
db |
9Ah |
||
88DC:012B A12E 0148 |
dw |
0A12Eh, 148h |
||
88DC:012F A3 0070 |
mov |
ds:data_1e, ax |
||
88DC:0132 2E: A1 014A |
mov |
ax, word ptr cs:[14] |
||
88DC:0136 A3 0072 |
mov |
ds:data_2e, ax |
||
88DC:0139 2E: A1 0193 |
mov |
ax, cs:data_8e |
||
88DC:013D 2E: 8E 1E 0195 |
mov |
ds, cs:data_9e |
||
88DC:0142 EB 02 |
jmp |
short loc_4 |
||
88DC:0142 EB 02 |
db |
0EBh, 02h |
||
88DC:0144 9A 00EA9D9A |
call |
far ptr sub_2 |
||
88DC:0144 9A |
db |
9Ah |
||
88DC:0145 9D9A 00EA |
dw |
9D9Ah, 0EAh |
||
88DC:0149 00 00 |
add |
[bx+si], al |
||
88DC:014B 00 9A 3681 |
add |
[bp+si+3681h], bl |
||
88DC:014F 53 |
push |
bx |
||
88DC:0150 01 96 B878 |
add |
[bp-4788h], dx |
||
88DC:0154 6A 76 |
push |
76h |
||
88DC:0156 35 4376 |
xor |
ax, 4376h |
||
88DC:0159 EB 01 |
jmp |
short loc_5 |
||
88DC:0159 EB 01 |
db |
0EBh, 01h |
||
88DC:015B 9A 02EB21CD |
call |
far ptr sub_4 |
||
88DC:015B 9A |
db |
9Ah |
||
88DC:015C 21CD 02EB |
dw |
21CDh, 2EBh |
||
88DC:0160 9A 4A068C9A |
call |
far ptr sub_6 |
||
88DC:0160 9A |
db |
9Ah |
||
88DC:0161 8C9A 4A06 |
dw |
8C9Ah, 4A06h |
||
88DC:0165 01 89 481E |
add |
ds:data_3e[bx+di], |
||
88DC:0169 01 B8 6038 |
add |
ds:data_4e[bx+si], |
||
88DC:016D 35 4524 |
xor |
ax, 4524h |
||
88DC:0170 EB 01 |
jmp |
short loc_6 |
||
88DC:0170 EB 01 |
db |
0EBh, 01h |
||
88DC:0172 9A CD0103BA |
call |
far ptr sub_8 |
||
88DC:0172 9A |
db |
9Ah |
||
88DC:0173 03BA CD01 |
dw |
3BAh, 0CD01h |
||
88DC:0177 21 80 923E |
and |
ds:data_5e[bx+si], |
||
88DC:017B 01 01 |
add |
[bx+di], ax |
||
88DC:017D 74 03 |
jz |
short loc_8 |
||
88DC:017D 74 03 |
db |
74h, 03h |
||
88DC:017F EB F7 |
jmp |
short loc_7 |
||
88DC:017F EB F7 |
db |
0EBh, 0F7h |
||
88DC:0181 9A F48074B4 |
call |
far ptr sub_9 |
||
88DC:0181 9A |
db |
9Ah |
||
88DC:0182 74B4 F480 |
dw |
74B4h, 0F480h |
||
88DC:0186 34 EB |
xor |
al, 0EBh |
||
88DC:0188 07 |
pop |
es |
||
88DC:0189 B4 98 |
mov |
ah, 98h |
||
88DC:018B D0 EC |
shr |
ah, 1 |
||
88DC:018D EB 01 |
jmp |
short loc_9 |
||
88DC:018D EB 01 |
db |
0EBh, 01h |
||
88DC: 018F 9A 000021CD |
call |
far ptr sub_1 |
||
88DC:018F 9A |
db |
9Ah |
||
88DC:0190 21CD 0000 |
dw |
21CDh, 0 |
||
|
end |
. |