;сбрасывается – при входе в обработчик трассировка будет
выключена
Int60:
;Разрешение прерываний, так как при выходе из обработчика не
;будет восстанавливаться оригинальное значение регистра флагов
sti
;Увеличиваем на единицу адрес возврата в стеке
push bp
mov bp, sp
add [bp+2],1
pop bp
;Выходим из прерывания, но не командой IRET, а командой RETF 2,
;чтобы не восстанавливать флаги (и, как следствие,
;флаг трассировки TF)
retf 2
Кроме того, факт трассировки можно достаточно просто обнаружить, применив хорошо известный разработчикам защит от несанкционированного копирования прием аппаратного конвейера, который использует процессор для ускорения работы. При выполнении очередной команды процессор считывает код следующей. Когда придет время выполнения следующей команды, она будет уже считана из памяти, и не нужно будет тратить время на ее чтение. Прием заключается в модификации команд, которые уже оказались в конвейере: если трассировка не ведется, то код команд модифицируется только в памяти, а выполняется та программа, которая находится в конвейере. Если трассировка ведется, то конвейер сбрасывается перед каждой командой трассируемой программы (конвейер сбрасывают такие команды, как JMP, CALL, RET) и выполняется модифицированный код.
;Модифицируем следующую команду. Команда JMP (безусловный
;переход) заменяется на две команды NOP (нет операции)
mov Metka, 9090h
;Переходим, если выполняется немодифицированный код (в случае,
;когда трассировка не ведется), и проходим дальше, если выполняется
;модифицированный код (в случае трассировки)
Metka: jmp NoTrace
Trace:
;Сюда попадем при выявленном факте трассировки
NoTrace:
;Трассировка не ведется – нормальное выполнение программы
Наконец, последний гвоздь в гроб идеи использования трассировки забит: «Выставленный флаг трассировки можно выявить косвенно, замаскировав аппаратные прерывания, поместив в [SP-1] контрольное значение и дав инструкцию STI. Тогда по изменению слова в стеке можно судить, было трассировочное прерывание или нет».
Выявив факт трассировки прерывания DOS, мониторы начинают выдавать об этом соответствующие сообщения, поэтому даже не самый опытный пользователь догадается, что кто-то (например, вирус) пытается попасть в систему.
Метод предопределенных адресов Переходим к методу определения оригинального адреса точки входа в DOS, основанному на том, что эти адреса для разных версий и конфигураций DOS имеют в общем случае различные значения, но число их ограничено. А это значит, что их можно просто-напросто выбирать из таблицы (причем не очень большой). Прием не новый, но незаслуженно забытый.