Защита программ от нелегального копирования 195

ассемблере зашифрованных СОМ— программ, вызываемых из основной программы и обменивающихся с нею данными через общее поле памяти. Ссылку на это поле можно поместить в заранее обусловленный и неиспользуемый ДОС вектор прерывания. Замечу, что более или менее сложная Турбо Паскалевая программа насчитывает многие десятки, а часто и сотни килобайт и после дизассемблирования дает гигантские листинги, объемом во многие сотни тысяч и даже миллионы символов. Разобраться в этой мешанине кодов без пошаговой трассировки практически невозможно, а следовательно, можно не тратить силы на шифровку громоздких программ.

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

Следующая программа иллюстрирует описанный прием. В ассемблерной процедуре TrassBlock модифицируется однобайтная команда RET выхода из процедуры на команду NOP (пустая команда). Если программа управляется трассировщиком, произойдет реальная замена команды и вступит в действие остальная часть процедуры, которая реализует «горячую» перезагрузку ДОС (используется недокументированное соглашение о том, что точка входа в BIOS— программу перезапуска имеет адрес $FOOO:$FFFO;

фирмы—изготовители BIOS не обязаны следовать этому правилу). Чтобы убедиться в этом, запустите программу под управлением какого-либо отладчика, например, Turbo Debugger, и проследите ее по шагам после вызова CALL 0000 — это и есть вызов процедуры TrassBlock. Более простой способ — пошаговое прослеживание программы в среде Турбо Паскаль с помощью клавиши F7, однако в этом случае будет нарушена «чистота эксперимента» — ведь у взломщика нет исходного текста программы.

^-———————————————————————+

I Иллюстрация использования процедуры \ ] блокировки режима пошаговой \ ¦ трассировки программы I -г———————.——-————— ———————+/

Procedure TrassBlock; Assembler;

{Процедура реализует вызов программы перезапуска ДОС