Этапы преодоления систем защиты программного обеспечения

С.А.Середа 
Встатье описывается обобщённая процедура анализа и деактивации систем защитыпрограммного обеспечения (ПО) от несанкционированного использования икопирования. Знание методик, которые используются злоумышленниками (‘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.). Что же касаетсясистем, генерирующих внутренние или системные ошибки, собирающих персональныеданные или осуществляющих вредоносные действия, их анализ и преодоление, какправило, требуют дополнительных затрат времени, так как подобные проявлениясистем защиты носят неявный и нелокализованный характер.
Третийэтап — предварительный анализ работы защищённого продукта. На начальном уровнеисследования системы защиты злоумышленник отслеживает активность программы,связанную с созданием и удалением обычных и скрытых файлов; обращением ксистемным файлам, портам ввода/вывода. Также контролируется строка запускапрограммы, используемые сервисы операционной системы и другие параметры. Припомощи подобного мониторинга работы программного продукта злоумышленникполучает общее представление об используемом механизме защиты и возможных путяхеё преодоления. Как правило, системы защиты используют какой-то один изуказанных видов активности программы для реализации своих функций. Например,для реализации ограничения времени использования продукта используется либосоздание скрытых файлов, либо запись данных в системные файлы. В этом случаемониторинг работы защищённого приложения с различными файлами даёт важнуюинформацию для дальнейшего исследования системы защиты. Некоторые системызащиты записывают данные в область ППЗУ, в неиспользуемые участки дорожекжёсткого диска или используют электронный ключ. Мониторинг работы приложения спортами ввода/вывода даёт возможность обнаружить подобные факты. Аналогичнымобразом, системы защиты, использующие регистрационный код, как правило,сохраняют его в собственных или системных файлах. Отслеживание неудачных попытокнайти файл или найти запись в системном файле также даёт злоумышленникампредварительную информацию о механизме защиты программного продукта.
Четвёртыйэтап — предварительный анализ кода программного продукта, определение типазащиты и локализация системы защиты. Проводя поверхностное исследование кодапрограммного продукта, в большинстве случаев злоумышленник определяет тип, аиногда и производителя системы защиты. Становится возможным установить наиболеевероятное физическое расположение кода системы защиты в коде программногопродукта. Для подобного исследования кода программы обычно используетсяшестнадцатеричный редактор с возможностью дизассемблирования машинныхинструкций, поиска заданных байтовых последовательностей и др. Но, кромесредств просмотра машинного кода, злоумышленники используют и автоматическиеанализаторы исполняемых файлов. Эти программные средства по заложенным в нихсигнатурам способны распознавать большинство популярных систем защиты ПО, атакже определять производителя и версию компилятора, при помощи которогопрограмма была собрана.
Полученнаяв результате информация, вкупе с данными мониторинга работы программногопродукта, даёт злоумышленнику полную обзорную информацию об используемой впрограммном продукте системе защиты. Нередки случаи, когда дальнейший анализсистемы защиты уже на данном этапе становится излишним и собранной информациидостаточно для обхода или преодоления защиты.
Пятыйэтап — оценка стойкости и слабых мест системы защиты ПО для выбора оптимальногоспособа её преодоления. После сбора информации о системе защиты производитсяоценка её стойкости и слабых мест, а также возможности применения стандартныхсредств и приёмов преодоления систем защиты данного типа. Злоумышленник,используя доступную информацию об устройстве и стойкости различных системпрограммной защиты, определяет стойкость системы защиты, реализованной ватакуемом программном продукте. Например, если в атакуемом продуктеиспользуется система защиты, ограничивающая время его использования, то уязвимостьюявляется необходимость получения системного времени и даты. В системах сзапросом регистрационного кода и/или ограничением функциональности продуктаслабым местом является блок проверки корректности регистрационного кода.Системы, использующие ключевые файлы, диски или электронные ключи могут иметьслабые места в блоках проверки корректности ключевых данных или в блоках обменаданными. Другой уязвимостью для любых типов защиты является использованиестандартных библиотек подпрограмм, при помощи которых реализуется системазащиты ПО.
Оценивстойкость системы защиты, злоумышленник затем выбирает один или несколькоэффективных способов её преодоления. На этот выбор влияет и исходная постановкацели, как это было указано выше. В частности, для случая с ограничением временифункционирования продукта злоумышленник может избрать три различных пути:
еслион планирует самостоятельно использовать продукт, возможно, будет достаточновручную изменять системную дату или переустанавливать программный продукт поистечении разрешённого срока его использования, стирая скрытые файлы и/илизаписи в системных файлах, сделанные системой защиты;
прижелании в дальнейшем распространять средство снятия защиты с продуктазлоумышленнику потребуется исследовать алгоритмы системы защиты и разработатьпрограммное средство её статического или динамического преодоления;
еслиже планируется «пиратская» реализация программного продукта,злоумышленник должен будет либо распространять его вместе со средством снятиязащиты либо произвести полное статическое отключение системы защиты впрограммном продукте.
Взависимости от выбранного способа преодоления защиты изменяется и дальнейшее еёисследование.
Шестойэтап — направленное исследование системы защиты. На данной стадии злоумышленниквыполняет статический и/или динамический анализ системы защиты атакуемогопродукта. Статический анализ, в зависимости от языка программирования, накотором написана программа, может осуществляться при помощи дизассемблированияобъектного кода или при помощи его декомпиляции. Применение дизассемблера даётзлоумышленнику возможность работы с последовательностью инструкций целевогопроцессора, в которую исходный текст программы был превращён при компиляции. Вслучае же декомпиляции объектного кода злоумышленник получает текст на языкевысокого уровня в максимально близком к исходному виде. Получив текст программына языке ассемблера или языке высокого уровня, злоумышленник анализирует его иопределяет алгоритм преодоления защиты продукта.
Вслучае затруднений, связанных со статическим анализом, например, когдаобъектный код зашифрован или динамически изменяется, прибегают к егодинамическому анализу. Как правило, динамический анализ систем защитывыполняется при помощи программного отладчика. При этом исследуемое приложениезапускается в среде программы-отладчика и выполняется в пошаговом режиме или сиспользованием заданных точек останова. В режиме отладки становится возможнымотслеживать изменения состояния программы, происходящие в процессе еёвыполнения (например, изменение содержимого регистров процессора, срабатываниекоманд условного перехода, параметры вызова подпрограмм, получаемые илипередаваемые через порты ввода/вывода данные и др.). В этом же режимевыполняется прохождение алгоритмов, например, проверки/генерации корректногорегистрационного кода.
Динамическийанализ может также выполняться при помощи уже упоминавшихся выше мониторовактивности приложения. Если на этапе предварительного анализа при помощи этихсредств отслеживается общая направленность работы программы, то на этапединамического анализа системы защиты отслеживается не только факты обращения кфайлам, портам и системным сервисам, но и все параметры этих обращений: данные,записываемые/считываемые из скрытых и системных файлов, параметры вызовасистемных сервисов, протоколы обмена с портами ввода/вывода и др. В случаеприменения мониторов активности не имеет значения, реализованы ли в рамкахсистемы защиты блоки противодействия отладке приложения или нет.
Позавершении данного этапа анализа системы защиты злоумышленник обладает полнойинформацией о том, как технически осуществить обход или преодоление системызащиты программного продукта.
Седьмойэтап — преодоление системы защиты. На финальном этапе, учитывая поставленнуюцель, выбранный способ преодоления защиты и найденную техническую процедуру еёобхода или преодоления, злоумышленник реализует преодоление защиты на практике.Под обходом системы защиты понимаются действия, напрямую не относящиеся кпротиводействию системе защиты атакуемого программного продукта. В качествепримера можно привести периодическую реинсталляцию программных продуктов сограниченным сроком использования; изменение системной даты до запускапрограммы и установка корректной даты по завершении её работы; удаление/заменускрытых файлов со счётчиками запуска; удаление/замену соответствующих строк всистемных файлах; написание и использование генераторов регистрационных кодов;отслеживание и автоматическое завершение диалогов с напоминанием онеобходимости регистрации продукта и т.п.
Преодолениесистемы защиты может осуществляться тремя основными путями:
Статическаямодификация кода программного продукта, приводящая к отключению системы защиты.
Динамическаямодификация кода программного продукта во время его выполнения.
Эмуляцияключевого файла, диска или электронного ключа защиты.
Впервом случае в объектный код программного продукта вносятся изменения,дезактивирующие систему его защиты. Как правило, они касаются команд условногоперехода типа «зарегистрированная версия/незарегистрированная версия»или «верный регистрационный код/неверный регистрационный код». Иногдамодифицируются элементы данных программы, содержащие определённые флаги, покоторым система защиты судит о наличии регистрации программного продукта.Нередко, для статической модификации кода требуется его предварительнаядешифрация или восстановление по образу в оперативной памяти. Такая операциячасто обладает значительной трудоёмкостью и требует дополнительногоисследования системы защиты. Поэтому злоумышленники прибегают к статическоймодификации объектного кода атакуемого продукта либо при условии, что код ПО незашифрован, либо когда преследуют цель «пиратского» распространенияПО. При этом распространяться может как программное средство, выполняющеестатическую модификацию продукта, так и просто данные, позволяющие выполнитьэто вручную.
Кдинамической модификации кода злоумышленники прибегают в случаях, когдадешифрация или восстановление объектного кода программы требует слишком высокихзатрат. Под динамической модификацией понимается изменение кода программы воперативной памяти во время выполнения. Подобная модификация должнапроизводиться при каждом новом запуске программы. Для реализации этого процессазлоумышленниками используются специальные программные средства, осуществляющиезагрузку целевого приложения как своего дочернего процесса. Такая загрузка даётдоступ к адресному пространству приложения в оперативной памяти, асоответственно и возможность динамического изменения его кода. Как правило,программные средства, ориентированные на конкретный программный продукт,распространяются злоумышленниками в глобальной сети отдельно или вместе с самимпродуктом.
Эмуляцияиспользуется, в основном, если система защиты включает в себя электронный ключ,реже, если присутствует ключевой диск или ключевой файл. Суть данного методазаключается в подделке ответов на запросы защищённого приложения котсутствующему ключу, диску или файлу таким образом, что система защиты необнаруживает его отсутствия. С одной стороны, использование эмуляции требуетзначительных усилий, связанных с исследованием протоколов обмена данными междублоками системы защиты, и программированием эмулятора (нередко в видедрайвера). С другой же стороны, эмуляция, как правило, не требует модификациикода ПО, а следовательно избавляет злоумышленника от необходимости дешифрацииили исправления значительных участков программного кода. Чаще всего эмуляторыраспространяются отдельно либо вместе с «пиратскими» копиями ПО.
Преодолениесистемы защиты атакуемого продукта является последним этапом процесса анализа ипреодоления систем защиты. После этого злоумышленник начинает использованиепрограммного продукта, распространение средства отключения системы защиты илисамого продукта.
Знаниепоследовательности действий злоумышленника позволяет разрабатывать гибкуюполитику программно-технической защиты программных продуктов. Значительная долясовременных систем защиты ориентирована на затруднение лишь части из описанныхэтапов их анализа и преодоления. Например, нередки случаи, когда система защитыобладает мощными механизмами противодействия дизассемблированию кодазащищённого приложения и его отладке, но не способна противостоять мониторингу.Существуют, также, системы защиты, базирующиеся на шифровании объектного кодаприложения, но обладающие чрезвычайно простой логикой, что позволяетзлоумышленникам легко осуществлять динамическую модификацию кода. Кроме того,львиная доля систем защиты не только не маскирует своего присутствия, но иактивно информирует о нём пользователя. Подобная стратегия в значительной мереоблегчает злоумышленникам предварительный анализ системы защиты и еёлокализацию.
Такимобразом, можно заключить, что правильно спроектированная система защиты, покрайней мере, должна затруднять своё первичное обнаружение, противодействоватьмониторингу работы приложения, его отладке, дизассемблированию и/илидекомпиляции, обладать сложной логикой работы, трудно поддающейся анализу, атак же создавать значительные трудности для динамической и/или статическоймодификации кода защищаемого программного продукта.
Наоснове высказанных выше соображений можно сформулировать частные критерииустойчивости защищаемого продукта к атакам. По нашему мнению, можно предложитьследующие критерии:
Трудностьраспространения продукта (требуется пользовательская документация, необходимоспециальное оборудование, объём продукта затрудняет его распространение по сетии т.п.)
Устойчивостьк поиску проявлений системы защиты (маскировка факта срабатывания системызащиты);
Устойчивостьк предварительному анализу защищённого продукта (маскировка функциональностисистемы защиты);
Устойчивостьк предварительному анализу программного кода (маскировка физическогорасположения системы защиты в коде продукта);
Наличиеуязвимостей в системе защиты;
Устойчивостьк статическому и динамическому анализу кода (противодействие анализу алгоритмовсистемы защиты);
Устойчивостьк обходу системы защиты (наличие логических ошибок в алгоритмах защиты);
Устойчивостьк преодолению системы защиты (трудность статической и динамической модификациикода продукта).
Исходяиз данного набора частных критериев, можно построить комплексный критерийустойчивости программного продукта к атакам. Этот критерий формулируетсяследующим образом:
Kкомпл. = n ∑ i=1 αi ki,
гдеki — частный критерий устойчивости, αi — весовойкоэффициент частного критерия устойчивости, определяющий его важность, а n — количество частных критериев устойчивости.
Такимобразом, с помощью метода экспертных оценок становится возможным сравниватьмежду собой различные варианты защиты одного программного продукта либосравнивать реализации защиты различных программных продуктов одного класса.Сама реализация метода экспертных оценок может быть осуществлена двумя основнымиспособами:
Еслиотсутствует статистика предыдущих оценок, возможно лишь сравнение различныхвариантов между собой. В этом случае по единой методике оцениваются различныеварианты реализации защиты программных продуктов. Лучшим считается вариант смаксимальным значением комплексного критерия.
Приналичии статистики предыдущих оценок возможно выделение интервалов значенийчастных и совокупного критериев. Тогда варианты, не попадающие в необходимыйинтервал значений отбрасываются. Хотя и в данном случае лучшим считаетсявариант с максимальным значением комплексного критерия, данный способ позволяетоценить единственный вариант реализации защиты, не рассматривая егоальтернатив.
Средивозможных направлений дальнейших исследований в данной сфере, по нашему мнению,следует отметить подробное изучение отдельных этапов преодоления системпрограммной защиты; выявление зависимости между сроком преодоления системзащиты разных типов и набором используемого злоумышленником программногоинструментария; сбор статистических данных по стойкости систем защиты разныхтипов; разработку методик оценки стойкости систем защиты ПО и сроковгарантированной устойчивости подобных систем к атакам.
Список литературы
КасперскиКрис.  Техника и философия хакерских атак. — М.: Солон-Р, 1999.
МайерсГленфорд Дж. Искусство тестирования программ. — М.: Финансы и статистика, 1982.
РасторгуевС.П., Дмитриевский Н.Н. Искусство защиты и раздевания программ. — М.:Совмаркет, 1991. — 94 с.
СемьяновП.В., Зегжда Д.П.  Анализ средств противодействия исследованию программногообеспечения и методы их преодоления. // КомпьютерПресс. — 1993. №11.
СередаС.А.  Анализ средств преодоления систем защиты программного обеспечения. //ИНФОРМОСТ: Радиоэлектроника и Телекоммуникации. — 2002. №4(22). С. 11-16.
СередаС.А.  Оценка эффективности систем защиты программного обеспечения. // КомпьЛог.- 2000. №2.
/>1 Под атакой нами понимается комплекс действий, направленных нанарушение защиты ПО от копирования и использования.