С.А.Середа
В статье описывается обобщённая процедура анализа и деактивации систем защиты программного обеспечения (ПО) от несанкционированного использования и копирования. Знание методик, которые используются злоумышленниками ('crackers') для преодоления систем программной защиты, позволяет более точно определить слабые места существующих систем, а так же проектировать новые, более устойчивые к атакам 1. Нами предлагается описание унифицированной методики анализа и преодоления систем программной защиты, являющейся результатом обобщения и систематизации многочисленных приёмов "взлома" программ, публикуемых в современной литературе [ 1], а также, доступных в глобальной сети. По итогам проведённого исследования предложен комплексный критерий оценки устойчивости систем защиты программного продукта.
В настоящее время наиболее популярным средством борьбы с нелегальным распространением коммерческих программных продуктов остаётся программная защита их двоичного кода. Существуют системы защиты программного обеспечения разных типов [ 4, 6], все они постоянно развиваются. В то же время, имеются и средства, позволяющие исследовать защищённые программы и отключать системы их защиты [ 5]. В условиях такого динамического равновесия важным фактором, влияющим на стойкость систем защиты, является методическое обеспечение как специалистов по защите ПО, так и злоумышленников.
Мы считаем, что изучению методов, используемых для анализа и преодоления систем защиты ПО, не уделялось достаточного внимания, в то время как их знание позволяет в значительной мере сократить количество уязвимых мест в системах защиты.
Нами было проведено исследование современных подходов к программно-технической защите программных продуктов, а также подходов к преодолению такой защиты. В результате можно сделать вывод, что как с одной (защита), так и с другой ("взлом") стороны основное внимание уделялось и до сих пор уделяется прикладным приёмам защиты ПО или её преодоления [ 3]. В то же время, нам не удалось отыскать ни обобщённых методик проектирования и реализации систем программной защиты, ни аналогичных методик анализа и преодоления таких систем.
Анализ приёмов преодоления систем программной защиты различных типов позволил выявить ряд общих закономерностей. В данном случае, положительную роль сыграло многообразие описываемых злоумышленниками методик, различный уровень их сложности, а также их принадлежность к различным стадиям анализа систем защиты ПО. Таким образом, стало возможным систематизировать информацию по данному вопросу и описать обобщённую процедуру анализа и преодоления систем защиты программных продуктов.
По нашему мнению, любые приёмы и методы анализа и преодоления систем защиты ПО можно свести к ряду стандартных этапов. (См. блок-схему на Рис.1)
Первый этап - определение цели атаки. В первую очередь злоумышленнику необходимо определить цель, для достижения которой он будет атаковать систему защиты программного продукта. Среди возможных целей можно выделить следующие три: личное использование программного продукта; распространение средств, отключающих систему защиты продукта ('crack-files'); несанкционированное распространение самого программного продукта ('warez'). В зависимости от перечисленных целей подход к "взлому" системы защиты того или иного программного продукта может варьироваться. В частности, если злоумышленник планирует использовать программный продукт в личных целях, он может воспользоваться методами, требующими высокой квалификации пользователя, необходимой для работы с отключенной системой защиты. Если предполагается распространение средств отключения системы защиты конкретного продукта злоумышленнику необходимо ориентироваться на неквалифицированного в вопросах защиты ПО пользователя. Это может потребовать дополнительных усилий и затрат времени. Наконец, если злоумышленник планирует распространять "взломанный" программный продукт, ему, как правило, необходимо осуществить прямое отключение системы защиты, что значительно сложнее, чем просто её обход.
Второй этап - поиск проявлений системы защиты. Проявления работы систем защиты могут иметь следующий вид:
ограничение времени использования продукта ('trial/evaluation');
ограничение функциональности продукта ('demo/crippled');
регулярные напоминания о необходимости регистрации ('nag screens');
запрос регистрационного кода ('regcode');
генерация системных ошибок ('crash/GPF');
сбор и передача персональных данных ('spyware');
вредоносные действия ('malware');
внесение ошибок в обработку данных и др.
Возможны и комбинации перечисленных проявлений.
В зависимости от этих проявлений злоумышленник может применять различные подходы к исследованию системы защиты, а так же затрачивать разное время и усилия на её преодоление. Например, напоминания о необходимости регистрации направлены на чисто психологическое воздействие и их отключение обычно не представляет большой сложности. Программные продукты с ограничениями времени использования всегда уязвимы для атак. Продукты с ограничениями функциональности уязвимы, если есть возможность снять ограничения с помощью регистрационного кода, и отключённые подпрограммы не зашифрованы. Системы, отключающие защиту при вводе верного регистрационного номера, можно преодолеть при отсутствии шифрования кода ПО стойкими криптоалгоритмами (DES, RSA, IDEA, etc.). Что же касается систем, генерирующих внутренние или системные ошибки, собирающих персональные данные или осуществляющих вредоносные действия, их анализ и преодоление, как правило, требуют дополнительных затрат времени, так как подобные проявления систем защиты носят неявный и нелокализованный характер.
Третий этап - предварительный анализ работы защищённого продукта. На начальном уровне исследования системы защиты злоумышленник отслеживает активность программы, связанную с созданием и удалением обычных и скрытых файлов; обращением к системным файлам, портам ввода/вывода. Также контролируется строка запуска программы, используемые сервисы операционной системы и другие параметры. При помощи подобного мониторинга работы программного продукта злоумышленник получает общее представление об используемом механизме защиты и возможных путях её преодоления. Как правило, системы защиты используют какой-то один из указанных видов активности программы для реализации своих функций. Например, для реализации ограничения времени использования продукта используется либо создание скрытых файлов, либо запись данных в системные файлы. В этом случае мониторинг работы защищённого приложения с различными файлами даёт важную информацию для дальнейшего исследования системы защиты. Некоторые системы защиты записывают данные в область ППЗУ, в неиспользуемые участки дорожек жёсткого диска или используют электронный ключ. Мониторинг работы приложения с портами ввода/вывода даёт возможность обнаружить подобные факты. Аналогичным образом, системы защиты, использующие регистрационный код, как правило, сохраняют его в собственных или системных файлах. Отслеживание неудачных попыток найти файл или найти запись в системном файле также даёт злоумышленникам предварительную информацию о механизме защиты программного продукта.
Четвёртый этап - предварительный анализ кода программного продукта, определение типа защиты и локализация системы защиты. Проводя поверхностное исследование кода программного продукта, в большинстве случаев злоумышленник определяет тип, а иногда и производителя системы защиты. Становится возможным установить наиболее вероятное физическое расположение кода системы защиты в коде программного продукта. Для подобного исследования кода программы обычно используется шестнадцатеричный редактор с возможностью дизассемблирования машинных инструкций, поиска заданных байтовых последовательностей и др. Но, кроме средств просмотра машинного кода, злоумышленники используют и автоматические анализаторы исполняемых файлов. Эти программные средства по заложенным в них сигнатурам способны распознавать большинство популярных систем защиты ПО, а также определять производителя и версию компилятора, при помощи которого программа была собрана.
Полученная в результате информация, вкупе с данными мониторинга работы программного продукта, даёт злоумышленнику полную обзорную информацию об используемой в программном продукте системе защиты. Нередки случаи, когда дальнейший анализ системы защиты уже на данном этапе становится излишним и собранной информации достаточно для обхода или преодоления защиты.
Пятый этап - оценка стойкости и слабых мест системы защиты ПО для выбора оптимального способа её преодоления. После сбора информации о системе защиты производится оценка её стойкости и слабых мест, а также возможности применения стандартных средств и приёмов преодоления систем защиты данного типа. Злоумышленник, используя доступную информацию об устройстве и стойкости различных систем программной защиты, определяет стойкость системы защиты, реализованной в атакуемом программном продукте. Например, если в атакуемом продукте используется система защиты, ограничивающая время его использования, то уязвимостью является необходимость получения системного времени и даты. В системах с запросом регистрационного кода и/или ограничением функциональности продукта слабым местом является блок проверки корректности регистрационного кода. Системы, использующие ключевые файлы, диски или электронные ключи могут иметь слабые места в блоках проверки корректности ключевых данных или в блоках обмена данными. Другой уязвимостью для любых типов защиты является использование стандартных библиотек подпрограмм, при помощи которых реализуется система защиты ПО.
Оценив стойкость системы защиты, злоумышленник затем выбирает один или несколько эффективных способов её преодоления. На этот выбор влияет и исходная постановка цели, как это было указано выше. В частности, для случая с ограничением времени функционирования продукта злоумышленник может избрать три различных пути: