
- •Захист виконуванихфайлів від дослідження програмного коду
- •1 Теоретические сведения
- •1.1 Средства исследования программного кода
- •1.2 Защитные трюки
- •1.3 «Изощренное» программирование
- •2 Задание к выполнению работы
- •3 Содержание отчета
- •4 Контрольные вопросы
- •Рекомендованная литература
- •Приложение а
2 Задание к выполнению работы
2.1 Применить вышеуказанные способы защиты на программе, предложенной в Приложении А.
2.2 Найти еще как минимум один трюк защиты программы от отладки или предложить свой. Применить его на программе, предложенной в Приложении А.
3 Содержание отчета
3.1 Цель работы
3.2 Примененные методы защиты
3.3 Текст программы
3.4 Результаты работы, вывод
4 Контрольные вопросы
4.1 Инструментарий исследования программ.
4.2 Основные недостатки отладчиков, как инструментов взлома.
4.3 На чем основываются примененные вами защитные трюки?
4.4 С какой целью производится защита от отладки или дизассемблирования?
Рекомендованная литература
Румянцев П.В. Исследование программ Win32: до дизассемблера и отладчика. – М.: Горячая линия – Телеком, 2004. – 367 с.
Абашев А.А., Жуков И.Ю., Иванов М.А., Метлицкий Ю.В., Тетерин И.И. Ассемблер в задачах защиты информации. – М.: КУДИЦ-ОБРАЗ, 2004. – 544 с.
Крис Касперски, Ева Рокко Искусство дизассемблирования [Текст] / Крис Касперски, Ева Рокко. − СПб.: ВHV, 2008. − 896 с.
Александр Фролов, Григорий Фролов Операционная система MS-DOS Том 1, книга 3, [Текст] / Александр Фролов, Григорий Фролов - М.: Диалог-МИФИ, 1992
Приложение а
Листинг А.1 – Программа шифрования/расшифрования текстовых сообщений с помощью алгоритма ГОСТ 28147-89
.386
Sseg segment use16 para stack 'stack'
db 256 dup(?)
Sseg ends
Dseg segment para public 'data'
strng db 'Rocking just to make ya move!$'
key dd 0F3FA012Bh, 023FE412Ah, 013F5062Bh, 0D9FA0C9Bh
dd 033AA1120h, 0B7FA0182h, 0A3FA0D25h, 083F7035Bh
endWithZero dq 0 ;64 нуля
mode db 0 ;флаг режима: зашифровка = 0, расшифровка = 1 (или любое другое число)
last db 0 ;флаг последнего блока
substitute db 4, 1, 3, 11, 0, 10, 5, 2, 7, 12, 6, 14, 8, 9, 15, 13
sblocks db 8 dup(0)
cb dw 0 ;count blocks, номер, по которому ;будет записываться образованный блок в строку
dcb dw 0 ;для decrypt
cryptedstring db 256 dup(0)
decryptedstring db 256 dup(0)
endstr db 13d, 10d, '$' ;символ конца строки
;для ввода строки
Dseg ends
Cseg segment use16 para public 'code'
assume cs:Cseg, ds:Dseg, ss:Sseg
start proc far
;
push ds
sub ax, ax
push ax
;
mov bx, Dseg
mov ds, bx
;
call main
ret
start endp
main proc near
lea dx, ds:[strng] ;вывод строки, ;функция 9 прерывания ДОС 21
mov ah, 09h
int 21h
lea dx, ds:[endstr] ;вывод строки, ;функция 9 прерывания ДОС 21
mov ah, 09h
int 21h
; ret
lea bx, ds:[strng] ;получить адрес ;нашей строки
jmp process
for_decryption:
mov al, 1
mov mode, al ;устанавливаем флаг ;режима расшифровки
lea bx, ds:[cryptedstring]
process:
xor esi, esi ;обнуляем указатель на ;строку
xor edi, edi ;указатель ключа
;
maincycle:
xor cx, cx
lea ax, ds:[key] ;берем адрес следующей, за строкой, переменной
sub ax, bx
cmp ax, 8 ;если на итерации не будет 64 бит, то идем на ветку
;кода, где недостающие биты будут нулями
jl less64
jg next_step
next_step:
mov eax, dword ptr [bx+si] ;занесли ;левую часть
add si, 4 ;следующие 4 байта (32 бита)
mov edx, dword ptr [bx+si] ;занесли ;правую часть
add si, 4 ;смещение для следующего цикла
add bx, 8 ;смещение для следующего цикла
push ax ;сохраняем левую часть в ;стек, чтобы освободить регистр для работы
ror eax, 16
push ax
jmp func
;
less64:
mov al, 1
mov last, al ;флаг, что заменяется ;последний блок
; add bx, si
xor si, si
lea cx, ds:[key]
lesstrace:
mov al, byte ptr [bx]
mov byte ptr endWithZero[si], al
inc si
inc bx
cmp bx, cx
jne lesstrace
xor cx, cx
;функция
func:
rol edi, 2
add edx, key[edi]
ror edi, 2
;подстановка
;извлечение
push di
push bx
lea bx, substitute
mov eax, edx
and dl, 00001111b
mov di, dx
and di, 00FFh
mov dl, substitute[di]
mov sblocks[0], dl
mov dx, ax
shr dl, 4
mov di, dx
and di, 00FFh
mov dl, substitute[di]
mov sblocks[1], dl
mov dx, ax
and dh, 00001111b
xor dl, dl
xchg dl, dh
mov di, dx
mov dh, substitute[di]
mov sblocks[2], dh
mov dx, ax
shr dh, 4
xor dl, dl
xchg dl, dh
mov di, dx
mov dh, substitute[di]
mov sblocks[3], dh
mov edx, eax
shr edx, 16
mov ax, dx
and dl, 00001111b
mov di, dx
and di, 00FFh
mov dl, substitute[di]
mov sblocks[4], dl
mov dx, ax
shr dl, 4
mov di, dx
and di, 00FFh
mov dl, substitute[di]
mov sblocks[5], dl
mov dx, ax
and dh, 00001111b
xor dl, dl
xchg dl, dh
mov di, dx
mov dh, substitute[di]
mov sblocks[6], dh
mov dx, ax
shr dh, 4
xor dl, dl
xchg dl, dh
mov di, dx
mov dh, substitute[di]
mov sblocks[7], dh
pop bx
pop di
;замена, склеивание S-блоков
mov dl, sblocks[1]
rol dl, 4
or dl, sblocks[0]
mov dh, sblocks[3]
rol dh, 4
or dh, sblocks[2]
mov ax, dx
mov dl, sblocks[5]
rol dl, 4
or dl, sblocks[4]
mov dh, sblocks[7]
rol dh, 4
or dh, sblocks[6]
rol edx, 16
mov dx, ax
;rol edx, 16
rol edx, 11
inc cl
mov al, mode ;вспоминаем флаг ;режима
cmp al, 0 ;
jz cryptmode
jmp decryptmode
cryptmode:
cmp ch, 3 ;если идет [0..3] ;последний цикл применения ключа, идти по подключам в обратном ;порядке
je creverse_di
cmp di, 7 ;если дошли до ;последнего подключа, переходим к первому
je creset_di
inc di
;inc ch
jmp func
creset_di:
inc ch
cmp ch, 3
je func
xor di, di
jmp func
creverse_di:
cmp cl, 23
je func
dec di
cmp cl, 32
je out_cycle
jmp func
decryptmode:
cmp ch, 0 ;если первый проход по ;ключу, идем прямо
je ddirect_di
cmp di, 0
je dset_di
dec di
cmp cl, 32 ;завершение 32-х циклов ;преобразования
jnb out_cycle
jmp func
dset_di:
mov di, 7
inc ch
jmp func
ddirect_di:
inc di
cmp di, 7
ja dset_di
cmp cl, 32 ;завершение 32-х циклов ;преобразования
jb func
out_cycle:
pop ax ;восстанавливаем левую ;часть из стека
rol eax, 16
pop ax
xor eax, edx
xchg eax, edx
;сохранение блоков в новой строке
mov cl, mode
cmp cl, 0
jne save_decrypt
push si
mov si, cb
mov dword ptr cryptedstring[si], eax
add si, 4
mov dword ptr cryptedstring[si], edx
add si, 4
mov cb, si
pop si
save_decrypt:
push si
mov si, dcb
mov dword ptr decryptedstring[si], eax
add si, 4
mov dword ptr decryptedstring[si], edx
add si, 4
mov dcb, si
pop si
mov cl, last
cmp cl, 0
je maincycle ;конец шифровки
mov cl, mode ;смена режима после ;шифровки
cmp cl, 0
je for_decryption
mov si, cb
mov byte ptr cryptedstring[si], '$'
mov si, dcb
mov byte ptr decryptedstring[si], '$'
lea dx, ds:[strng] ;вывод строки, ;функция 9 прерывания ДОС 21
mov ah, 09h
int 21h
lea dx, ds:[endstr] ;вывод строки, ;функция 9 прерывания ДОС 21
mov ah, 09h
int 21h
lea dx, ds:[cryptedstring] ;вывод ;строки, функция 9 прерывания ДОС 21
mov ah, 09h
int 21h
lea dx, ds:[endstr] ;вывод строки, ;функция 9 прерывания ДОС 21
mov ah, 09h
int 21h
lea dx, ds:[decryptedstring] ;вывод ;строки, функция 9 прерывания ДОС 21
mov ah, 09h
int 21h
ret
main endp
Cseg ends
end start
Примечание: для сборки программы нужно ввести в командной строке следующее:
tasm <имя_файла>
tlink <имя_файла> /3