194___________________________________________________Глава 7
7.3. ЗАЩИТА ПРОГРАММ ОТ ТРАССИРОВКИ
Анализ индивидуальных признаков программно—аппаратной среды, в которой работает программа, дает ей возможность проверить легальность копии и принять решение о характере дальнейшей работы. Вот тут—то и кроется наиболее уязвимое место любой системы защиты. Действительно, сама задача защиты программ по сути своей дихотомична, т.е. предполагает выбор одного из двух возможных вариантов: либо копия легальна, либо нет. Выбор либо—либо в конечном счете реализуется машинной инструкцией условного перехода: перейти, если больше (меньше, равно и т.п.). Если в коде программы заменить эту инструкцию на команду безусловного перехода, программа всегда будет работать так, как если бы проверка легальности копии дала положительный результат. Таким образом, каким бы хитроумным не был алгоритм проверки, он легко нейтрализуется, если в точках дихотомического ветвления программы заменить инструкции условного перехода на команды безусловного перехода.
Если Вы хотите защитить свою программу от нелегального копирования, Вы должны составить ее таким образом, чтобы всемерно усложнить работу нескромному наблюдателю, пытающемуся проследить логику ее работы и отыскать ключевые точки ветвления. Фактически это означает вести борьбу с человеком, осуществляющим дизассемблирование программы (т.е. перевод машинных кодов в инструкции ассемблера) и ее трассировку (прослеживание логики работы). В теоретическом плане такую борьбу можно считать проигранной — ведь в конечном счете человек всегда умнее машины. Однако здесь уместна, как мне кажется, параллель с шахматами: известно, что теоретическое положение «белые начинают и выигрывают» вовсе не означает абсолютной бесперспективности черных! Точно также имеет шансы устоять от попыток «взлома» и грамотно составленная система защиты. Суть борьбы со «взломщиком» заключается в том, что многочисленные программные «ловушки», блокирующие работу программ—трассировщиков, и крайне запутанная логика работы системы защиты могут сделать ее «взлом» весьма трудным делом даже для опытного взломщика.
Для дизассемблирования программ обычно используются различные программы— дизассемблеры, преобразующие машинные коды в текстовые строки ассемблерных инструкций. Чтобы затруднить дизассемблирование, можно зашифровать часть программы. В этом случае в работающей про — грамме осуществляется необходимая дешифровка этих фрагментов перед тем, как им будет передано управление, а после дизассемблирования исходного ЕХЕ— файла ключевые фрагменты программы оказываются совершенно бессмысленными. Реализация этой идеи на Турбо Паскале не так проста, как это может показаться на первый взгляд. Дело в том, что компилятор Турбо Паскаля создает ЕХЕ—фэ&л, содержащий многочисленные адресные ссылки с использованием относительной адресации. В процессе загрузки файла в оперативную память осуществляется замена относительных адресов на абсолютные. Шифровка может нарушить относительную адресацию и дешифрованная программа потеряет свою работоспособность. Выходом из положения может служить разработка на