в случае, если она работает под управлением трассировщика} ASM

{Модификация команды по метке @}

mov BYTE PTR @,90h {Команда NOP}

{Следующая команда не модифицируется,ели нет трассировки, в противном случае она заменяется командой NOP} @: ret

{Сюда управление передается только в том случае, когда работа программы прослеживается трассировщиком} mov ax,$FOOO {Сегмент точки перезапуска} push ax

mov ax,$FFFO {Смещение точки перезапуска} push ax

retf {Перезапуск ДОС} end; {TrassBlock} begin

TrassBlock end.

Как еще программа может определить факт трассировки? Пожалуйста:

• с помощью контроля отладочных прерываний INT 1 и INT 3;

• с помощью замера времени выполнения некоторого эталонного участка программы;

• с помощью перехвата прерывания от клавиатуры;

• с помощью перехвата прерывания от таймера.

В архитектуре микропроцессора предусмотрены два отладочных прерывания с векторами 1 и 3. Первое активизируется после выполнения каждой очередной инструкции программы, если взведен флаг трассировки TF. Второе вызывается однобайтной командой INT и реализует останов в контрольной точке. Сразу после загрузки ДОС эти векторы указывают на расположенные в ПЗУ программы обработки прерываний, которые ничего не делают и просто возвращают управление прерванной программе. Таким образом, если сегментная часть этих векторов указывает на ОЗУ (меньше $АООО), есть большая вероятность того, что программа прослеживается (может оказатьсяг что векторы изменены какой—то ранее запускавшейся программой, но не восстановлены после ее завершения). Чтобы убедиться в этом, программа может проанализировать флаг TF режима трассировки и/ или попытаться заменить эти векторы так, чтобы они указывали на соОственную процедуру обработки.

Например, следующая программа использует небольшой фрагмент, написанный на встроенном ассемблере, чтобы проанализировать флаг трассировки. В результате анализа на экран выводится сообщение «Нет трассировки» или «Есть трассировка». Замечу, что некоторые отладчики, в том числе — встроенный отладчик Турбо Паскаля и мой любимый Turbo Debugger, не используют аппаратной трассировки по прерыванию INT 1 и, следовательно, программа, работающая под их управлением, не обнаруживает факт трассировки. Чтобы это все-таки произошло, трассируйте программу стандартным отладчиком Debug.