В предыдущем номере газеты я уже рассказал о самых распространенных на сегодняшний день способах защиты программного обеспечения, сделав особый акцент на электронных ключах. Этой статьей мне хотелось бы дополнить начатый рассказ и изложить методы защиты и взлома программ, особенно не вдаваясь в технические подробности.
Важнейшей составной частью системы защиты с использованием электронных ключей является ее программная компонента. Как правило, она включает в себя защитный "конверт" (Envelope) и библиотечные функции обращения к ключу (API - Application Program Interface). Оба этих способа обеспечения защиты имеют свое назначение и, по возможности, должны применяться совместно, что обеспечит наиболее стойкую защиту. Давайте же рассмотрим подробнее каждый из этих способов защиты.
Защита с помощью пристыковочного механизма (Envelope). Системы автоматической защиты (automatic implementation system) предназначены для защиты уже готовых программ, без вмешательства в исходный код программы. Это могут быть как DOS-, так и Windows- приложения. Таким способом могут быть защищены com- и exe-файлы, в том числе и те, которые содержат в себе внутренние оверлеи. Для этого используется так называемая "вирусная" технология - вживление и перехват управления на себя после загрузки. При защите тело программы шифруется и в нее добавляется специальный модуль, который при запуске защищенной программы перехватывает управление на себя. После отработки специальных антиотладочных и антитрассировочных механизмов проверяется наличие электронного ключа и из него считываются требуемые параметры. Затем происходит проверка "ключевых" условий и, в зависимости от результата, вырабатывается одно из двух решений. Если TRUE (все в порядке, ключ присутствует), то производится загрузка, расшифровка и настройка на выполнение тела защищенной программы, передача на нее управления после выгрузки защитного модуля из памяти. Если же результат равен FALSE (ключ отсутствует либо не соответствует настоящему ключу), то тогда загрузка и расшифровка тела программы в память не производится. Обычно после этого выполняются некоторые маскирующие действия, выдается сообщение об ошибке (например, Plug not found) и защищенное приложение заканчивает свое выполнение с ненулевым кодом возврата.
Для защиты от аппаратной или программной эмуляции обмен между защитной оболочкой и электронным ключом выполняется с использованием зашумленного изменяющегося во времени протокола (так называемого "плавающего" протокола). Некоторые типы защитных оболочек обеспечивают фоновые проверки ключа, в процессе работы защищенного приложения. Поэтому вытащить и перенести ключ на другой компьютер после запуска на нем защищенной программы нельзя. Большинство современных систем обеспечивают дополнительную защиту программ от изменения их вирусами. При этом осуществляется проверка контрольных сумм кода защищенной программы.
Защита с использованием функций API. Простейшая функция API - это проверка подключения ключа. Более сложные функции API могут посылать ключу различные входные коды и получать от него ответные коды, которые затем проверяются на соответствие установленным значениям или могут использоваться при шифровании данных. Другая важнейшая группа функций API - это работа с памятью ключа и выполнения операций чтения/записи. Использование функций API - это довольно мощный механизм защиты. Программа может осуществлять вызовы функции обращения к ключу из многих мест и результаты могут быть разбросаны по всему телу программы и хорошо замаскированы. С другой стороны, встраивание вызовов API требует некоторых усилий при программировании и модернизации программы, и чем лучше разработчик программного обеспечения хочет защитить свою программу, тем больше усилий и времени ему придется затратить.
Все производители электронных ключей поставляют библиотеки функций API для различных языков программирования, компиляторов, линкеров, платформ и систем. Для каждой из функций, как правило, приводится пример ее использования и тестовая программа. Но все же использование API не ограничивается только задачей обеспечения защиты. Основное ее назначение - это предоставление разработчику программ комплекса гибких технологий, позволяющих решить ряд важных маркетинговых проблем, что особенно актуально на белорусском рынке. В зависимости от схемы маркетинга, программа может быть защищена с различной глубиной. При этом могут быть использованы различные уровни проверок. Поэтому потенциально, с использованием функций API, можно построить защиту приложения неограниченной стойкости. Однако процедуры работы с ключом, которые вызываются из основной программы, являются "низкоуровневыми", что позволяет взломщику выделить их из общей логической структуры приложения и нейтрализовать.
Мы рассмотрели то, что касается метода защиты программ с помощью электронного ключа. Но вы ведь знаете, что если есть защита, то наверняка есть и способ ее преодоления и таких (общих) способов относительно взлома электронного ключа несколько.
Эмуляция ключа. Этот метод взлома ключа является наиболее очевидным, но и наиболее трудоемким. Алгоритм взлома состоит в том, что с помощью определенных программно-аппаратных средств снимается протокол обмена программы и ключа и сохраняется в файле. Далее полученная информация анализируется взломщиком и на ее основе создается эмулятор ключа. В зависимости от способностей взломщика, эмулятор может быть программным и аппаратным. Программный реализуется в виде драйвера защищенного режима, который перехватывает операции обращения к портам ввода/вывода и передает программе те данные, которые она должна считать из порта. При этом, очевидно, эмулятор должен распознавать команды обращения именно к ключу, игнорируя обращения к различным внешним устройствам. Аппаратный же эмулятор представляет собой электронное устройство, которое генерирует такие же выходные значения, как и электронный ключ.
Взлом с использованием отладчика. Этот вид взлома является наиболее распространенным. Суть его состоит в том, что взломщик, используя отладчик, анализирует работу программы и в первую очередь ее защитных механизмов. Найдя места, где осуществляется проверка значений, полученных из ключа и принятие решения о дальнейшем выполнении приложения, он изменяет код таким образом, что приложение выполняется вне зависимости от наличия ключа. Традиционно тут использовались отладчики: DOS Debug, AFD, Turbo Debugger, однако в настоящее время большей популярностью в хакерских кругах пользуются отладчики защищенного режима, работающие в качестве супервизоров режима V86 и предоставляющие гораздо больше возможностей. К ним, в частности, можно отнести SoftICE, WinICE, Turbo Debugger/386.
Эмуляторы процессора. В данную группу входят средства, эмулирующие саму аппаратную среду процессоров 80х86 и периферийного оборудования. Кроме собственного эмулятора, в состав таких средств входят подсистемы отладки, реализующие все функции отладчиков. Эмуляторы процессора могут быть как программными, так и аппаратными. Таким образом, программа получает полную иллюзию работы на обычном процессоре и не может определить, что, кроме процессора, существует еще и подсистема отладки. Данные средства взлома предоставляют наибольшую опасность для защитных механизмов, поскольку их наличие определить невозможно. Тем не менее, эти средства не получили широкого применения у взломщиков.
Павел БЫЛЬ,
byll@saltus.belpak.minsk.by
Горячие темы