если он планирует самостоятельно использовать продукт, возможно, будет достаточно вручную изменять системную дату или переустанавливать программный продукт по истечении разрешённого срока его использования, стирая скрытые файлы и/или записи в системных файлах, сделанные системой защиты;
при желании в дальнейшем распространять средство снятия защиты с продукта злоумышленнику потребуется исследовать алгоритмы системы защиты и разработать программное средство её статического или динамического преодоления;
если же планируется "пиратская" реализация программного продукта, злоумышленник должен будет либо распространять его вместе со средством снятия защиты либо произвести полное статическое отключение системы защиты в программном продукте.
В зависимости от выбранного способа преодоления защиты изменяется и дальнейшее её исследование.
Шестой этап - направленное исследование системы защиты. На данной стадии злоумышленник выполняет статический и/или динамический анализ системы защиты атакуемого продукта. Статический анализ, в зависимости от языка программирования, на котором написана программа, может осуществляться при помощи дизассемблирования объектного кода или при помощи его декомпиляции. Применение дизассемблера даёт злоумышленнику возможность работы с последовательностью инструкций целевого процессора, в которую исходный текст программы был превращён при компиляции. В случае же декомпиляции объектного кода злоумышленник получает текст на языке высокого уровня в максимально близком к исходному виде. Получив текст программы на языке ассемблера или языке высокого уровня, злоумышленник анализирует его и определяет алгоритм преодоления защиты продукта.
В случае затруднений, связанных со статическим анализом, например, когда объектный код зашифрован или динамически изменяется, прибегают к его динамическому анализу. Как правило, динамический анализ систем защиты выполняется при помощи программного отладчика. При этом исследуемое приложение запускается в среде программы-отладчика и выполняется в пошаговом режиме или с использованием заданных точек останова. В режиме отладки становится возможным отслеживать изменения состояния программы, происходящие в процессе её выполнения (например, изменение содержимого регистров процессора, срабатывание команд условного перехода, параметры вызова подпрограмм, получаемые или передаваемые через порты ввода/вывода данные и др.). В этом же режиме выполняется прохождение алгоритмов, например, проверки/генерации корректного регистрационного кода.
Динамический анализ может также выполняться при помощи уже упоминавшихся выше мониторов активности приложения. Если на этапе предварительного анализа при помощи этих средств отслеживается общая направленность работы программы, то на этапе динамического анализа системы защиты отслеживается не только факты обращения к файлам, портам и системным сервисам, но и все параметры этих обращений: данные, записываемые/считываемые из скрытых и системных файлов, параметры вызова системных сервисов, протоколы обмена с портами ввода/вывода и др. В случае применения мониторов активности не имеет значения, реализованы ли в рамках системы защиты блоки противодействия отладке приложения или нет.
По завершении данного этапа анализа системы защиты злоумышленник обладает полной информацией о том, как технически осуществить обход или преодоление системы защиты программного продукта.
Седьмой этап - преодоление системы защиты. На финальном этапе, учитывая поставленную цель, выбранный способ преодоления защиты и найденную техническую процедуру её обхода или преодоления, злоумышленник реализует преодоление защиты на практике. Под обходом системы защиты понимаются действия, напрямую не относящиеся к противодействию системе защиты атакуемого программного продукта. В качестве примера можно привести периодическую реинсталляцию программных продуктов с ограниченным сроком использования; изменение системной даты до запуска программы и установка корректной даты по завершении её работы; удаление/замену скрытых файлов со счётчиками запуска; удаление/замену соответствующих строк в системных файлах; написание и использование генераторов регистрационных кодов; отслеживание и автоматическое завершение диалогов с напоминанием о необходимости регистрации продукта и т.п.
Преодоление системы защиты может осуществляться тремя основными путями:
Статическая модификация кода программного продукта, приводящая к отключению системы защиты.
Динамическая модификация кода программного продукта во время его выполнения.
Эмуляция ключевого файла, диска или электронного ключа защиты.
В первом случае в объектный код программного продукта вносятся изменения, дезактивирующие систему его защиты. Как правило, они касаются команд условного перехода типа "зарегистрированная версия/незарегистрированная версия" или "верный регистрационный код/неверный регистрационный код". Иногда модифицируются элементы данных программы, содержащие определённые флаги, по которым система защиты судит о наличии регистрации программного продукта. Нередко, для статической модификации кода требуется его предварительная дешифрация или восстановление по образу в оперативной памяти. Такая операция часто обладает значительной трудоёмкостью и требует дополнительного исследования системы защиты. Поэтому злоумышленники прибегают к статической модификации объектного кода атакуемого продукта либо при условии, что код ПО не зашифрован, либо когда преследуют цель "пиратского" распространения ПО. При этом распространяться может как программное средство, выполняющее статическую модификацию продукта, так и просто данные, позволяющие выполнить это вручную.
К динамической модификации кода злоумышленники прибегают в случаях, когда дешифрация или восстановление объектного кода программы требует слишком высоких затрат. Под динамической модификацией понимается изменение кода программы в оперативной памяти во время выполнения. Подобная модификация должна производиться при каждом новом запуске программы. Для реализации этого процесса злоумышленниками используются специальные программные средства, осуществляющие загрузку целевого приложения как своего дочернего процесса. Такая загрузка даёт доступ к адресному пространству приложения в оперативной памяти, а соответственно и возможность динамического изменения его кода. Как правило, программные средства, ориентированные на конкретный программный продукт, распространяются злоумышленниками в глобальной сети отдельно или вместе с самим продуктом.
Эмуляция используется, в основном, если система защиты включает в себя электронный ключ, реже, если присутствует ключевой диск или ключевой файл. Суть данного метода заключается в подделке ответов на запросы защищённого приложения к отсутствующему ключу, диску или файлу таким образом, что система защиты не обнаруживает его отсутствия. С одной стороны, использование эмуляции требует значительных усилий, связанных с исследованием протоколов обмена данными между блоками системы защиты, и программированием эмулятора (нередко в виде драйвера). С другой же стороны, эмуляция, как правило, не требует модификации кода ПО, а следовательно избавляет злоумышленника от необходимости дешифрации или исправления значительных участков программного кода. Чаще всего эмуляторы распространяются отдельно либо вместе с "пиратскими" копиями ПО.
Преодоление системы защиты атакуемого продукта является последним этапом процесса анализа и преодоления систем защиты. После этого злоумышленник начинает использование программного продукта, распространение средства отключения системы защиты или самого продукта.
Знание последовательности действий злоумышленника позволяет разрабатывать гибкую политику программно-технической защиты программных продуктов. Значительная доля современных систем защиты ориентирована на затруднение лишь части из описанных этапов их анализа и преодоления. Например, нередки случаи, когда система защиты обладает мощными механизмами противодействия дизассемблированию кода защищённого приложения и его отладке, но не способна противостоять мониторингу. Существуют, также, системы защиты, базирующиеся на шифровании объектного кода приложения, но обладающие чрезвычайно простой логикой, что позволяет злоумышленникам легко осуществлять динамическую модификацию кода. Кроме того, львиная доля систем защиты не только не маскирует своего присутствия, но и активно информирует о нём пользователя. Подобная стратегия в значительной мере облегчает злоумышленникам предварительный анализ системы защиты и её локализацию.
Таким образом, можно заключить, что правильно спроектированная система защиты, по крайней мере, должна затруднять своё первичное обнаружение, противодействовать мониторингу работы приложения, его отладке, дизассемблированию и/или декомпиляции, обладать сложной логикой работы, трудно поддающейся анализу, а так же создавать значительные трудности для динамической и/или статической модификации кода защищаемого программного продукта.
На основе высказанных выше соображений можно сформулировать частные критерии устойчивости защищаемого продукта к атакам. По нашему мнению, можно предложить следующие критерии:
Трудность распространения продукта (требуется пользовательская документация, необходимо специальное оборудование, объём продукта затрудняет его распространение по сети и т.п.)