учитывает минимальную производительность компьютера класса 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, затем выполнить цикл. Если программа не трассируется, управление процедуре обработки прерывания не будет передано ни разу. Напротив, трассировщик обязательно откроет прерывания и тем самым обнаружит себя.