Декодер вектора трассировки
Декодер вектора трассировки ( TVD ) — это компьютерное программное обеспечение , которое использует возможности трассировки своего базового микропроцессора инструкций для декодирования зашифрованных опкодов непосредственно перед выполнением и, возможно, их последующего повторного кодирования. Его можно использовать для предотвращения обратного проектирования при попытке предотвратить взлом программного обеспечения в рамках общей стратегии защиты от копирования .
Трассировка микропроцессора
[ редактировать ]Некоторые семейства микропроцессоров (например, 680x0, x86) обеспечивают возможность отслеживания инструкций, что помогает в разработке программ. Отладчик . может использовать эту возможность для пошагового выполнения программы, предоставляя программисту возможность контролировать выполнение тестируемой программы
Установив собственный обработчик трассировки исключения , можно получить контроль над микропроцессором между выполнением обычных инструкций потока программы. Типичный обработчик исключений декодера вектора трассировки декодирует предстоящую команду, расположенную за пределами исключения, а также перекодирует ранее декодированную инструкцию.
Реализации
[ редактировать ]Моторола 680x0
[ редактировать ]Motorola 68000 имеет функцию отслеживания инструкций. [ 1 ] Когда его состояние трассировки включено, процессор автоматически вызывает исключение трассировки после выполнения каждой инструкции (не-исключения). Следующий фрагмент ассемблерного кода представляет собой пример программы, инициализирующей обработчик исключений трассировки в системе 68000.
InstallHandler: MOVE.L #$4E730000,-(SP) ; Push trace exception handler on to stack
MOVE.L #$00000010,-(SP)
MOVE.L #$0004DDB9,-(SP)
MOVE.L #$BD96BDAE,-(SP)
MOVE.L #$B386B586,-(SP)
MOVE.L #$D046D246,-(SP)
MOVE.L #$0246A71F,-(SP)
MOVE.L #$00023C17,-(SP)
MOVE.W #$2C6F,-(SP)
MOVE.L SP,($24).W ; Set trace exception handler vector
ORI.W #$A71F,SR ; Enable trace state
NOP ; CPU generates a trace exception after executing this NOP
;------------------------
... ; Code from this line would be encrypted
Ниже приведена дизассемблирование вышеуказанного обработчика исключений трассировки, загруженного в стек. Целью этого обработчика является запутывание любого отслеживаемого зашифрованного кода. На процесс его расшифровки влияет содержимое регистра кода состояния (CCR). Например, арифметическая операция в основной программе, имеющая в результате число 0 , приведет к установке нулевого бита флага в CCR. Это приведет к изменению значения в (SP) в обработчике исключений трассировки.
TraceHandler: MOVE.L (2,SP),A6 ; Load return address from supervisor stack
MOVE.W (SP),D6 ; Load condition codes of the main program
AND.W #$A71F,D6
ADD.W D6,D0
ADD.W D6,D1
EOR.L D1,D6
EOR.L D2,D6
EOR.L D6,(A6) ; Decode 8 bytes ahead in main
EOR.L D6,(4,A6)
RTE ; Return from exception
Интел х86
[ редактировать ]Процессоры x86 предоставляют флаг трассировки, который генерирует прерывание после выполнения каждой инструкции. Следующий ассемблерный код является примером того, как это можно реализовать в системе 8086.
; Start by setting a trace handler
InstallHandler: xor bx, bx ; clear bx (faster than mov 0 into it)
mov es, bx ; now ES start is at 0x00000
mov word ptr es:[1*4], offset TraceHandler ; write handler's address offset to IVT entry 1
mov word ptr es:[1*4 + 2], cs ; write current code segment to IVT entry 1
; Turn on the trace trap
pushf ; push FLAGS onto stack
pop ax ; pop previously read FLAGS into AX
or ah, 1 ; set bit 0 by ORing with 1
push ax ; push modified flags back onto stack
popf ; now we have set trace flag in FLAGS
nop
;------------------------
... ; Code from this line would be encrypted
Ниже приводится дизассемблирование связанного обработчика прерываний трассировки.
TraceHandler: push bp
mov bp, sp ; Gain access to return address
push bx
push ds ; Return address in DS:BX
lds bx, 2[bp] ; Pointer to opcode of next instruction
mov bx, [bx] ; Get current instruction's opcode
... ; Decode the opcode
pop ds
pop bx
pop bp
iret ; Return from interrupt
Примеры
[ редактировать ]Копилок
[ редактировать ]Система Rob Northen Copylock, реализованная на Amiga , [ 2 ] Атари СТ [ 3 ] и IBM ПК [ 4 ] платформы включает в себя TVD. В дополнение к общему программному шифрованию Copylock TVD запутывает код, который осуществляет доступ к защищенной от копирования дискете и проверяет ее .
Демосцена
[ редактировать ]TVD был включен в демо-версию Voyage , написанную для Commodore Amiga на базе 680x0 компанией Razor 1911 . [ 5 ]
Ссылки
[ редактировать ]- ^ «Дополнительная информация о 16-битном микропроцессоре MC68000» (PDF) . Моторола Инк.
- ^ Севаллиу, Патрик. «Радужные острова» . Компьютерная археология .
- ^ Керр, Уэйн (май 2004 г.). «Взлом Amiga – взгляд на базовые TVD» . Флештро .
- ^ Отпуск, Fabulous (6 августа 2008 г.). «Копилок Роба Нортена» . Моя жизнь за патчем .
- ^ Различный. «Демо-версия Вогеджа» . Пуэт .