Системы защиты от копирования. Принципы построения, требования и элементы систем. Средства защиты носителей информации. Средства защиты от применения программ-отладчиков и дизассемблирования. Конвейер команд. Прерывания. Регистр флагов. Преобразования и замена команд
Система защиты от копирования или система защиты авторских прав — комплекс программных или программно-аппаратных средств, обеспечивающих затруднение или запрещение нелегального распространения, использования и/или изменения программных продуктов.
Требования:
1) некопируемость дискет автоматическими копировщиками,
2) невозможность применения стандартных отладочных средств при изучении ими логики работы защищенных программ без дополнительных манипуляций с кодом программы или без платы аппаратного отладчика,
3) некорректное дисассемблирование защищенной программы или ее существенно важных фрагментов при применении стандартных пакетов.
4) невозможность трассировки по существенно важным прерываниям при помощи стандартных средств. При атом будет скрыт обмен программы с «внешним миром» — диском, DOS и т. д.
5) затрудненность изучения структуры распознавания индивидуальных параметров ПЭВМ или технологического анализа применяемых аппаратных средств защиты.
Принципы построения:
1) Модуль проверки недублируемой или оригинальной информации — проверяет наличие некопируемых признаков на дискете или оригинальную для данной ПЭВМ информацию.
1.1) системы с «навесным» проверочным модулем, созданным по технологии файлового;
1.2) системы с внешним проверочным модулем, вынесенным в отдельную программу;
1.3) системы с внутренними функциями проверки.
2) Модуль защиты от просмотра и анализа логики системы.
3) Модуль согласования с защищенными структурами — обеспечивает правильную работу защищенных программ и адекватное восприятие защищенных данных в случае легальных копий.
Программы, защищенные только от дисассемблирования, могут легко трассироваться, и наоборот — программы, защищенные только от трассировки, могут быть дисассемблированы. В следствие этого для противодействия изучению алгоритмов систем защиты необходимо иметь средства, препятствующие как дисассемблированию, так и трассировке. Базисом для построения любого отладчика служат методы покомандного выполнения (флаг TF=1) программы и контрольной точки (INT 3). Для защиты дизассемблирования используется совмещение стекового и кодового сегментов, замена одной последовательности команд на эквивалентную. Для I80386 конвейер команд составляет 16 байт. После очистки (командами JMP, INT, CALL, RET, IRET) конвейер заполняется следующими командами, которые выполняются уже с нового адреса. Но при работе отладчика в режиме трассировки конвейер очищается после каждой команды.
test proc
mov bx,offset xxx ; ds=cs
jmp short clr ;очищаем конвейер
clr: mov byte ptr [bx],0c3h ; код команды ret
xxx:mov ah,9
mov dx,offset msg
int 21h
ret
msg db 'Отладочные средства не используются$'
test endp
Для противодействия отладчикам использующим прерывания 1(вызывает очистку очереди команд конвейера, загружает очередную команду и выполняет её) и 3 (останавливает работу программы в заданной точке) можно изменить вектора этих прерываний на свою подпрограмму. Т.к. отладчик берёт на себя прерывания 8 (таймер) и 9 (клавиатура), то программа защиты перехватив эти прерывания, может в своём обработчике проверять состояние флага IF(флаг прерывания). Если IF=1, то можно производить действия по предотвращению отладки. Аналогично с флагом TF.
Команда
Эквивалентная
Команда
Эквивалентная
Команда
Эквивалентная
mov op1,op2
push op2
pop op1
xchg op1,op2
push op1
push op2
pop op1
pop op2
inc op
add op,1
lds r,dword ptr op
mov r,word ptr op
mov ds,word ptr op+2
add op1,op2
xchg op2,ax
add op1,ax
xchg op2,ax
dec op
sub op,1
les r,dword ptr op
mov r,word ptr op
mov es,word ptr op+2
and,or,xor, adc,sub,sbb и др.
аналогично add
not op
xor op,0ff(ff)h
jmp dword ptr addr
push addr+2
push addr
retf
call addr
push m
jmp addr
m: ...
lodsb
mov al,[si]
inc si
loop loc
dec cx
jne loc
jmp addr
push addr
ret
stosb
mov es:[di],al
inc di
rep movsb
push ax
m: mov al,[si]
mov es:[di],al
inc si
inc di
loop m
pop ax
repe(repne) cmpsb
push ax
m: mov al,[si]
cmp al, es:[di]
jne(je) m1
inc si
inc di
loop m
m1: pop ax