учитывает минимальную производительность компьютера класса IBM PC с тактовой частотой 4.77 МГц (около 780 единиц для этой программы).

Перехват прерывания от клавиатуры использует тот очевидный факт, что для управления трассировщиком взломщик должен использовать клавиатуру. Для обнаружения этого программа переназначает вектор прерывания $09 от клавиатуры на собственную процедуру, после чего выполняет достаточно длинный цикл. Если в ходе выполнения цикла будет нажата любая клавиша, управление получит новый обработчик прерывания $09 и таким образом программа сможет обнаружить факт трассировки.

В следующем примере процедура обработки прерывания $09 осуществляет «горячую» перезагрузку ДОС:

_•+—— —————__— —__-——____—____—+

¦ Блокировка трассирования программы ¦ ¦ с помощью контроля прерывания от ] ¦ клавиатуры \ +————.————.————————————————+_

Oses DOS;

var

01dlnt9: pointed-Procedure Int9; Assembler;

{Получает управления после нажатия на любую клавишу и перезагружает ДОС} ASM

mov ax, $FOOO

push ax

mov ax, $FFFO

push ax

retf end;

var

k,n: Longint;

begin

SwapVectors;

GetIntVec($9,01dlnt9) ;

SetIntVec($9,@Int9) ;

for k := 1 to 20000 do inc (n) ;

SetIntVec($9,01dlnt9) ;

WriteLn('HeT трассировки') end.

Приблизительно таким же способом можно использовать прерывание от таймера $16. Перед заменой векторов программа должна запретить прерывания командой CL1, затем выполнить цикл. Если программа не трассируется, управление процедуре обработки прерывания не будет передано ни разу. Напротив, трассировщик обязательно откроет прерывания и тем самым обнаружит себя.