Dekoder wektora śledzenia

Dekoder wektorów śledzenia ( TVD ) to oprogramowanie komputerowe , które wykorzystuje funkcję śledzenia swojego podstawowego mikroprocesora do dekodowania zaszyfrowanych rozkazów instrukcji dokładnie na czas przed wykonaniem i ewentualnie ponownego kodowania ich później. Może być używany do utrudniania inżynierii wstecznej podczas próby zapobiegania pękaniu oprogramowania w ramach ogólnej strategii ochrony przed kopiowaniem .

Śledzenie mikroprocesora

Niektóre rodziny mikroprocesorów (np. 680x0, x86) zapewniają możliwość śledzenia instrukcji w celu ułatwienia rozwoju programu. Debuger może wykorzystać tę możliwość do pojedynczego przejścia przez program, zapewniając programiście środki do monitorowania wykonywania testowanego programu .

Instalując niestandardową procedurę obsługi wyjątku śledzenia , można uzyskać kontrolę nad mikroprocesorem między wykonywaniem normalnych instrukcji przepływu programu. Typowa procedura obsługi wyjątków dekodera wektora śledzenia dekoduje nadchodzącą instrukcję znajdującą się poza wyjątkiem, jak również ponownie koduje poprzednio zdekodowaną instrukcję.

Implementacje

Motorola 680x0

Motorola 68000 ma funkcję śledzenia instrukcja po instrukcji. Kiedy jego stan śledzenia jest włączony, procesor automatycznie wymusza wyjątek śledzenia po wykonaniu każdej instrukcji (nie będącej wyjątkiem). Poniższy asemblera jest przykładem programu inicjującego procedurę obsługi wyjątków śledzenia w systemie 68000.

		       
                	
                	
                	
                	 InstallHandler:  MOVE.L  #  $  4  E730000  ,  -  (  SP  )  ; Przenieś program obsługi wyjątków śledzenia na stos   MOVE.L  #  $  00000010  ,  -  (  SP  )  MOVE.L  #  $  0004  DDB9  ,  -  (  SP  )  MOVE.L  #  $  BD96BDAE  ,  -  (  SP  )  MOVE.L  #  $  B386B586 
                	
                	
                	
                	
                	 ,  -  (  SP  )  MOVE.L  #  $  D046D246  ,  -  (  SP  )  MOVE.L  #  $  0246  A71F  ,  -  (  SP  )  MOVE.L  #  $  00023  C17  ,  -  (  SP  )  MOVE.W  #  $  2  C6F  ,  -  (  SP  )  MOVE.L  SP  ,(  $  24              
                	              
                                            
                
                                             )  .W  ; Ustaw wektor obsługi wyjątków śledzenia   ORI.W  #  $  A71F  ,  SR  ; Włącz stan śledzenia   NOP  ; CPU generuje wyjątek śledzenia po wykonaniu tego NOP   ;---------------------------------------  ...  ; Kod z tej linii zostałby zaszyfrowany  

0 Poniżej przedstawiono demontaż powyższej procedury obsługi wyjątków śledzenia załadowanej na stosie. Celem tej procedury obsługi jest zaciemnianie każdego śledzonego zaszyfrowanego kodu. Na jego proces deszyfrowania ma wpływ zawartość rejestru kodu stanu (CCR). Na przykład operacja arytmetyczna w programie głównym, której wynikiem jest liczba, spowoduje ustawienie bitu flagi zerowej w CCR. Spowoduje to zmianę wartości w (SP) w programie obsługi wyjątków śledzenia.

   	              
                	                
                	
                	
                	
                	
                	
                	 TraceHandler:  MOVE.L  (  2  ,  SP  ),  A6  ; Załaduj adres zwrotny ze stosu nadzorcy   MOVE.W  (  SP  ),  D6  ; Kody stanu obciążenia programu głównego   AND.W  #  $  A71F  ,  D6  ADD.W  D6  ,  D0  ADD.W  D6  ,  D1  EOR.L  D1  ,  D6  EOR.L  D2  ,  D6  EOR.L  D6  ,(  A6  )                 
                	
                                             ; Dekoduj 8 bajtów do przodu w głównym   EOR.L  D6  ,(  4  ,  A6  )  RTE  ; Powrót z wyjątku  

Intel x86

Procesory x86 zapewniają flagę śledzenia, która generuje przerwanie po wykonaniu każdej instrukcji. Poniższy asemblera jest przykładem tego, jak można to zaimplementować w systemie 8086.


                        
                                       
                            
                           ; Zacznij od ustawienia procedury obsługi śledzenia   InstallHandler:  xor  bx  ,  bx  ; wyczyść bx (szybciej niż mov 0 do niego)   mov  es  ,  bx  ; teraz ES start to 0x00000   mov  word  ptr  es  :[  1  *  4  ],  offset  TraceHandler  ; przesunięcie adresu modułu obsługi do wpisu IVT 1   mov  słowo  ptr  es  :[  1  *  4  +  2  ],  cs                 


                                          
                                          
                                         
                                         
                                           

                
                
                                             ; zapisz bieżący segment kodu do wpisu IVT 1   ; Włącz pułapkę śledzenia   pushf  ; wepchnij FLAGI na stos   pop  topór  ; pop wcześniej wczytaj FLAGI do AX   lub  ah  ,  1  ; ustawić bit 0 przez ORing z 1   pchającym  toporem  ; wepchnij zmodyfikowane flagi z powrotem na stos   popf  ; teraz ustawiliśmy flagę śledzenia we FLAGS   nop  ;--------------------------------------  ...  ; Kod z tej linii zostałby zaszyfrowany  

Poniżej przedstawiono demontaż powiązanej procedury obsługi przerwań śledzenia.

       
                                       
                    
                                         

                                    
                                     

                                            

                     
                      
                     
                 TraceHandler:  push  bp  mov  bp  ,  sp  ; Uzyskaj dostęp do adresu zwrotnego   push  bx  push  ds  ; Adres zwrotny w DS:BX   lds  bx  ,  2  [  bp  ]  ; Wskaźnik do kodu operacji następnej instrukcji   mov  bx  ,  [  bx  ]  ; Uzyskaj kod operacji bieżącej instrukcji   ...  ; Dekoduj opcode   pop  ds  pop  bx  pop  bp  iret                             ; Powrót z przerwania  

Przykłady

Blokada kopiowania

Rob Northen Copylock zaimplementowany na platformach Amiga , Atari ST i IBM PC zawiera TVD. Oprócz ogólnego szyfrowania programowego, Copylock TVD zaciemnia kod dostępu i sprawdza poprawność dyskietki chronionej przed kopiowaniem .

Demoscena

TVD był zawarty w demo Voyage, napisanym przez Razor 1911 dla Commodore Amiga opartego na 680x0 .