|
Современные аппаратные ключи защиты содержат секретную
функцию преобразования данных, на которой основывается
секретность ключа. Иногда программисту предоставляется
возможность выбрать константы, являющиеся параметрами
преобразования, но сам алгоритм остается неизвестным.
Проверка наличия ключа должна выполняться следующим
образом. При разработке защиты программист делает
несколько запросов к алгоритму и запоминает полученные
ответы. Эти ответы в какой-то форме кодируются в
программе. Во время выполнения программа повторяет те же
запросы и сравнивает полученные ответы с сохраненными
значениями. Если обнаруживается несовпадение, значит,
программа получает ответ не от оригинального ключа.
Эта
схема имеет один существенный недостаток. Так как
защищенная программа имеет конечный размер, то
количество правильных ответов, которые она может
хранить, также является конечным. А это значит, что
существует возможность построения табличного эмулятора,
который будет знать правильные ответы на все запросы,
результат которых может проверить программа.
В
рекомендациях по защите программ с помощью аппаратных
ключей даются советы, как сделать фиктивные запросы со
случайными данными так, чтобы затруднить построение
эмулятора. Однако если программа при запуске делает 100
запросов, результат которых может быть проверен, и 100
случайных запросов, результат которых не проверяется,
то, запустив программу 10 раз, очень легко выделить
действительные запросы, повторившиеся 10 раз, и отсечь
все фиктивные, встретившиеся по 1—2 раза. Конечно, не
стоит всегда проверять наличие ключа выполнением одной и
той же серии запросов с проверкой. Лучше выполнять
проверки в разных частях программы и в разное время. Это
может значительно усложнить сбор статистики для
отсечения фиктивных запросов. Но не стоит забывать, что
противник может проанализировать программу и попытаться
в дизассемблере найти все обращения к ключу. Это поможет
ему выяснить, ответы на какие из запросов проверяются, и
построить компактную таблицу для эмуляции.
Так
что ключи с неизвестным алгоритмом могут затруднить, но
не могут предотвратить построение эмулятора для
конкретной версии конкретной программы. Зато при
переходе к новой версии, если перечень проверяемых
программой ответов на запросы будет изменен, противнику
придется заново выполнять сбор статистики или анализ
программы. |