WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 | 2 || 4 | 5 |

«ДМИТРИЙ И ВЗЛОМА ИНФОРМАЦИИ САНКТ-ПЕТЕРБУРГ 2004 Содержание Посвящается 1 Введение 3 ЧАСТЬ I. КОМУ НУЖНА ЗАЩИТА? 5 Глава ]. Общие сведения о защите информации 7 1.1. Что и от чего защищать 7 1.1.1. ...»

-- [ Страница 3 ] --

Часть III. Как не надо защищать программы А дальше выполняется 17 чтений блоков со случайными номерами с целью измерения 16 интервалов времени. Если все интервалы хорошо (с малыми отклонениями) укладываются в формулу (2), то диск признается подлин ным. Если же отклонения от ожидаемых величин превышают некоторое по роговое значение, то проводится повторное вычисление скорости вращения и повторное измерение задержек между чтением блоков по 8 секторов.

11.3.4. Способ обхода защиты Чтобы заставить StarForce поверить, что в приводе стоит оригинальный диск, надо совсем не много: чтобы задержки между чтениями соответство вали ожидаемым. А для этого необходимо знать точные характеристики диска: радиус, на котором начинается спираль, и размер сектора. Для опре деления этих величин можно провести те же самые измерения, что прово дит StarForce при проверке диска, а затем варьировать начальный радиус и размер сектора, пока не будут найдены оптимальные значения. Критерием оптимальности, например, может служить сумма отклонений разностей уг лов, вычисленных по формуле и углов, полученных из замеренных ин тервалов времени по формуле, обратной (2).

Современное оборудование (во всяком случае, оборудование бытового клас са) действительно не позволяет создавать копии защищенного диска, но на писание эмулятора, способного StarForce, не представляет сверх сложной задачи. Достаточно перехватывать обращения к драйверу CD-ROM и в случае, если выполняется команда чтения, делать задержку, какую мог бы иметь оригинальный диск, и только после этого возвращать управление вызывающей программе.

В качестве практической демонстрации возможности эмуляции был разрабо тан драйвер, функционирующий под операционной системой Windows 2000 и выполняющий описанные выше действия. Когда драйвер загружен, StarForce оказывается не в состоянии отличить подделку от оригинала. Игра стабильно запускается практически с любой копии оригинального диска, с виртуального диска, созданного программой Daemon Tools, и даже с дис ков, которые похожи на оригинальный только тем, что имеют правильную метку тома и размер области данных не менее 350 Мбайт, чтобы существо вали сектора с запрашиваемыми номерами.

Резюме по защите StarForce StarForce, несомненно, является неординарной защитой. Ее исключитель ность заключается хотя бы в том, что до сих пор не существует надежного способа быстро создавать работоспособные копии защищенных дисков.

Глава Привязка к носителям информации Однако проведенное исследование показывает, что для эмуляции защищен ного диска нужно совсем немного.

Примерно через 3 месяца после выполнения работы, результаты которой были приведены ранее, компания Protection Technology объявила о выпуске следующей версии своей системы защиты — StarForce Professional 3.0. Раз работчики утверждают, что одно из многочисленных улучшений заключает ся как раз в усилении противодействия эмуляции компакт-дисков.

Кстати, вскоре после появления StarForce 3.0 буквально в течение одного месяца авторы как минимум трех эмуляторов компакт-дисков объявили о том, что новые версии их программ способны эмулировать диски, защи щенные StarForce версий 1 и 2. С тех пор прошло больше года, но поддерж ка StarForce 3.0 так и не появилась ни в одном из эмуляторов. Так что по состоянию на сегодняшний день, компакт-диски, защищенные при помощи StarForce, продолжают оставаться устойчивыми к взлому.

паратные ключи защиты лет на рынке средств защиты программ от несанкционирован присутствуют так называемые аппаратные ключи защиты ;

les). Разумеется, компании, продающие такие устройства, если не как панацею, то уж как надежное средство противодействия пиратству. Но насколько серьезным препятствием могут аппаратные ключи?

. Классификация ключей )атные ключи защиты можно пытаться классифицировать по несколь ризнакам.

рассматривать возможные типы подключения, то бывают, например, на порт принтера (LPT), последовательный порт USB-порт и подключаемые к специальной плате, вставляемой внутрь компьютера.

при сравнении ключей анализировать удобство и функциональность программного обеспечения. Например, для некоторых се в аппаратных ключей разработаны автоматические протекторы, позво ие защитить программу "за один клик", а для некоторых такие протек отсутствуют.

интерес представляет список языков программирования, для ых разработчик ключей предоставил библиотеки и примеры. Поддерж (доступ к API ключа из определенной среды) нужна для того, программист смог более эффективно использовать ключ для защиты программы.

также список аппаратных платформ и операционных систем, для ко поддерживается интерфейс с ключом.

"орых может заинтересовать применимость ключа для сетевого лицен ания программного обеспечения.

134 Часть III. Как не надо защищать программы Однако все сказанное о ключах относится скорее к маркетингу, чем к защи те информации. Для защиты не важно, какого цвета корпус у ключа и на каком языке можно читать документацию. А по-настоящему важно только то, что в ключе является секретным и неповторимым и способно ли это "нечто" обеспечить необходимый уровень защиты.

Поэтому в дальнейшем ключи рассматриваются исключительно как аппа ратные устройства, работающие в определенных условиях и имеющие неко торую функциональность. Полезными признаются только те функции, ко торые невозможно реализовать чисто программными средствами и для которых не существует эффективной атаки.

Будем исходить из предположения, что у противника есть физический дос туп к ключу, а основная задача заключается в том, чтобы за разумное время получить копию программы, функционирующую в отсутствие ключа точно так же, как при его наличии.

Рассматривать атаки на систему, в которой не хватает некоторых узлов, не обходимых для работы, особого смысла нет — если зашифровать программу и не сообщить противнику ключ шифрования, легко получить высокую стойкость и без применения аппаратных ключей. Только это уже нельзя на зывать защитой от копирования.

Модификация кода и эмуляция Для того чтобы заставить программу работать так, как она работала бы с ключом, можно или внести исправления в программу, или эмулировать наличие ключа. Модификация программы, как правило, возможна лишь в тех случаях, когда ответы, полученные от ключа, просто проверяются, но не являются математически необходимыми для обеспечения работоспособ ности программы. Но это значит, что ключ, по большому счету, не требует ся для достижения полной функциональности. Такое случается, когда про грамма не использует всех возможностей ключа или когда возможности ключа очень ограничены.

При эмуляции никакого воздействия на программу не происходит, т. е., на пример, не нарушается контрольная сумма исполняемых модулей. И пол ный эмулятор, если его удается построить, просто повторяет все поведение реального ключа.

Не вдаваясь очень глубоко в технические подробности, будем исходить из предположения, что у противника есть следующие возможности:

• перехватывать все обращения к ключу;

протоколировать и анализировать эти обращения;

Глава 12. Аппаратные ключи защиты посылать запросы к ключу;

• получать ответы от ключа;

протоколировать и анализировать эти ответы;

посылать ответы от имени ключа.

Такие широкие возможности противника можно объяснить тем, что в его распоряжении есть вся та информация, какая есть и у программиста, защи щающего программу с помощью аппаратного ключа. То есть противник имеет доступ ко всем открытым интерфейсам, документации, драйверам и может их анализировать на практике с привлечением любых средств. Следо вательно, можно предположить, что противник со временем научится пол ностью контролировать протокол, по которому происходит обмен информа цией между прикладной программой и ключом. Контроль может осуществляться на любом уровне, но чаще всего запросы перехватываются при передаче данных между программой и драйвером ключа.

Однако стоит учитывать, что возможность эмуляции еще не означает, что противник способен вычислять правильные ответы на любые запросы, ко торые посылает ключу программа.

12.3. Ключи с памятью Это, наверное, самый простой тип ключей. Ключи с памятью имеют опре деленное число ячеек, из которых разрешено считывание. В некоторые из этих ячеек также может производиться запись. Обычно в ячейках, недоступ ных для записи, хранится уникальный идентификатор ключа.

Когда-то давно существовали ключи, в которых перезаписываемой памяти не было вообще, а программисту для считывания был доступен только иден тификатор ключа. Но очевидно, что на ключах с такой функциональностью построить серьезную защиту просто невозможно.

Правда, и ключи с памятью не способны противостоять эмуляции. Доста точно один раз прочитать всю память и сохранить ее в эмуляторе. После этого правильно эмулировать ответы на все запросы к ключу не составит большого труда.

Таким образом, аппаратные ключи с памятью в заданных условиях не спо собны дать никаких преимуществ по сравнению с чисто программными системами.

12.4. Ключи с неизвестным алгоритмом Многие современные аппаратные ключи содержат секретную функцию пре образования данных, на которой и основывается секретность ключа. Иногда 136 Часть III. Как не надо защищать программы программисту предоставляется возможность выбрать константы, являющие ся параметрами преобразования, но сам алгоритм остается неизвестным.

Проверка наличия ключа должна выполняться следующим образом. При разработке защиты программист делает несколько запросов к алгоритму и запоминает полученные ответы. Эти ответы в какой-то форме кодируются в программе. Во время выполнения программа повторяет те же запросы и сравнивает полученные ответы с сохраненными значениями. Если обнару живается несовпадение, значит, программа получает ответ не от оригиналь ного ключа.

Эта схема имеет один существенный недостаток. Так как защищенная програм ма имеет конечный размер, то количество правильных ответов, которые она может хранить, также является конечным. А это значит, что существует воз можность построения табличного эмулятора, который будет знать правильные ответы на все запросы, результат которых может проверить программа.

В рекомендациях по защите программ с помощью аппаратных ключей да ются советы, как сделать фиктивные запросы со случайными данными так, чтобы затруднить построение эмулятора. Однако если программа при запус ке делает 100 запросов, результат которых может быть проверен, и 100 слу чайных запросов, результат которых не проверяется, то, запустив программу 10 раз, очень легко выделить действительные запросы, повторившиеся 10 раз, и отсечь все фиктивные, встретившиеся по 1—2 раза.

Конечно, не стоит всегда проверять наличие ключа выполнением одной и той же серии запросов с проверкой. Лучше выполнять проверки в разных частях программы и в разное время. Это может значительно усложнить сбор статистики для отсечения фиктивных запросов.

Но не стоит забывать, что противник может проанализировать программу и попытаться в дизассемблере найти все обращения к ключу. Это поможет ему выяснить, ответы на какие из запросов проверяются, и построить ком пактную таблицу для эмуляции.

Так что ключи с неизвестным алгоритмом могут затруднить, но не могут предотвратить построение эмулятора для конкретной версии конкретной программы. Зато при переходе к новой версии, если перечень проверяемых программой ответов на запросы будет изменен, противнику придется заново выполнять сбор статистики или анализ программы.

Атрибуты алгоритмов В некоторых ключах алгоритму могут сопутствовать дополнительные атри буты. Так, например, в ключах Sentinel SuperPro алгоритм может быть за щищен паролем и начинает работать только после того, как будет выполне Глава 12. Аппаратные ключи защиты на активация, в ходе которой правильный пароль должен быть передан ключу.

Активация позволяет разработчику предусмотреть возможность изменения функциональности ключа на стороне пользователя. То есть программа мо жет иметь несколько версий (например базовую, расширенную и профес сиональную), и в ключе изначально активированы только те алгоритмы, ко торые необходимы для функционирования базовой версии. Если же пользователь решит перейти к более полной версии, разработчик пришлет ему инструкции по активации алгоритмов, соответствующих расширенной или профессиональной версии.

Однако все достоинства алгоритмов, активируемых по паролю, опираются на секретность пароля, а не на свойства аппаратного ключа. Следовательно, ана логичная защита может быть реализована чисто программными средствами.

Другой тип атрибутов алгоритмов, поддерживаемых ключами Sentinel Pro, — это счетчики. С активным алгоритмом может быть связан счетчик, изначально имеющий ненулевое значение. Программа при каждом запуске (или выполнении определенной операции, например при экспорте данных) вызывает специальную функцию API-ключа, уменьшающую значение счет чика на единицу. Как только счетчик принимает нулевое значение, алго ритм деактивируется и перестает работать.

Однако данная схема не способна помешать применению эмулятора. Про тивник может перехватывать и предотвращать все попытки уменьшения значения счетчика. Следовательно, алгоритм никогда не будет деактивиро ван, и в распоряжении противника будет неограниченное время для сбора данных, необходимых для табличной эмуляции.

Противостоять эмуляции может счетчик, значение которого уменьшается при каждом обращении к алгоритму. Но в этом случае возникает опасность, что из-за сбоев в работе программы или операционной системы иногда зна чение счетчика будет уменьшаться без совершения программой полезных Действий. Причина проблемы в том, что обращение к алгоритму должно производиться до того, как программа совершит полезную работу, а счетчик Должен уменьшаться только в том случае, если работа выполнена успешно.

Но автоматическое уменьшение счетчика при обращении к алгоритму такую Функциональность не обеспечивает — количество оставшихся попыток Уменьшается независимо от успеха выполненной операции.

Ключи с таймером Некоторые производители аппаратных ключей предлагают модели, имею встроенный таймер. Но для того чтобы таймер мог работать в то время, Часть III. Как не надо защищать программы когда ключ не подключен к компьютеру, необходим встроенный источник питания. Среднее время жизни батареи, питающей таймер, составляет 4 го да, и после ее разрядки ключ перестанет правильно функционировать. Воз можно, именно из-за сравнительно короткого времени жизни ключи с тай мером применяются довольно редко.

Но как таймер может помочь усилить защищенность?

Ключи HASP Time предоставляют возможность узнавать текущее время, ус тановленное на встроенных в ключ часах. И защищенная программа может использовать ключ для того, чтобы отследить окончание тестового периода.

Но очевидно, что эмулятор позволяет возвращать любые показания таймера, т. е. аппаратная часть никак не повышает стойкость защиты.

Хорошей комбинацией является алгоритм, связанный с таймером. Если ал горитм может быть деактивирован в определенный день и час, очень легко будет реализовывать демонстрационные версии программ, ограниченные по времени.

Но, к сожалению, ни один из двух самых популярных в России разработчи ков аппаратных ключей не предоставляет такой возможности. Ключи HASP, производимые компанией Aladdin, не поддерживают активацию и деактива цию алгоритмов. А ключи Sentinel разработанные в Rainbow Technologies, не содержат таймера.

12.7. Ключи с известным алгоритмом В некоторых ключах программисту, реализующему защиту, предоставляется возможность выбрать из множества возможных преобразований данных, реализуемых ключом, одно конкретное преобразование. Причем подразуме вается, что программист знает все детали выбранного преобразования и мо жет повторить обратное преобразование в чисто программной системе.

Например, аппаратный ключ реализует симметричный алгоритм шифрова ния, а программист имеет возможность выбирать используемый ключ шиф рования. Разумеется, ни у кого не должно быть возможности прочитать зна чение из аппаратного ключа.

В такой схеме программа может передавать данные на вход аппаратного ключа и получать в ответ результат шифрования на выбранном ключе.

Но тут возникает дилемма. Если в программе отсутствует ключ шифрова ния, то возвращаемые данные можно проверять только табличным спосо бом, а значит, в ограниченном объеме. Фактически имеем аппаратный ключ с неизвестным программе алгоритмом. Если же ключ шифрования известен программе, то можно проверить правильность обработки любого объема данных, но при этом существует возможность извлечения ключа шифрова Глава 12. Аппаратные ключи ния и построения эмулятора. А если такая возможность существует, против ник обязательно попытается ею воспользоваться.

Так что аппаратное выполнение симметричного алгоритма шифрования с известным ключом не дает ничего нового с точки зрения защиты. Но есть еще и асимметричные алгоритмы.

Когда ключ реализует асимметричный алгоритм шифрования, программисту не обязательно знать используемый секретный ключ. Даже можно сказать, что отсутствие возможности создать программную копию аппаратного асимметричного шифрующего устройства не сужает, а расширяет область возможных применений, т. к. сокращается перечень возможных способов компрометации секретного ключа. В любом случае, для проверки того, что аппаратный ключ присутствует и правильно выполняет вычисления, доста точно знать открытый ключ.

Эта схема не может быть обойдена только эмуляцией, т. к. для построения полного эмулятора требуется по открытому ключу шифрования вычислить секретный ключ. А это математически сложная задача, не имеющая эффек тивного решения.

Но у противника остается возможность подмены открытого ключа в про грамме, и если такая подмена пройдет незамеченной, построить программ ный эмулятор не составит труда. Так что асимметричные алгоритмы, реали зованные на аппаратном уровне, способны обеспечить некопируемость защищенной программы, но только в том случае, если удастся предотвра тить подмену открытого ключа шифрования.

12.8. Ключи с программируемым алгоритмом Очень интересным решением с точки зрения стойкости защиты являются аппаратные ключи, в которых может быть реализован произвольный алго ритм. Сложность алгоритма ограничивается только объемом памяти и сис темой команд ключа.

В этом случае для защиты программы важная часть вычислений переносит ся в ключ, и у противника не будет возможности запротоколировать пра вильные ответы на все запросы или восстановить алгоритм по функции проверки. Ведь проверка, как таковая, может вообще не выполняться — ре зультаты, возвращаемые ключом, являются промежуточными величинами в вычислении какой-то сложной функции, а подаваемые на вход значения зависят не от программы, а от обрабатываемых данных.

Главное — это реализовать в ключе такую функцию, чтобы противник не смог по контексту догадаться, какие именно операции производятся в ключе.

140 Часть III. Как не надо защищать программы 12.9. Что происходит на практике На практике в подавляющем большинстве случаев программисты не исполь зуют все возможности, предоставляемые аппаратными ключами. Так, на пример, очень часто в алгоритмических ключах с памятью используется только память, не говоря уже о случаях, когда все проверки наличия ключа производятся в одной функции, которая возвращает результат в виде логи ческого значения. И для получения полнофункциональной версии програм мы даже не требуется ключ— достаточно исправить функцию проверки, чтобы она всегда возвращала состояние, соответствующее наличию ключа.

Некоторые ключи (например Sentinel SuperPro) имеют довольно сложную систему разграничения доступа. Ключи Sentinel SuperPro поддерживают па роли для активации алгоритмов, выбираемые при программировании, и раз дельные пароли для записи и перезаписи, одинаковые для всех ключей од ной серии, поставляемых одному разработчику. И очень часто в теле программы оказывается пароль перезаписи, который позволяет противнику перепрограммировать ключ по своему усмотрению.

Ключи HASP Time, напротив, не имеют разграничения доступа — для того чтобы изменить время в ключе, нужно знать те же самые пароли, которые используются для чтения времени. То есть противнику для продления пе риода работоспособности программы, ограниченной по времени, достаточно отвести назад часы в ключе, и ничто не мешает ему это сделать.

Некоторые неизвестные алгоритмы, реачизованные в ключах, были подверг нуты анализу. Так был восстановлен алгоритм функции используе мой в ключах HASP. А по некоторым сообщениям в Интернете, не являются больше секретными и реализуемые ключами Sentinel SuperPro, и даже новые алгоритмы кодирования и декодирования в ключах HASP4.

Ключи с асимметричными алгоритмами выпускаются уже многими произ водителями, но позиционируются как устройства для идентификации и ау тентификации, а не для защиты информации.

А ключи с программируемым алгоритмом, напротив, не выпускаются круп нейшими производителями ключей и, следовательно, практически не при меняются. Возможно, это обусловлено тем, что они получаются слишком дорогими или слишком сложными для использования.

Выводы о полезности аппаратных ключей Утверждение, что аппаратные ключи способны остановить компьютерное пиратство, является мифом, многие годы распространяемым производите Глава 12. Аппаратные ключи защиты лями ключей. Для хорошо подготовленного противника ключ редко являет ся серьезным препятствием.

К тому же, часто программисты слепо доверяют автоматизированным сред ствам защиты, поставляемым в составе SDK-ключа, и не прикладывают са мостоятельных усилий для усиления защиты. Обещания производителей создают иллюзию защищенности, но на самом деле практически для всех автоматизированных средств защиты давно разработаны эффективные спо собы нейтрализации защитных механизмов.

Большая часть защитных механизмов, применяемых в современных ключах, оказывается работоспособной только в предположении, что противник не сможет обеспечить эмуляцию ключа, т. е. реализуются на программном уровне. Следовательно, почти всегда тот же уровень защиты может быть достигнут без привлечения аппаратных средств.

тесных защит из популярных способов защиты программ является использование называемых протекторов — программных инструментов, предназначен. для зашиты других программ.

сценарий установки защиты следующий. Разработчик создает про продукт с использованием некоторых программных средств: ви сред, компиляторов и т. д. После того как получен работающий олняемый файл, этот файл обрабатывается с помощью программы тектора и создается новый исполняемый файл, в котором реализованы аторые средства защиты.

.1. Какую защиту еспечивают протекторы прежде всего, защищают программу от исследования. Исследо > можно различные области программы, но наиболее часто проводится кода, причем с совершенно разными целями. Исследование а вируса может проводиться с целью определения методов заражения и вакцины. Исследование кода операционной системы помогает уязвимости, а также писать приложения, взаимодействующие системой на более низком уровне. Программы исследуются елью обнаружения недокументированных возможностей, а иногда для алгоритма, по которому программа функционирует. Суще 'ют и другие причины для исследований.

асти ресурсов и данных также могут содержать некоторую интересную поэтому часто защите подвергают не только код программы, данные с ресурсами.

[ако защищать абсолютно все ресурсы не совсем правильно. Дело в том, основная часть ресурсов должна быть доступна только в момент выпол ия программы, и такие ресурсы можно безбоязненно защищать. Но есть 144 Часть III. Как не надо защищать программы некоторое количество ресурсов, например информация о версии программы и ее иконка, которые могут использоваться операционной системой тогда, когда программа не запущена. И эти ресурсы в защищенной программе должны оставаться в открытом виде.

То же самое относится и к некоторым служебным структурам данных, хра нящимся внутри программы и использующимся в процессе загрузки. Если эти структуры будут недоступны операционной системе, защищенную про грамму не удастся запустить.

Многие протекторы содержат средства, позволяющие создавать версии с ограничениями. Например, защищенная программа может прекратить ра ботать через заданный промежуток времени, если не будет введен правиль ный регистрационный код или до ввода кода будет регулярно появляться окно с напоминанием о том, что программа не зарегистрирована, и с пред ложением приобрести лицензию.

Наиболее продвинутые протекторы имеют программные интерфейсы (API), доступные из защищаемой программы и позволяющие более четко контро лировать ее выполнения. Очень часто API используется для дина мической разблокировки фрагментов кода, которые должны быть доступны только в зарегистрированной версии.

Как работают протекторы Для того чтобы защитить исполняемый файл, протектор должен каким-то образом преобразовать его содержимое и добавить свой код, отвечающий за правильную загрузку измененной программы в память.

Практически для всех форматов исполняемых файлов были разработаны алго ритмы, позволяющие добавлять новый код таким образом, чтобы он выпол нялся до основной программы, не нарушая при этом ее функциональности.

Скорее всего, основные исследования в этой области были выполнены авторами вирусов, т. к. добавление тела вируса к программе является одним из основных методов заражения.

Код, данные и. ресурсы обычно защищаются с помощью шифрования. Исполь зуемый алгоритм не обязательно должен быть криптографически стойким, т. к.

ключ шифрования все равно невозможно сохранить в абсолютной тайне. Очень часто до шифрования применяется сжатие данных, что позволяет компенсиро вать увеличение размера исполняемого файла, происходящее вследствие добав ления кода протектора. А иногда результирующий защищенный файл даже уменьшается в размере по сравнению с исходным файлом.

При запуске защищенной программы управление сразу получает код про тектора, который выполняет предусмотренные проверки и расшифровывает Глава 13. навесных защит памяти все необходимые области, а также проводит настройку таблицы адресов импортируемых функций. После успешного завершения процедуры настройки протектор передает управление на оригинальную точку входа (Original Entry Point, и начинается выполнение основной программы.

Проверки, выполняемые протектором до начала работы программы, могут быть разного рода. Это могут быть проверки, касающиеся наличия лицен зии (чтобы без лицензии программа просто не запускалась) или сравнения текущей даты со значением, после которого программа должна перестать работать, а также попытки определить наличие запущенного отладчика.

Сценарии атаки Итак, чаще всего защищенная программа отличается от незащищенной по следующим параметрам:

• код самой программы зашифрован;

адрес оригинальной точки входа известен только протектору;

основная часть ресурсов зашифрована;

• основная часть данных зашифрована;

таблицы импорта недоступны (настройку импорта выполняет сам протек тор, и только он знает, какие функции должны быть импортированы);

• присутствует код протектора.

Для того чтобы обезвредить (удалить) протектор и реконструировать про грамму к виду, максимально близкому к незащищенному, человеку, кото рый пытается снять защиту, необходимо решить следующие задачи:

получить расшифрованный код программы;

О найти адрес оригинальной точки входа;

получить расшифрованные ресурсы;

получить расшифрованные данные;

определить все импортируемые программой функции и восстановить таблицы импорта;

код протектора.

Для большинства существующих протекторов разными людьми в разное время были разработаны эвристики, позволяющие успешно решить все или почти все эти задачи.

Так, например, код обычной программы не должен изменяться в процессе выполнения. Следовательно, после того, как протектор передал управление защищенной программе, и до ее завершения код представлен в памяти 146 Часть III. Как не надо защищать программы в таком же виде, как и у незащищенной программы. То есть для восстанов ления оригинальной секции кода достаточно извлечь ее из памяти после того, как программа была запущена. В современных версиях Windows для этого очень хорошо подходит стандартная функция Win32 API, носящая на звание Найти адрес оригинальной точки входа несколько сложнее. Но, имея в рас поряжении расшифрованную секцию кода, можно получить очень много информации, позволяющей эффективно решить эту задачу. По секции кода довольно легко можно определить, в какой среде разработки создана про грамма и каким компилятором она собрана. А наличие такой информации значительно упрощает отыскание оригинальной точки входа. Так, например, характерной особенностью программ, собранных с помощью Borland C++ Builder, является то, что точка входа находится в самом начале секции кода.

А точка входа в программы, собранные в Borland Delphi, напротив, соответ ствует началу функции, которая расположена в самом конце секции кода.

Также в графических (не консольных) приложениях одной из первых вызы ваемых функций Win32 API т. к. значение, воз вращаемое ЭТОЙ функцией, ДОЛЖНО быть В с которой начинаются почти все Таким образом, если каким-нибудь способом удастся узнать, с какого адреса происходит вызов GetModuieHandie, оригинальная точка входа с большой вероятностью будет где-то неподалеку.

Есть и другой способ выявления оригинальной точки входа. Он заключается в том, чтобы в момент, когда протектор уже расшифровал секцию кода, но еще не передал в нее управление, с помощью функции заполнить всю секцию кода байтами со значением ОхСС (что соответствует команде процессора — вызов отладочного прерывания). Разумеется, такой код не может выполняться, о чем операционная система и известит пользователя. А в некоторых случаях (в частности, под Windows NT, 2000 и еще и сообщит адрес, по которому произошла ошибка. Этот адрес и будет адресом оригинальной точки входа. Данный метод известен со времен DOS, где он использовался, в частности, для поиска оригиналь ных точек входа в прерывания.

Кстати, во времена DOS также существовали упаковщики и протекторы ис полняемых файлов, и для противодействия им разрабатывались автоматиче ские депротекторы. Фактически, труднее всего автоматизации поддавалась именно задача поиска оригинальной точки входа. И существовал депротек тор, носивший название Intruder (вторгающийся), который умел в процессе запуска программы определять, каким компилятором она была создана, и, исходя из этого, вычислял правильный адрес точки входа. Intruder "знал" практически все распространенные в то время средства разработки и в по Глава 13. Использование навесных защит большинстве случаев успешно навесную защиту в авто матическом режиме.

С извлечением ресурсов больших проблем обычно не возникает. Протектору приходится расшифровывать и настраивать ресурсы в памяти таким обра зом, чтобы функции Win32 API, отвечающие за доступ к ресурсам, могли нормально работать. Следовательно, действуя точно так же, как действуют функции Win32 API, из загруженной в память программы можно извлечь каждый ресурс в отдельности, и тогда для восстановления секции ресурсов останется только построить дерево ресурсов (в соответствии со специфика цией формата Portable Executable).

Данные программы могут изменяться в процессе выполнения. Следователь но, для получения неискаженных секций данных необходимо читать их из памяти процесса именно в тот момент, когда протектор передает управление основной программе. Если оригинальная точка входа известна, определение такого момента не составит большого труда. Для этого можно использовать отладочные регистры центрального процессора.

Начиная с Intel 80386 все процессоры семейства х86 имеют аппаратные средства для отладки приложений. Процессор позволяет использовать до 4-х аппаратных точек останова. Каждая точка описывается типом доступа, который будет отслеживаться процессором (чтение, запись, выполнение), адресом, при обращении по которому процессор сгенерирует исключение, и размером контролируемой области (BYTE, WORD, ДЛЯ работы с аппа ратными точками останова используются так называемые отладочные реги стры, которые в системе команд х86 имеют логические имена, начинающие ся с DR (Debugging Registers). Достаточно установить точку останова на исполнение кода по адресу, соответствующему найденной оригинальной точке входа, обработать генерируемую процессором исключительную ситуа цию и прочитать содержимое памяти.

Регистры аппаратной отладки не доступны напрямую пользовательским программам, т. к. операции чтения и записи отладочных регистров являются привилегированными и разрешены только в режиме ядра (в драйверах).

Но к содержимому этих регистров можно получить доступ несколькими способами и без драйвера.

Во-первых, содержимое всех регистров в каком-то потоке может быть полу чено и установлено через такие функции Win32 API, как и Перед обращением к контексту потока рекомендуется остановить поток функцией а по окончании манипуляций С КОНТеКСТОМ его ВНОВЬ ПОМОЩИ Во-вторых, существует подмножество Win32 API, называемое Debugging API (программный интерфейс отладки). С помощью функций, входящих в со 148 Часть III. Как не надо защищать программы став Debugging API, очень просто написать собственный отладчик, который будет получать извещения обо всех важных событиях и исключениях, воз никающих в отлаживаемой программе. И отладчик также может использо вать И ДЛЯ К ОТЛадоч ным регистрам.

И наконец, в-третьих, изнутри программы доступ к отладочным регистрам может быть осуществлен путем использования механизма структурирован ной обработки исключений — Structured Exception Handling (SEH). Доста точно установить свой обработчик исключения и выполнить заведомо не правильную операцию (например обращение по адресу 0x00000000). При возникновении ошибки будет вызван обработчик исключения, которому операционная система передаст указатель на структуру контекста потока, содержащую значение всех регистров. При этом значения, которые окажут ся в этой структуре после завершения обработчика исключения, будут зане сены в соответствующие регистры центрального процессора, включая отла дочные.

Самую значительную трудность при снятии защиты, наверное, представляет собой восстановление таблиц импорта. Однако и эта задача может быть ус пешно решена.

Следует отметить, что большинство протекторов оставляют в защищенной программе таблицу импорта, содержащую как минимум по одной импорти руемой функции из каждой библиотеки, использованной в оригинальной программе, иначе загрузчик, являющийся частью операционной системы, вообще не отобразит библиотеку в адресное пространство процесса. Это по зволяет легко определить точный список библиотек, из которых импорти руются функции. В крайнем случае, если перечень импортируемых библио тек получить не удалось, существует возможность узнать, какие вообще библиотеки были подключены к процессу. Это будут все библиотеки, на ко торые есть ссылки в таблицах импорта незащищенной программы, и неко торое количество других библиотек.

После того как все используемые динамические библиотеки оказались ото бражены в адресное пространство программы, можно получить адрес каж дой экспортируемой функции для всех необходимых библиотек.

Теперь остается только найти в оперативной памяти, принадлежащей про грамме, расположение таблицы адресов импортированных функций и опре делить размер этой таблицы.

После загрузки и настройки программы в памяти таблица адресов импорти руемых функций имеет обычно следующий вид. Сначала идут несколько 32-битовых значений, являющихся адресами функций, импортируемых из первой библиотеки. Последовательность указателей, относящаяся к первой 'лава 13. Использование навесных защит даблиотеке, заканчивается нулевым элементом. Сразу за ним идут указатели импортируемые функции второй библиотеки, которые снова заканчива нулем, и так далее для всех библиотек.

образом, следует искать последовательности 32-битовых значений, аканчивающиеся нулевым элементом, и все элементы последовательности совпадать с адресами функций одной из библиотек. Каждая такая будет относиться к одной из библиотек, а все последо ;

ательности вместе будут образовывать таблицу адресов импортируемых пункций.

связей (linker) обычно размещает таблицу адресов импортируемых в секции статических данных, так что имеет смысл начинать поиск [менно оттуда.

Тосле того как определены все функции, необходимо построить и осталь [ые таблицы, отвечающие за импорт, но это делается в соответствии со пецификацией формата переносимого исполняемого файла и очень легко втоматизируется.

самой последней задачи — удаление кода протектора — на самом еле не является необходимым для получения работоспособной восстановить зашифрованные секции, индексы ресурсов, таблицы им орта, найти точку входа и создать новый исполняемый файл, в котором удет присутствовать код протектора, он должен работать и так. Но, удалив од и данные, добавленные протектором, можно несколько сократить раз исполняемого файла.

3.4. Борьба технологий щиты и взлома азумеется, разработчики протекторов не хотят мириться с тем, что восста овить оригинальную программу так легко. И они всячески стремятся если е сделать восстановление невозможным, то хотя бы максимально услож ить этот процесс и, самое главное, предотвратить полную автоматизацию.

в том, что для использования автоматического не нужно ыть гением, достаточно иметь базовые знания. А вот деактивировать дейст серьезную навесную защиту могут буквально единицы — считан ые проценты от числа всех людей, серьезно занимающихся исследованием рограмм (Reverse Engineering), и тысячные доли процента от общего числа днако специалисты по исследованию программ тоже не хотят мириться тем, что протектор не удается быстро снять, и придумывают новые методы Часть III. Как не надо защищать программы обхода защиты. Такое неофициальное противостояние продолжается не пер вый год, и конца ему пока не видно. Но, похоже, именно это противостоя ние и стимулирует развитие протекторов. Иначе уровень технологических решений, используемых для защиты, остался на уровне, достигнутом еще в первых версиях протекторов.

Для того чтобы код (исполняемые инструкции) нельзя было прочитать из памяти после запуска программы, применяется шифрование отдельных уча стков кода с расшифровкой их непосредственно перед началом и зашиф ровкой сразу по окончании выполнения.

Одним из способов достижения такого поведения программы является ис пользование API протектора. То есть программист, разрабатывающий про грамму, которая позже будет подвергнута обработке протектором, ным образом описывает, какие области должны быть зашифрованы большую часть времени выполнения программы, и явным образом указыва ет, в какой момент должны производиться расшифрование фрагмента и его последующее зашифрование, обращаясь к API протектора.

Обычно эта схема применяется в сочетании с использованием регистраци онных кодов или лицензионных файлов. Пока пользователь имеет в своем распоряжении только незарегистрированную (ограниченную) версию про граммы, некоторые функции хранятся в зашифрованном виде и не могут быть выполнены. Если же пользователь приобретает лицензию на програм му и вводит правильный регистрационный код (или указывает расположе ние лицензионного файла), программа получает возможность расшифровать и выполнить зашифрованные фрагменты, обеспечив тем самым полную функциональность.

Другой способ защиты кода заключается в использовании особенностей рабо ты процессора. Можно модифицировать некоторые фрагменты программы таким образом, чтобы при передаче им управления возникали так называемые исключительные ситуации (Exception). Эти исключительные ситуации будут обработаны кодом протектора, который должен восстановить правильное со держимое модифицированного фрагмента кода, позволить ему выполниться, а затем снова привести к неработоспособному состоянию.

Для сокрытия адреса точки входа можно, например, первые несколько де сятков или сотен байт скопировать внутрь тела протектора и передать управление оригинальному коду программы уже после того, как часть ко манд была выполнена. В результате, некоторое количество команд, выпол няемых только один раз при старте программы, просто будут отсутствовать в коде программы.

Для программ, написанных с использованием "чистого" Win32 API (без биб лиотек типа Object Windows Library или Visual Components Library), Слава 13. Использование навесных защит окна часто подгружается в память неявно путем вызова функции ИЛИ При ЭТОМ сама а менеджер диалогов, являющийся частью операционной систе мы, читает ресурс, описывающий окно, и интерпретирует его, подгружая из ресурсов меню, картинки и т. д.

Однако некоторые средства разработки сохраняют описания диалогов в соб ственном формате и практически не полагаются на то, как работает с ресур сами менеджер диалогов, встроенный в Windows. Это характерно, например, для программ, созданных при помощи Borland Delphi или C++ Builder с ис пользованием библиотеки Visual Components Library' (VCL).

Ресурс, описывающий диалоговое окно в VCL, хранится как двоичный блок данных и Windows не пытается самостоятельно его читать и интер претировать. Поэтому протектор может модифицировать программу таким образом, чтобы ресурсы, описывающие диалоги, сохранялись в зашифро ванном виде и расшифровывались только в тот момент, когда программа обращается к VCL с запросом на загрузку диалога из ресурсов. Этот метод позволяет лучше защитить ресурсы, но, разумеется, применим далеко не ко всем программам.

С защитой данных можно поступать так же, как и с ресурсами, если извест ны особенности использованного компилятора и редактора связей. Очень многие программы, созданные в определенных средах разработки, начинают выполнение с одних и тех же действий. Протектор может определить, если защищаемая программа начинается именно с таких действий, и перенести их выполнение в тело протектора. Таким образом, к тому моменту как управление будет передано защищенной программе, протектор уже выпол нит часть настроек, но позаботится о том, чтобы программа их не выполня ла повторно. Следовательно, в оригинальной точке входа программа содер жит модифицированные данные, и получить на их основе работоспособную копию со снятой защитой будет проблематично.

Для защиты содержимого таблицы адресов импортируемых функций могут применяться весьма разнообразные подходы. Например, протектор может заполнить таблицу импорта ссылками на маленькие функции-переходники, расположенные в теле протектора. А каждый переходник будет передавать Управление нужной функции во внешней библиотеке. Как расширение этого метода, внутрь функции-переходника из библиотечной функции мо жет копироваться несколько первых инструкций, которые будут выполнять ся в теле протектора. Следовательно, управление будет передаваться не на Первую инструкцию библиотечной функции. Это не только затрудняет вос становление таблиц импорта, но и позволяет обойти точки останова, разме в начале библиотечных функций.

Часть III. Как не надо защищать программы Некоторые функции Win32 API во время выполнения процесса всегда воз врашают одно и то же значение. Примером такой функции Протектор может вызвать эту функцию до передачи ления основной программе и запомнить результат, а на запросы к GetcommandLine просто возвращать сохраненное значение. При этом дачи управления библиотечной функции вообще не происходит.

Наконец, в распоряжении разработчиков протектора есть довольно сложное в реализации, но очень эффективное средство — трансляция части инструк ций в псевдокод и выполнение этого псевдокода на встроенной виртуальной машине. То есть к моменту передачи в тело защищенной про граммы некоторые фрагменты кода, относящиеся или к самой программе, или к импортированным функциям, представлены не в системе команд процессора семейства х86, а в некотором альтернативном виде, и выполнить эти фрагменты кода может только протектор. Следовательно, для снятия защиты необходимо разобраться в системе команд виртуальной машины и перевести защищенные фрагменты из системы команд протектора в систему команд процессора х86, а это весьма трудоемкая задача.

Как уже упоминалось ранее, некоторые средства защиты имеют свой собст венный API, позволяющий защищаемой программе обращаться к протекто ру во время выполнения. Это способствует интеграции протектора с про граммой и создает очевидные трудности, связанные с необходимостью эмуляции протектора при снятии защиты.

Также разработчики некоторых протекторов предлагают тем, кто хочет за щищать свои программы, различные способы, помогающие установить факт, что с программы была снята защита. Эти способы могут являться ча стью API протектора, а могут и основываться на характерных признаках, которыми обладает защищенная программа после ее загрузки в память.

Очень многие протекторы усиленно препятствуют использованию средств отладки, включая отладочные регистры. Одним из методов, мешающих использованию аппаратных точек останова, является хранение промежу точных данных протектора в отладочных регистрах, следствием чего явля ется отказ в запуске программы, если содержимое отладочных регистров меняется извне.

Но, как уже было сказано выше, исследователи программ постоянно совер шенствуют методы атаки на протекторы, и если такие способы защиты, как виртуальная машина, способны противостоять автоматическим депротекто рам, то против ручной распаковки, наверное, не способен устоять ни один из существующих протекторов.

Глава 13. Использование навесных защит Несколько интересных протекторов В настоящий момент разработано достаточно большое число протекторов исполняемых файлов. Многие из них бесплатны и созданы энтузиастами, которым просто интересно попробовать свои силы в защите программ. Ра зумеется, есть и коммерческие протекторы. А некоторые протекторы явля ются составляющими частями более сложных комплексов, включающих в себя привязку к аппаратным ключам или компакт-дискам.

Рассмотрим основные характеристики нескольких наиболее интересных протекторов.

ASProtect Для защиты условно бесплатных программ чаще всего, наверное, применя ется ASProtect — протектор, разработанный Алексеем Солодовниковым.

ASProtect был чуть ли не первым серьезным протектором, сочетавшим в се бе основные функции, применяемые для защиты программ:

• работа с регистрационными кодами на базе RSA-1024;

поддержка "черного списка" регистрационных кодов;

ограничение периода работы пробной версии;

ограничение функциональности пробной версии;

• динамическое расшифрование фрагментов кода при наличии правиль ного регистрационного кода;

API для интеграции защищаемой программы с протектором;

оригинальные методы противодействия исследованию под отладчиком;

• оригинальные методы защиты от снятия протектора.

Однако благодаря огромной популярности ASProtect является и одним из самых хорошо изученных протекторов — почти для всех хитростей, приме няемых в ASProtect, разработаны или автоматические, или полуавтоматиче ские средства обхода.

Иногда у программ, защищенных ASProtect, возникают проблемы с работой под новыми версиями операционных систем, но автор не прекращает рабо ты по совершенствованию протектора и стремится оперативно исправлять все обнаруженные ошибки, а также добавлять новые защитные механизмы.

13.5.2. Armadillo Непривычный метод взаимодействия с защищаемой программой использует протектор, разработанный компанией The Silicon Realms Toolworks и нося 154 Часть III. Как не надо защищать программы щий название Armadillo. При запуске защищенная программа выполняется как 2 процесса. Первый процесс, в котором работает основной код протек тора, создает в режиме отладки второй процесс, содержащий собственно защищенную программу, и управляет его выполнением.

Протектор Armadillo применяет технологии, называемые и Nanomites, для защиты кода выполняемой программы от счи тывания из памяти. Технология CopyMemll уже хорошо изучена и легко обходится автоматическими депротекторами. Про существование автомата, способного обойти Nanomites, пока не известно, но были многочисленные сообщения о ручной распаковке программ, при защите которых использова лась эта технология.

Протектор Armadillo также включает в себя менеджер лицензий.

13.5.3. InterLok Протектор InterLok, разработанный компанией Anti-Piracy, имеет версии для Windows и Macintosh. Набор функций, предлагаемых протекто ром, вполне обычный: менеджер лицензий, демонстрационные версии, API для интеграции и т. д.

Версия для Windows устанавливает драйвер ядра, препятствующий отладке защищенного приложения и выполняющий часть проверок. Но, несмотря на наличие такого сложного элемента, как драйвер, защита исполняемого файла довольно слабая. Например, все секции шифруются потоковым шиф ром с одним и тем же ключом. Это приводит к тому, что если секция кода больше, чем любая другая секция, то можно прочитать из памяти запущен ной программы расшифрованную секцию кода, вычислить гамму, наклады ваемую при шифровании, и расшифровать все остальные секции файла, да же не прибегая к сложным инструментам. Драйвер практически не имеет защиты от исследования, а таблицы импорта вообще никак не защищены.

13.5.4. HASP Envelope В комплект разработчика, поставляемый вместе с ключами HASP, входит протектор HASP Envelope. Цель этого протектора — защитить программу от исследования и даже запуска при отсутствии аппаратного ключа Так как секретная функция, являвшаяся на протяжении многих лет сердцем ключей HASP, оказалась полностью раскрыта, не составляло большого тру да эмулировать ответы на запросы, которые Envelope делал к ключу. Следо вательно, любая программа, защищенная HASP могла быть запу щена без ключа.

Глава 13. Использование навесных защит С появлением ключей семейства HASP4, в которых используются новые И Envelope При отсутствии ключа стал невозможен. Но в протектор не способен обеспечить высокую стойкость защиты. И при наличии ключа получение незащищенной копии программы обычно не требует значительных усилий.

13.5.5. StarForce Одной из составляющих StarForce Professional (системы, разработанной компанией Protection Technology для защиты информации, распространяе мой на компакт-дисках) является протектор. В его функции входят проверка подлинности компакт-диска и запуск защищенной программы, но только в том случае, если введенный пользователем лицензионный код соответст вует установленному в приводе диску.

В StarForce применяется множество уникальных технологических решений.

Так, например, в защищенном исполняемом файле секция кода заполнена одними нулями, а код защиты выполняется из динамической библиотеки protect.dll, которая автоматически загружается и инициализируется при за пуске программы.

Большая часть защиты сосредоточена в драйвере, устанавливаемом в ядро операционной системы. Именно там идет проверка подлинности компакт диска. Сам драйвер также зашифрован с целью затруднения его исследо вания.

Часть защищаемой программы хранится в псевдокоде и выполняется на встроенной в протектор виртуальной машине.

Несмотря на то, что в Интернете можно найти подробные описания про цесса ручного снятия StarForce с некоторых программ, таких случаев крайне мало. Частично это может быть объяснено тем, что для исследова ния защиты необходимо наличие оригинального компакт-диска, а также тем, что основная категория продуктов, которые защищаются с помощью StarForce, — компьютерные игры. А взлом защиты игр экономически не очень выгоден, т. к. стоимость одной копии игры невелика, а период по пулярности весьма короток. Но надо отдать должное разработчикам — они неплохо потрудились.

В целом StarForce на сегодняшний день является одним из самых серьезных протекторов, который, к тому же, продолжает развиваться. Так недавно компания Protection Technology объявила о выходе StarForce Soft 3.0 — сис темы защиты от копирования, основанной на ядре StarForce Professional 3.0, но не использующей компакт-дисков.

III. Как не надо защищать программы Что плохого в протекторах Протекторы призваны обеспечить защиту содержимого исполняемого файла от исследования и модификации. Но часто получается, что защищенная программа по некоторым характеристикам оказывается для пользователя хуже, чем та же программа, но без защиты.

13.6.1. Расход памяти Прежде всего, протектор — это дополнительный объем кода. Если протек тор не поддерживает упаковку защищаемых данных, размер файла на диске в процессе защиты увеличится на размер самого протектора. Правда, стоит отметить, что при использовании сжатия защищенный файл может оказать ся меньше оригинального в несколько раз.

Также код протектора требует и некоторого количества оперативной памяти.

Но основной перерасход ресурсов оперативной памяти происходит по дру гой причине, связанной с особенностью загрузки исполняемых файлов в Win32.

Практически все современные операционные системы имеют встроенную поддержку так называемых файлов страничной подкачки (Page File или Swap File). Вся логическая память, доступная выполняемым программам, разбивается на страницы, и некоторые редко используемые страницы мо гут оказаться не в оперативной памяти, а на диске в файле подкачки. При любом обращении к такой странице менеджер памяти выполняет опера цию чтения данных с диска в оперативную память (подкачку). Если в опе ративной памяти нет свободных страниц, одна из наиболее редко исполь зуемых страниц вытесняется из оперативной памяти на диск. В Win также существует механизм файлов, отображаемых в память (Memory Mapped Files), который позволяет отобразить в адресное пространство лю бой дисковый файл.

Для ускорения загрузки и выполнения программ как раз и используется отображение файлов в память. Вместо того чтобы читать с диска весь файл программы, необходимые области просто отображаются в оперативную па мять нового процесса, а реальный перенос данных с диска производится непосредственно в тот момент, когда происходит обращение к каждой кон кретной странице.

Более того, если загружается несколько копий одной программы, то те страницы памяти, которые не меняются в процессе работы, размещаются в оперативной памяти только один раз, независимо от числа процессов, ко торые эту память используют. Но как только один из процессов изменяет Глава 13. Использование навесных защит содержимое страницы, для него создается персональная копия измененной страницы, под которую выделяется дополнительная память, а остальные процессы продолжают совместно использовать оригинальную страницу.

Как уже говорилось раньше, в обычных программах существуют области, не изменяемые в процессе работы программы. Это, например, секции кода и ресурсов. Таким образом, эти области будут подгружаться с диска по мере использования, и если запустить несколько копий программы, то оператив ная память под неизменяемые области будет израсходована только один раз.

Если же программа обрабатывается протектором, то это влечет за собой оп ределенные последствия. Во-первых, замедляется запуск программы, т. к.

протектор вынужден прочитать с диска весь код программы до начала вы полнения, чтобы правильно настроить программу в памяти. Для небольших программ это, возможно, будет почти незаметно, но с увеличением размера файла задержки при старте защищенной программы могут стать весьма ощутимыми. А во-вторых, при расшифровке тела программы протектор вы нужден модифицировать содержимое страниц памяти, а значит, для каждого процесса будет создаваться локальная копия. И если программа должна присутствовать в памяти в нескольких экземплярах, то области кода и ре сурсов будут занимать во столько раз больше памяти, сколько процессов запущено.

Безопасность Разработчики протекторов стремятся использовать все доступные им воз можности для повышения стойкости. Однако иногда они забывают, что, повышая защиту конкретной программы, они могут случайно ослабить не которые элементы защиты.

Драйвер ядра в StarForce Для обеспечения функционирования некоторых элементов защиты и затруднения анализа защитных механизмов разработчики системы защиты StarForce создали специальный драйвер, который устанавливается вместе с защищаемой програм мой и без которого функционирование этой программы невозможно.

Станислав Винокуров, являющийся сотрудником компании Inc., об наружил, что некоторые версии драйвера StarForce содержат ошибку, позво ляющую программе сформировать правильные структуры данных и, восполь зовавшись установленным драйвером, выполнить любую последовательность команд в режиме ядра.

наличие данной ошибки позволяет получить неограниченный дос туп к ресурсам компьютера, на котором установлен драйвер StarForce, полно Часть III. Как не надо защищать программы нейтрализовав защитные механизмы операционных систем семейства Windows NT.

Правда по утверждению представителя компании Protection Technology, яв ляющейся разработчиком StarForce, в последних версиях драйвера эта ошибка уже устранена.

13.6.3. Нестабильность Для чтобы усложнить работу исследователя программ, разработчики протектора вынуждены идти на использование нестандартных и/или недо кументированных особенностей операционных систем и оборудования. Как правило, эти особенности обнаруживаются путем исследования внутренно стей самой операционной системы, а их наличие подтверждается путем многократного тестирования.

Но разнообразие версий программного обеспечения и оборудования на столько велико, что небольшой компании просто физически не удастся проверить обнаруженную особенность на всех конфигурациях, которые мо гут встретиться у пользователя. Но и крупным корпорациям это далеко не всегда под силу.

Кроме того, с некоторой периодичностью появляются новые версии опера ционных систем. И очевидно, что любая недокументированная особенность, существовавшая ранее, может отсутствовать в новой версии операционной системы.

Все это приводит к тому, что защищенная программа с некоторой вероятно стью может просто не заработать на машине у конкретного пользователя (или у всех пользователей, использующих новую операционную систему или установивших у себя какую-то особенную программу).

Иногда разработчики протекторов излишне усердствуют, стараясь воспре пятствовать анализу защищенных программ. Как уже упоминалось ранее, многие протекторы запрещают выполнять программу под отладчиком.

Но не всегда делают это достаточно разумными средствами.

Нелепая защита от отладчика При запуске, например, исполняемых файлов, входящих в состав программного продукта защищенного с помощью HASP Envelope, нередко мож но получить сообщение об ошибке, гласящее, что программа не будет рабо тать, т. к. в памяти обнаружен отладчик. И подобное сообщение, скорее всего, немало удивит пользователя, совершенно уверенного в том, что он не запускал никакого отладчика.

Глава 13. Использование навесных защит Оказывается, защищенная программа так реагирует, в частности, на наличие в памяти процесса с именем MSDEV.EXE. Для справки, — это имя основного файла Microsoft Developers Studio — набора средств разработки про граммного обеспечения, выпускаемого корпорацией Microsoft. Действительно, MSDEV.EXE может использоваться и для отладки программ, но основное его именно разработка. То есть авторы PHOTOMOD считают, что пользователи их продукта ни в коем случае не должны пользоваться сред ствами разработки, предоставляемыми компанией Microsoft.

Самое забавное в этом примере то, что после переименования MSDEV.EXE его можно держать загруженным в памяти и это не повлияет на работоспособность PHOTOMOD. Следовательно, такое обнаружение отладчика скорее мешает ра ботать обычному пользователю, чем ставит хоть сколько-нибудь ощутимое препятствие на пути исследователя.

Другой пример касается нескольких версий программы Adobe Acrobat eBook Reader, защищенной при помощи протектора InterLok. Защита использо вала драйвер, устанавливаемый в ядро операционной системы, и одной из функций драйвера была борьба с отладчиком.

При запуске программа обращалась к драйверу и извещала его о том, что вы полнение критической части (требующей блокировки работы отладчика) нача лось. Перед завершением работы программы драйвер извещался о том, что критическая часть пройдена и блокировку можно отключить. Собственно бло кировка заключалась в том, что при возникновении одного из отладочных ис ключений (например пошагового выполнения или точки останова) драйвер без лишних вопросов выполнял перезагрузку компьютера.

Если бы драйвер так реагировал только на отладочные исключения, возни кающие в контексте защищаемой программы, это еще можно было бы понять.

Но перезагрузка выполнялась при исключении в любом процессе. То есть по пытка отладки программы в том же Microsoft Developers Studio при загруженном Adobe Acrobat eBook Reader почти неминуемо приводила к перезагрузке с по терей всей несохраненной информации.

В последних версиях Adobe Acrobat eBook Reader проблема, похоже, была ре шена путем объявления критическими только самых важных частей программы, а не всей программы целиком.

Грамотное протекторов позволяет значительно усложнить задачу снятия защиты и если не предотвратить взлом, то значительно сни зить его рентабельность. Нелегальные копии программ с хорошей зашитой часто появляются в Интернете только благодаря кардингу — если взломать программу не удается, можно купить лицензию, воспользовавшись украден ным номером кредитной карты.

Глз pal В прс стоит ва, содер) не 14. дачи Для ствия, легко Devi При сены рые (напр] Дочно с иемы, облегчающие противника разработки реализации защитных механизмов ни на минуту забывать, что противник будет использовать все доступные ему средст нейтрализовать защиту. Однако очень часто защищенная программа кит в себе такое количество информации, способствующей взлому, что ею для обхода защиты было бы для противника странно.

I. Осмысленные имена функций тоном при разработке сложных проектов является разделение за ма отдельные, минимально связанные между собой части. При таком жестко определяются интерфейсы, с помощью которых отдельные шлющие могут общаться между собой, и каждая часть разрабатывается от всех остальных.

ого чтобы программистам было проще обращаться к узлам, разрабо IM другими людьми, функциям, через которые происходят взаимодей дают легко запоминающиеся и самоописываюшие имена. Например, запОМНИТЬ, ЧТО Cr eat eFi l e ДЛЯ файла, — для управления устройствами.

сомпиляции программы некоторые фрагменты кода могут быть выне во внешние библиотеки и импортированы по именам. Иногда по име можно восстановить даже количество и тип аргументов, кото га функция принимает на вход. Многие визуальные среды разработки имер Borland Delphi и C++ Builder) сохраняют внутри исполняемых строки с именами функций, являющихся обработчиками событий, в интерфейсе программы (перемещение мыши, нажатие и т. д.). А иногда в готовой программе остаются фрагменты отла й информации, в которой присутствуют имена функций. В любом из не составляет большого труда определить, что по конкретному начинается код функции с таким-то именем.

Часть III. Как не надо защищать программы Это не является проблемой для функций, выполняющих действия, не свя занные с защитой программы. Но если функция называется или то противнику имеет смысл в первую очередь иссле довать именно такую функцию, т. к. с большой вероятностью в ней выпол няются важные действия, относящиеся к работе защиты.

Стоит всячески избегать попадания осмысленных имен функций, относя щихся к защитным механизмам, в исполняемые файлы и библиотеки, яв ляющиеся частью готовой программы. Если в исходном тексте программы функции должны фигурировать под осмысленными именами (по соображе ниям удобочитаемости), то для сокрытия истинных имен функций можно использовать макроподстановки (листинг 14.1).

Листинг 14.1. для сокрытия С t CheckLicense fn void CheckLicense (char *pszLic) { /* текст функции */ void main (void) { CheckLicense ("License Sting");

При компиляции такого кода препроцессор вместо везде под ставит fn23, а значит, имя, которое могло бы дать какую-то информацию противнику, просто не попадется ему на глаза.

Библиотечные функции могут импортироваться и экспортироваться не только по имени (by name), но и по номеру (by ordinal). Это позволяет во обще исключить соответствующие имена из программы и библиотек.

Однако никогда не помешает в готовых исполняемых файлах выполнить поиск текстовых строк, содержащих названия важных для защиты функ ций — никогда нельзя быть уверенным, что компилятор или редактор свя зей нигде не оставил важных имен.

14.2. Транслируемые языки Некоторые широко распространенные языки программирования в процессе компиляции преобразуют исходный текст в так называемый псевдокод — Глава 14. Приемы, облегчающие работу противника некоторое промежуточное представление текста программы, не являющееся машинным кодом. К таким языкам можно отнести Clipper, C#, FoxPro, ин сталляционные сценарии InstallShield, Java, Map Basic, MicroStation MDL, Python, Visual Basic и многие другие. При выполнении программы виртуальная машина интерпретирует псевдокод и выполняет его на вирту альном процессоре.

Теоретически использование виртуальной машины может являться эффек тивным способом противодействия исследованию программы, т. к. до нача ла анализа алгоритма необходимо разобраться с устройством виртуальной машины. Но это справедливо только для ситуации, когда система команд, применяемая машиной, нигде и никем не была описана, т. е. является уни кальной.

Очевидно, что для популярных языков программирования это совершенно не так. Для некоторых языков (например С#, Java и Python) в Интернете нетрудно найти подробное описание того, как кодируется та или иная опе рация, поддерживаемая виртуальной машиной. А интерпретатор языка Python вообще распространяется в исходных текстах, что не позволяет со хранять устройство виртуальной машины в тайне.

Если для какого-то языка нет описания кодов операций, но этим языком пользуется довольно много программистов, рано или поздно кто-то задастся целью разобраться в деталях псевдокода и разработает весь необходимый инструментарий.

Существует несколько причин, почему разобраться с системой команд вир туальной машины для транслируемого языка программирования обычно бы вает не очень сложно.

Прежде всего, исследователь может компилировать любые примеры и смот реть, какой псевдокод будут превращаться команды. Это очень важно, т. к.

внося незначительные изменения в исходный текст и анализирую разницу в оттранслированном псевдокоде, гораздо легче устанавливать закономерно сти, чем внося изменения в псевдокод и контролируя изменения в поведе нии виртуальной машины.

Кроме того, виртуальная машина обычно проектируется, исходя из требова ний максимизации производительности. Следовательно, знание базовых принципов построения эффективных виртуальных машин часто позволяет быстро разобраться с особенностями конкретной реализации.

Вдобавок система команд виртуальной машины редко бывает очень слож ной. Это на реальном процессоре обнулить регистр еах можно несколькими способами, например:

sub еах;

and еах, 0.

Часть III. Как не надо защищать программы А в виртуальной машине такая избыточность не имеет смысла.

И, наконец, виртуальная машина, являющаяся частью языка программиро вания, не разрабатывается как запутанное логическое устройство, работа которого никогда не должна быть проанализирована противником. Напро тив, чем проще будет организована виртуальная машина, тем легче будет ее отлаживать и оптимизировать.

В любом случае, для многих популярных транслируемых языков програм мирования были разработаны декомпиляторы, позволяющие получить если не точную копию оригинального исходного текста, то часто эквивалентный код, который может быть скомпилирован и будет работать так же, как ори гинальная программа. В разных языках программирования количество ин формации, сохраняемой в оттранслированном тексте, может отличаться.

В некоторых случаях сохраняются имена всех функций и переменных.

Иногда могут быть извлечены даже номера строк исходного текста, где рас полагался тот или иной оператор, и имя исходного файла. Но может быть и так, что сохраняется только последовательность вызовов функций и упот ребления операторов, в то время как вся символическая информация об именах оказывается утраченной.

Но, даже имея всего лишь эквивалентный текст, в котором имена перемен ных и функций заменены на произвольные, анализировать защитные меха низмы гораздо проще, чем если бы они были написаны на языке, компили руемом в команды реального процессора.

Для предотвращения применения декомпиляторов иногда разработчики программ идут на модификацию виртуальной машины.

Модификация виртуальной машины FoxPro FoxPro является одной из популярных коммерческих систем управления база ми данных (СУБД) и позволяет создавать законченные приложения, функцио нирующие независимо от среды разработки. Но существует несколько очень хороших декомпиляторов, способных полностью восстановить исходный текст программ, созданных в FoxPro, например ReFox или И некоторые разработчики, использующие FoxPro (например авторы программы Hardware Inspector), пытаются найти способ защитить свои программы от декомпиляции.

Делается это примерно следующим образом.

Программа разрабатывается в среде FoxPro и компилируется самым обычным образом. Чтобы ReFox невозможно было использовать для получения исходно го текста программы, необходимо изменить способ кодирования псевдокода.

Но тогда и виртуальная машина не сможет работать с перекодированным псевдокодом. Следовательно, необходимо исправить и виртуальную машину.

Глава 14. Приемы, облегчающие работу противника После этого скомпилированную программу можно распространять вместе с модифицированной виртуальной машиной, и окажется бессилен.

Однако в данной схеме есть одно слабое звено. Дело в том, что исполняющая часть виртуальной машины обычно оформляется в виде динамической библио теки для FoxPro 5 или vfp6r.dll для FoxPro 6) и разрешается свобод ное распространение этой библиотеки (как redistributable Следова тельно, оригинальная (неизмененная) версия виртуальной машины может быть легко найдена в Интернете. Далее достаточно выяснить, чем отличается мо дифицированная версия виртуальной машины, и либо перекодировать про грамму, приведя ее к виду, доступному для понимания ReFox, либо модифици ровать ReFox таким же образом, каким была модифицирована виртуальная машина.

Так что модификация виртуальной машины является весьма сомнительным средством для защиты от декомпиляции псевдокода. К тому же, распростране ние модифицированной виртуальной машины почти всегда является наруше нием условий лицензии, в согласии с которыми эта машина должна использо ваться. В случае с виртуальной машиной FoxPro, являющейся собственностью корпорации Microsoft, ущемленными оказываются права последней, а это мо жет вызвать серьезные последствия.

Одним словом, использование транслируемых языков допускающих частичную или полную декомпиляцию, — это далеко не луч ший выбор для реализации защитных механизмов. Противник имеет воз можность в самые короткие сроки получить доступ к исходным текстам всех исходных алгоритмов, чтобы попытаться найти уязвимость. А иногда про тивнику и вовсе удается убрать из декомпилированного текста все обраще ния к защитным функциям и заново скомпилировать программу.

14.3. Условно бесплатные и Demo-версии Для того чтобы потенциальные пользователи смогли лучше оценить воз можности программы, разработчики часто распространяют демонстрацион ные версии своих продуктов. Такие версии, как правило, имеют ограничен ный набор функций и/или ограничение на время использования или количество запусков программы.

Условно бесплатные продукты обычно являются ограниченными версиями, которые предоставляют пользователю возможность ввода регистрационного кода, после чего все ограничения снимаются.

Часть III. Как не надо защищать Ограничение функциональности Если автор демонстрационной версии программы хочет сделать недоступ ным, например, пункт меню Save, то он может пойти двумя путями:

при инициализации программы сделать этот пункт недоступным;

• удалить из программы весь код, относящийся к сохранению данных на диске, и при инициализации программы сделать пункт меню Save недос тупным.

Очевидно, что реализация первого способа требует значительно меньших усилий. Однако существуют специальные инструменты, позволяющие ме нять свойства элементов диалога в процессе выполнения программы. С по мощью подобных инструментов можно каждый элемент любого диалогового окна сделать доступным, превратив демонстрационную версию в полноцен ную по функциональности программу. А некоторые инструменты можно даже "обучить" автоматически делать доступными нужные кнопки и пункты меню при открытии соответствующего диалога.

Поэтому необходимо исключить из кода демонстрационной программы те функции, которые должны присутствовать только в полной версии. Достичь желаемого результата, не создавая две очень похожих программы, можно, например, путем использования директив условной компиляции, поддержи ваемых препроцессором языка С. К полезным директивам относятся, на пример, #ifdef, #else и #endif. С ИХ ПОМОЩЬЮ МОЖНО добиться того, что, изменяя в настройках проекта всего одно определение препроцессора (аналог #define), можно будет из одного набора исходных текстов получить совершенно разные по набору функций программы.

14.3.2. Ограничение периода использования Для того чтобы ограничить период возможного использования продукта, необходимо в некоторой области компьютера сохранить дату установки или количество запусков. Обычно для этого используются произвольные файлы или реестр (Registry Database). Многие считают, что, спрятав такой счетчик в самый дальний угол операционной системы, они сделают невозможным обнаружение его местоположения, а следовательно, и сброс счетчика.

Однако существует два семейства инструментов, позволяющих определить, где именно располагается счетчик. К первому семейству относятся программы мониторы. Они отслеживают все обращения к файлам или реестру и прото колируют те из них, которые попросил запомнить пользователь. Мониторы Глава 14. Приемы, облегчающие работу противника обычно состоят из двух частей: драйвера, устанавливаемого в ядро операци онной системы, и интерфейсной части, посредством которой пользователь имеет возможность управлять работой монитора и получать результаты про токолирования. Наиболее известными являются, наверное, программы File System Monitor и Registry Monitor, разработанные компанией Однако программы могут противодействовать мониторам. Очень важен тот факт, что монитор является активным инструментом — для того чтобы мо нитор выполнял свои функции, он должен находиться в памяти во время работы исследуемой программы. Следовательно, защищенная программа может обнаружить присутствие монитора и скорректировать свое выполне ние разными способами. Например, она может просто отказаться работать, если в памяти присутствует монитор. Другой способ заключается в посылке интерфейсной части монитора сообщения о необходимости завершения ра боты. При этом монитор оказывается выгруженным из памяти, программа продолжает функционирование в чистом окружении. Красиво выглядит и следующий способ: защищенная программа посылает драйверу монитора команду временно приостановить регистрацию событий, выполняет важные обращения, а затем снова разрешает драйверу работать. При этом интер фейсная часть монитора никак не отражает тот факт, что работа драйвера была откорректирована. И пользователь находится в полной уверенности, что программа не производила никаких обращений, в то время как они имели место, но монитор в это время просто был отключен.

Противодействие мониторам работает только в том случае, если программа знает, как определить наличие монитора в памяти и как его обезвредить.

Поэтому часто противнику достаточно изменить логическое имя драйвера монитора, чтобы программа оказалась не в состоянии его обнаружить.

Кроме программ-мониторов, принадлежащих к семейству активных инстру ментов, есть и семейство пассивных инструментов. Это программы, которые позволяют отслеживать произошедшие изменения, не находясь все время в памяти. Просто до первого запуска защищенной программы необходимо сохранить текущее состояние реестра или определенных файлов, а после запуска сравнить новое состояние с предыдущим. Те записи, которые были изменены, сразу окажутся на подозрении у противника. Использование пас сивных инструментов не может быть обнаружено защитой, и единственный способ противостоять им — внести очень большое количество фиктивных изменений, чтобы затруднить противнику определение действительно важ ных записей. Но такой подход неминуемо приведет к снижению производи тельности.

Часть III. Как не надо защищать программы Программы с возможностью регистрации Программы, в которых предусмотрена возможность регистрации, выглядят привлекательно с точки зрения маркетинга. Действительно, пользователей должно радовать, что сразу после оплаты стоимости лицензии они получат регистрационный код и могут моментально превратить ограниченную вер сию в полноценную. Не потребуется ни выкачивание другого инсталляци онного пакета, ни повторная инсталляция.

Однако интуитивно понятно, что подобная схема может быть уязвлена мно жеством способов.

Очень часто регистрация подразумевает ввод имени пользователя и одного или нескольких регистрационных кодов. Если регистрация не имеет маши нозависимой составляющей, т. е. на любом компьютере определенному имени пользователя соответствуют всегда одни и те же регистрационные коды, то, зарегистрировав программу один раз, ее можно будет использовать на любом количестве компьютеров. Неудивительно, что для очень многих программ в Интернете можно без труда найти регистрационные коды.

Проверка правильности введенного регистрационного кода тоже может вы полняться по-разному. Нередко встречаются реализации, когда программа вычисляет для введенного имени пользователя правильный регистрацион ный код, который просто сравнивается с тем кодом, который ввел пользова тель. В подобной ситуации для нелегальной регистрации программы на лю бое имя достаточно ввести это имя и произвольный код, найти точку, где правильный регистрационный код уже вычислен, и прочитать его из памя ти. При следующей попытке регистрации достаточно ввести то же самое имя и прочитанный из памяти код, чтобы программа решила, что она кор ректно зарегистрирована.

И, конечно же, если данные просто проверяются на кор ректность, ничто не мешает противнику исправить тело процедуры провер ки таким образом, что любые введенные регистрационные коды будут счи таться Лучше сделать так, чтобы регистрационная информация использовалась в жизненно важных функциях программы.

Это особенно полезно в свете того, что программа после регистрации долж на превратиться в полноценную версию без использования каких-либо до полнительных модулей. Следовательно, ограниченная версия должна в какой либо форме содержать весь код, доступный в полной версии. Одно из воз можных решений — зашифровать фрагменты программы, относящиеся к полной версии, а ключ шифрования каким-то образом связать с регистра ционным кодом. При этом без знания правильной регистрационной ин Глава 14. Приемы, облегчающие работу противника формации не удастся расшифровать защищенные фрагменты, даже если от ключить все проверки правильности регистрационного кода.

14.4. Распределенные проверки Когда программа получила от пользователя регистрационную информацию, не обязательно сразу же определять ее правильность и информировать об этом пользователя. Если все проверки сосредоточены в одном месте, про тивнику гораздо легче определить, откуда начинать анализ.

Предпочтительнее выглядит следующий подход. При вводе регистрационной информации выполняется первичная проверка, предназначенная скорее для исключения ошибок набора с клавиатуры, чем для защиты. Если введенная информация кажется правильной, она сохраняется на диске (в файле или реестре) и пользователю выдается сообщение с благодарностью за регистра цию и предложением перезапустить программу, т. к. только после переза пуска будут активированы все функции, недоступные в бесплатной оценоч ной версии.

После перезапуска программа читает с диска регистрационную информацию и тиражирует ее в памяти в нескольких экземплярах. Это делается для того, чтобы противнику сложнее было найти место, где программа интерпретиру ет регистрационные данные.

В разных местах программы необходимо вставить разные функции, которые будут проверять разные кусочки регистрационной информации или целост ность программы. Лучше иметь несколько функций, проверяющих одно и то же, чем одну функцию, проверяющую сразу все. Противнику придется разбираться со всеми функциями проверки, и чем их больше, тем ему будет сложнее.

Если в результате одной из проверок выяснилось, что регистрационные данные неверны, не стоит сразу сообщать об этом пользователю. Лучше ус тановить специальный флаг, указывающий на то, что программа не была корректно зарегистрирована. А в другой функции, относящейся к совер шенно иному фрагменту программы, анализировать один или несколько флагов и предпринимать соответствующие действия.

Действия могут быть самые разнообразные. Так, например, один из DOS овских симуляторов при запуске проверял наличие документации:

у пользователя просили ввести слово, написанное на определенной страни це. Исправлением одного байта можно было заставить программу запускать ся при вводе любого слова, но тогда автомобиль становился неуправляемым через несколько минут после начала гонки.

170 Часть III. Как не надо защищать программы Другой пример нестандартной реакции. Программа ReGet Deluxe, предна значенная для управления выкачиванием файлов по протоколам HTTP и FTP, иногда подменяла загруженные файлы, если обнаруживала, что код программы был модифицирован. Так у пользователя взломанной версии ReGet Deluxe были шансы в архиве обнаружить файл содержа щий текстовую строку "This downloaded with cracked version of ReGet Deluxe", или получить сообщение с тем же текстом при запуске закачанного исполняемого файла.

Также существует красивая легенда, касающаяся программы 1 С:Бухгалтерия и ключи HASP Бухгалтерская программа от компании 1С исторически была защищена от ко пирования при помощи аппаратных ключей HASP. Для всех ключей HASP того времени существовали эмуляторы, и 1С нормально работала при отсутствии ключа, если на машине был установлен эмулятор, и очень многие это знали.

Но, видимо, о существовании эмуляторов были неплохо осведомлены и про граммисты 1С. Во всяком случае, однажды программа перестала работать под эмулятором, в то время как при наличии настоящего ключа никаких проблем не возникало.

В обычное время нелегальные пользователи постарались бы найти другой эмулятор или взломанную версию программы, но так случилось, что про грамма перестала работать за несколько дней до срока сдачи очередного баланса. В результате, очень многие не колебались и предпочли приобрести легальную версию программы вместо того, чтобы платить штраф за просро ченный баланс.

Расчет был сделан очень точно, и, по слухам, компания 1С за 2 недели прода ла столько копий своей Бухгалтерии, сколько обычно продавалось за полгода.

Вот так небольшая задержка в реакции на нарушение защиты, совмещенная со знанием особенностей рынка, помогла быстро легализовать большое количе ство пользователей.

14.5. Инсталляторы с защитой Некоторые производители программного обеспечения позволяют всем же лающем скачать инсталлятор программы с официального интернет-сайта.

При этом инсталлятор может быть защищен таким образом, что для уста новки программы необходимо знать некоторую информацию, которую про изводитель сообщит только после получения оплаты.

Глава 14. Приемы, облегчающие работу противника Однако не все разработчики знают, что некоторые способы защиты инсталляторов совсем не так безопасны, как хотелось бы.

14.5.1. с паролем Очень многие программы распространяются в И очевидная идея защиты дистрибутива — установка пароля на архив. Если выбранный пароль содержит буквы, цифры и знаки препинания и имеет достаточно большую длину, то для отыскания такого пароля перебором потребуется очень много времени. Однако кроме подбора пароля методом грубой силы (brute force) существуют и более эффективные варианты атаки.

Если архив был создан с помощью программы, основанной на исходных текстах от InfoZIP Group (например WinZip), и содержит пять или более файлов, существует алгоритм, отыскивающий ключ и расшифровывающий примерно за час.

Если применялся архиватор, не основанный на InfoZIP, то противник мо жет попытаться воспользоваться атакой на основе открытого текста. Для этого ему понадобится иметь в открытом виде один из файлов, зашифро ванных в архиве.

Но как можно получить незашифрованный файл? Оказывается, создатели архива часто сами помещают в архив с дистрибутивом файл, который можно найти в открытом виде. Например, файл описывающий продукт, обычно доступен по ссылке с web-страницы, а также находится в дистрибутиве.

Если инсталлятор программы, зашифрованный в архиве, создан при помо щи пакета то в архиве окажется с десяток файлов, некоторые из которых идентичны для всех инсталляторов, созданных с помощью Install Shield той же версии. Следовательно, незашифрованный файл может быть взят от другой программы или найден в Интернете с помощью службы FTPsearch.

14.5.2. Norton Secret Stuff Некоторые производители для распространения своих продуктов использо вали разработанную компанией Symantec бесплатную программу Norton Secret Stuff (NSS), создающую из указанного набора файлов самораспаковы вающийся архив с паролем. Все данные шифруются с помощью криптогра фически стойкого алгоритма BlowFish, но в силу действовавших на момент создания NSS ограничений на экспорт программного обеспечения, исполь зующего стойкую криптографию, применяется ключ шифрования, в кото ром неизвестными являются только 32 бита.

Часть III. Как не надо защищать программы В 1998 году Павел Семьянов разработал программу No More Secret Stuff позволяющую подобрать 32-битовый ключ и расшифровать архив не более чем за 4 недели на компьютере с процессором Intel Pentium 166 МГц. С тех пор производительность процессоров значительно выросла, и подбор ключа может быть осуществлен на одном компьютере за считан ные дни. А если выполнять вычисления одновременно на нескольких ма шинах, то результат может быть достигнут буквально за насколько часов.

Ключ шифрования вычисляется из пароля при помощи MD5.

На настоящий момент не существует эффективного способа обращения этой функции, но на подбор пароля, порождающего заданный 32-битовый ключ, уходит примерно в 64 раза меньше времени, чем на поиск самого ключа. Таким образом, несмотря на то, что поиск пароля не является необ ходимым для расшифрования архива NSS, если известен ключ шифрования, при желании можно найти и пароль, затратив при этом на 2 % больше ре сурсов.

14.5.3. Package The Web Если инсталлятор состоит не из одного файла, часто применяется дополни тельная программа, позволяющая все файлы, составляющие инсталлятор, упаковать в один исполняемый файл. Пользователь скачивает этот файл и запускает его, что приводит к распаковке инсталлятора во временную ди ректорию и запуску процесса инсталляции. После того как инсталляция за вершится, автоматически будут удалены все временные файлы.

Популярной программой для упаковки инсталляционного пакета в один ис полняемый файл является Package For The Web (PFTW), бесплатно распро страняемая InstallShield Software Corporation и, похоже, входящая в состав коммерческой программы InstallShield. PFTW позволяет установить пароль на исполняемый файл, что не позволит распаковать, а значит, и запустить инсталлятор, пока не будет введен правильный пароль.

Однако то, как проверяется пароль в PFTW, заслуживает серьезной крити ки. В ранних версиях пароль просто сравнивался со строкой, хранившейся в зашифрованном виде. Следовательно, можно было или откорректировать условие, в результате проверки которого принималось решение о правиль ности ввода пароля, или "подсмотреть" пароль в момент проверки.

Более новые версии PFTW поступают гораздо умнее. Пароль нигде не хра нится даже в зашифрованном виде, но запоминается его 14-битовый хэш, который сравнивается со значением хэша от введенного пользователем па роля. В случае несовпадения пользователя сразу информируют о том, что пароль неверен. Но так как длина хэша составляет всего 14 бит, примерно один из 16 тысяч паролей будет проходить эту проверку. Это широко рас Глава 14. Приемы, облегчающие работу противника подход, который позволяет защититься от случайных опеча ток, но не дает возможности правильно определить пароль, даже если удаст ся обратить хэш — каждому значению хэша будет соответствовать, например, почти полмиллиона семисимвольных паролей, состоящих только из ких латинских букв, но только один из этих паролей будет правильным.

Если проверка хэша прошла успешно, из пароля вычисляется ключ, кото рый используется для расшифрования инсталлятора. Но именно тут разра ботчики PFTW допустили оплошность.

Дело в том, что длина ключа шифрования соответствует длине пароля, и преобразование пароля в ключ является обратимым, т. е., зная ключ шиф рования, легко вычислить пароль. А алгоритм шифрования не устойчив к атаке на основе открытого текста, т. е., зная несколько байт открытого текста и соответствующего ему шифртекста, очень просто вычислить фраг мент ключа шифрования той же длины, что и известный открытый текст.

Таким образом, для определения пароля достаточно найти фрагмент откры того текста, который по длине не короче пароля.

Но, как оказалось, шифруемые данные представляют собой так называемый САВ-файл, формат которого был разработан корпорацией Microsoft. CAB файл является разновидностью архивного файла, хранящего один или не сколько других файлов в упакованном виде, и всегда начинается со строко вой сигнатуры "MSCF" (Microsoft CAB File), за которой следуют 4 нулевых байта и 64-битовое число, соответствующее размеру САВ-файла. Таким об разом, определить первые 16 байт открытого текста, а значит и пароля, дли на которого не превышает 16 байт, не составит труда. В САВ-файле присут ствуют и другие области, значение которых совсем не трудно предугадать.

Их можно использовать для вычисления более длинных паролей.

Часть IV ОСНОВНЫЕ АСПЕКТЫ ЗАЩИТЫ ДАННЫХ Глава Обеспечение секретности Глава 16. Особенности реализации DRM Глава Стеганографическая защита данных Глава Причины ослабления средств защиты Часть IV. Основные аспекты защиты данных этой части книги собран материал, относящийся к обеспечению безопас ности данных. Следующие четыре главы рассказывают о приемах и ошибках в обеспечении секретности, о возможных подходах к реализации систем управления цифровыми правами и применении стеганографии для данных. Также приводится анализ причин появления ненадежных средств защиты.

Глава Обеспечение секретности Практически всегда под защитой данных понимается наложение ограниче ний на доступ к информации. Эти ограничения, как правило, бывают трех типов:

• кто имеет право доступа;

• в течение какого периода разрешен доступ;

какие виды доступа разрешены.

Пользователь может взаимодействовать с данными двумя основными спосо бами: локально и удаленно. При удаленном (сетевом) доступе пользователь сначала проходит процедуры идентификации и аутентификации, а потом запрашивает у сервера необходимую ему информацию. Сервер выполняет все необходимые проверки и принимает решение либо о предоставлении доступа, либо об отказе. Для защиты удаленных данных разработаны фор мальные модели разграничения доступа, описание которых можно найти в любом хорошем учебнике по сетевой безопасности.

Мы же будем рассматривать ситуации, когда все проверки реализуются ло кально. То есть пользователь (или противник) теоретически может полно стью контролировать все шаги, которые та или иная программа выполняет для получения доступа к данным.

В условиях локальности проверок ограничивать, например, период доступа гораздо сложнее, чем при выполнении контроля на сервере. Но для про стого обеспечения секретности, по идее, нет никаких препятствий — доста точно спросить у пользователя пароль или получить от него какую-то дру гую информацию, при помощи хорошей хэш-функции вычислить ключ шифрования и зашифровать на нем защищаемые данные при помощи стойкого криптографического алгоритма. Однако в практиче ских реализациях этой простейшей последовательности действий разработ чики ухитряются допускать самые разнообразные ошибки, значительно снижающие уровень защищенности информации, а иногда и вовсе сводят его к нулю.

Часть IV. Основные аспекты защиты данных Защита данных может осуществляться в совершенно разных условиях, и, соответственно, в каждом случае необходимо использовать свои приемы защиты.

Архивация с шифрованием Многие современные программы упаковки данных (архиваторы) имеют встроенную поддержку шифрования. Если пользователь пожелает защитить от чужих глаз информацию, находящуюся в архиве, ему надо при упаковке ввести пароль, а архиватор сам выполнит все остальные действия. При по пытке извлечения зашифрованного файла архиватор запросит у пользовате ля пароль и распакует файл только в том случае, если пароль верен.

Стоит отметить, что зашифрование всегда выполняется после компрессии, т. к. зашифрованные данные должны быть неотличимы от случайной после довательности, и, следовательно, архиватор не сможет найти в них избыточ ность, за счет удаления которой и происходит упаковка.

15.1.1. ZIP Свойства алгоритма шифрования, использованного в архивном формате ZIP, уже многократно обсуждались в этой книге.

Не повторяя детали, вспомним, что алгоритм шифрования уязвим к атаке на основе открытого текста и достаточно знать 12 незашифрованных байт (по сле компрессии), чтобы расшифровать весь файл за приемлемое время.

Для архивов, содержащих 5 и более файлов и созданных архиваторами, ос нованными на библиотеке InfoZIP, возможна атака, использующая в качест ве открытого текста данные из заголовков зашифрованных файлов. Этой атаке были подвержены файлы, созданные при помощи WinZIP, но в по следних версиях этого архиватора проблема была исправлена.

Еще в июле 2002 года компания PKWARE, Inc. выпустила версию архи ватора PKZIP, поддерживающего более стойкие алгоритмы шифрования.

Но, видимо, по той причине, что позиционируется как продукт для корпоративных пользователей, новое шифрование не получило широкого распространения.

ARJ Популярный во времена DOS, но довольно редко используемый в настоя щее время архиватор, разработанный Робертом Янгом (Robert Jung), исполь зовал следующий алгоритм шифрования.

Глава 15. Обеспечение секретности Из пароля по очень простому обратимому алгоритму получалась гамма, рав ная по длине паролю. Эта гамма накладывалась на шифруемые данные пу тем сложения по модулю 2 (операция Таким образом, наличие откры того текста, равного по длине паролю, позволяло моментально определить гамму и использованный пароль.

Более в самом начале упакованных данных содержалась информация компрессора, такая как таблицы Хаффмана (Huffman tables), и часть этой информации могла быть предсказана, что позволяло значительно повысить скорость поиска пароля перебором.

Начиная с версии 2.60 (ноябрь 1997 года) поддерживает шифрование по алгоритму ГОСТ 28147-89 (см. разд. 6.1).

15.1.3. RAR Архиватор, разработанный Евгением Рошалем (Eugene Roshal), является неплохим примером того, как можно подходить к шифрованию данных.

В алгоритме шифрования, используемом в RAR версии 1.5, есть некоторые недочеты. Так эффективная длина ключа шифрования составляет всего 64 бита, т. е. перебором 264 вариантов ключа можно гарантированно рас шифровать пароль. Более того, наличие открытого текста позволяет умень шить множество перебираемых вариантов до Следовательно, атака мо жет быть успешно выполнена даже на одном компьютере. Скорость перебора на компьютере с процессором Intel Pentium 333 МГц составляет примерно 600 000 паролей в секунду.

При переходе к версии 2.0, видимо, была проведена серьезная работа над ошибками. Во всяком случае, взлом нового алгоритма шифрования перебо ром требует примерно операций, что намного больше, чем может быть выполнено на современной технике. Об эффективных атаках, использую щих открытый текст, ничего не известно. Скорость перебора паролей сни зилась примерно до 2000 штук в секунду (в 300 раз).

Но разработчики RAR решили не останавливаться на достигнутом. В вер сии 3.0, появившейся в мае 2002 года, для шифрования стал использоваться алгоритм AES (Rijndael) с ключом длиной 128 бит. Такое решение выглядит вполне разумным как минимум по двум причинам. Во-первых, безопаснее использовать проверенный и хорошо зарекомендовавший себя алгоритм, чем нечто самодельное, и у AES здесь нет конкурентов. А во-вторых, у AES скорость шифрования выше, чем у алгоритма, использованного в RAR Кроме замены алгоритма шифрования, в RAR 3.0 используется и другая процедура получения ключа шифрования из пароля. Эта процедура требует вычисления хэш-функции SHA1 262 144 раза, что позволяет перебирать около 3-х паролей в секунду, т. е. в 600 раз меньше, чем для RAR 80 Часть Основные аспекты защиты данных Секретность в реализации Microsoft Уже на протяжении многих лет программы, входящие в Microsoft Office, по зволяют зашифровывать документы по паролю, вводимому пользователем.

Однако далеко не всегда данные оказываются защищены должным образом.

Microsoft Word и Excel Шифрование файлов было реализовано уже в Microsoft Word 2.0. Из пароля с помощью легко обратимого алгоритма 16-байтовая гамма, кото рая на содержимое документа. Но вычисление гаммы без па роля не составляло никакого труда, т. к. гамма накладывалась и на служебные области, имели фиксированное значение во всех документах.

В Word 6.0/95 и Excel 5.0/95 алгоритм шифрования не претерпел значитель ных изменений, но изменился формат файлов — он стал основываться на хранилище OLE Structured Storage. Для восстановления пароля документа все также требовалось найти 16-байтовую гамму, использованную для шиф рования данных.

Один из методов, позволяющих отыскать гамму, например, для документов Word, основывается на простейшем статистическом анализе. Самый часто встречающийся символ в тексте на любом языке — пробел. Таким образом, достаточно определить код наиболее используемого символа в каждой из 16 позиций, соответствующих разным байтам гаммы. Выполнив операцию каждого найденного значения с кодом пробела (0x20), мы получим 16 байт гаммы.

В программах Word 97/2000 и Excel 97/2000 данные шифруются при помощи алгоритма RC4 с ключом длиной 40 бит. Такое шифрование уже не позво ляет моментально определить пароль. Но производительность вычислитель ной техники за последние годы выросла настолько сильно, что единственно правильный ключ шифрования документа Word (из 240 возможных) может быть за четверо суток на компьютере с двумя процессора ми AMD Athlon 2600+.

Начиная с Office наконец появилась поддержка шифрования документов ключами длиной более 40 бит. Но, похоже, большинство пользователей до сих пор продолжает использовать 40-битовое шифрование, т. к. оно позволяет от крывать защищенные документы в предыдущих версиях офисных программ.

Да и изменение настроек шифрования требует дополнительных действий со стороны пользователя (открытия диалога настроек и выбора нужного крипто а по умолчанию применяются 40-битовые ключи.

Глава 15. Обеспечение секретности Microsoft Access Базы данных Microsoft Access могут иметь два типа паролей: пароли на от крытие и пароли для разграничения доступа на уровне пользователя.

Пароль на открытие, похоже, никогда не представлял серьезной защиты, т. к., начиная с Access версии 2.0, он хранился в заголовке базы данных.

Правда, сам заголовок был зашифрован RC4, но это не сильно увеличивало стойкость, т. к. в рамках одной версии формата всегда исполь зовался один и тот же 32-битовый ключ шифрования, жестко прошитый в динамически загружаемую библиотеку, отвечающую за работу с файлом базы данных.

А учитывая то, что RC4 — синхронный потоковый шифр, достаточно было один раз найти гамму, порождаемую RC4 с известным ключом. После этого пароль можно было определить, выполнив сложение по модулю 2 и нужных байт заголовка.

Так для Access 97 необходимо было выполнить XOR 13 байт, расположенных по смещению 0x42 от начала файла базы данных, со следующей последова тельностью:

0x86, OxFB, 0x37, 0x5D, 0х9С, OxFA, ОхСб, 0х5Е, 0x28, 0x13.

Альтернативный способ снятия пароля заключался в исправлении заголовка и установке значения байта, соответствующего первому символу, в такое состояние, чтобы после расшифровки заголовка там оказывался нулевой байт. Тогда Access, интерпретирующий пароль как строку, заканчивающую ся нулевым символом, увидев ноль в первом байте, решит, что пароль во обще не установлен. Для снятия пароля в Access 97 необходимо установить байт по смещению 0x42 от начала файла в значение 0x86.

Кстати, разработчики одной коммерческой программы, позволяющей вос становить забытые пароли к базам Microsoft Access, в описании новшеств очередной версии указали, что время, затрачиваемое на отыскание пароля, уменьшилось в 1,5 раза. Вероятно, для этого им пришлось уменьшить за держку перед выводом найденного пароля на экран, т. к. значительно слож нее придумать очень медленный способ выполнения XOR, а потом ускорить его в 1,5 раза.

Начиная с Access простое наложение гаммы уже не позволяет сразу же определить пароль, т. к. необходимо выполнить еще несколько дополни тельных несложных действий. Но пароль все равно хранится в заголовке, а значит, может быть оттуда прочитан.

Что самое занимательное, установка пароля на открытие базы данных не приводит к шифрованию ее содержимого. Однако Access поддерживает такую операцию, как шифрование базы данных, но пароль в этом шифро Часть IV. Основные аспекты защиты данных вании никак не участвует, а ключ шифрования хранится в заголовке файла.

базы.

Другой тип паролей, поддерживаемых Microsoft Access, используется не для обеспечения секретности, а для разграничения доступа. Но при проектиро вании, похоже, было допущено несколько ошибок, связанных и с этими паролями.

Правильно было бы хранить не пароли, а их хэши. Но, по непонятным при чинам, в системной базе данных, содержащей имена, пароли и прочие атри буты всех пользователей, можно найти сами пароли, зашифрованные трех кратным DES с двумя ключами в режиме EDE (Encrypt-Decrypt-Encrypt), когда первый ключ применяется дважды, на первом и третьем шаге. Ключи, как обычно, являются константами и хранятся в динамически загружаемой библиотеке. Такая защита позволяет быстро определить пароль любого пользователя, хотя Microsoft утверждает, что утерянные пароли пользовате лей Access не могут быть восстановлены.

В системной базе данных для каждого пользователя хранится и уникальный идентификатор, являющийся функцией от имени пользователя и некоторой произвольной строки, вводимой при создании учетной записи. И именно этот идентификатор является ключом, по которому идентифицируются пользователи в основной базе данных.

Так, например, у каждой таблицы в основной базе данных есть владелец, который имеет максимальные права. Но в основной базе данных хранится только идентификатор пользователя, являющегося владельцем, а имя и вся вспомогательная информация для аутентификации пользователя хранится в системной базе данных. И создается впечатление, что если системная база данных будет утеряна, то доступ к содержимому основной базы данных по лучить не удастся.

Но функция вычисления идентификатора пользователя сравнительно легко обращаема, что позволяет определить имя владельца идентификатора и строку, введенную при создании учетной записи. После этого остается только создать новую системную базу данных и добавить в нее пользователя с известными атрибутами, но вообще без пароля.

Microsoft Money Программа учета личной финансовой истории Microsoft Money основывае ся на том же ядре базы данных, что и Microsoft Access. Поэтому на протя многих версий файлы Money поддерживали точно такой же парол на открытие, как и базы Access.

Глава 15. Обеспечение секретности Однако в последних версиях, начиная с Money 2002, также называемой Money 10, пароль используется для вычисления ключа и последующего шифрования данных алгоритмом RC4, а не просто проверяется путем срав нения с сохраненным значением. То есть пароль может быть найден только подбором.

Но и тут не обошлось без "оригинальных" технических решений. Дело в том, что зашифровывается не весь файл, а только 15 первых блоков (в но вых версиях каждый блок занимает 4 Такой подход, скорее всего, выбран с целью обеспечения возможности создания компактных архивных копий баз Money.

Действительно, файл может иметь размер в десятки мегабайт, но если он весь будет зашифрован, ни один архиватор не будет в состоянии уменьшить объем занимаемого файлом дискового пространства. Если же зашифрован только заголовок, то файл очень хорошо упаковывается и при этом не мо жет быть открыт в Money, т. к. важная информация, касающаяся структуры таблиц и расположения их в файле, оказывается недоступной.

Однако подобное решение нельзя назвать правильным. Основная часть дан ных оказывается в базе в незашифрованном виде и, при желании, может быть легко извлечена противником.

Encrypted File System Начиная с Windows 2000 операционные системы, основанные на ядре NT, поддерживают Encrypted File System — расширение файловой системы NTFS (New Technology File System), позволяющее хранить файлы пользова телей в зашифрованном виде. При этом шифрование выполняется совер шенно прозрачно и не требует от пользователя никаких дополнительных усилий, кроме однократного указания, что файл должен быть зашифрован.

Даже если противник сможет получить физический доступ к файловой сис теме и прочитать защищенный файл, ему потребуется получить ключ шиф рования для извлечения содержимого.

Симметричный ключ, которым зашифровывается файл (File Encryption Key, FEK), сам зашифрован на открытом ключе, принадлежащем пользователю, имеющему права на доступ к файлу. FEK хранится вместе с зашифрован ным файлом, и для его расшифровки используется секретный ключ пользо вателя.

С каждым файлом может быть ассоциировано несколько копий FEK, за шифрованных на открытых ключах так называемых агентов восстановления (Recovery Agents).

Часть IV. Основные аспекты защиты данных Процедура получения всей необходимой для расшифровки информации включает в себя много этапов. Однако в Windows 2000 реализация EFS тако ва, что в большинстве случаев все зашифрованные файлы могут быть извле чены без знания пароля владельца или агента восстановления.

15.3. Шифрование дисков Еще во времена DOS появились программы, позволяющие создавать защи щенные диски, содержимое которых становилось доступным только после того, как пользователь вводил правильный пароль.

На первый взгляд, защитить информацию в подобных условиях не очень сложно, но разработчики часто не справлялись с поставленной задачей.

15.3.1. Stacker Одной из первых программ, позволявших защищать диски, была программа Stacker, разработанная компанией Stac Electronics, Inc. Точнее, Stacker пред назначался для создания сжатых дисков, поддерживающих упаковку и рас паковку информации "на лету". Но одна из опций позволяла защитить хра нимую на диске информацию паролем.

Однако в программе использовалась плохая вследствие чего сложность подбора пароля, пригодного для расшифровки диска, была всего 2s, т. е. пароль подбирался моментально.

15.3.2. Diskreet Одна из программ, входивших в состав Norton Utilities, Diskreet и была предназначена для создания зашифрованных файлов и дисков.

Diskreet поддерживал два метода шифрования, один из который основывал ся на DES и работал очень медленно, а другой, самодельный и более быст рый, так и описывался в документации: "fast, proprietary method" (быстрый, патентованный метод).

Этот "патентованный" метод оказался очень примитивным и неустойчивым к атаке на основе открытого текста. А разработчики, похоже, приложили максимум усилий для того, чтобы открытый текст было легко найти — за шифрованные файлы изобиловали фрагментами с предопределенными зна чениями.

А согласно информации, приведенной на страничке Password Crackers" созданной Павлом Семья новым, пароль от диска, созданного при помощи Diskreet из Norton Глава 15. Обеспечение секретности Utilities 8.0, просто хранится в файле DISKREET.INI в слегка модифициро ванном виде и может быть извлечен при помощи программы, приведенной в следующем алгоритме (листинг 15.1).

| Листинг 15.1. reetpsw.c •• вычисление пароля void main (void) { unsigned char b, bXor;

FILE *t = fseek (f, 0x64L, SEEK_SET);

for (bXor = 0x35;

b = fgetc (f);

bXor += 0x36) { if ((b bXor) == 0) b = 0x33;

putchar (b);

// здесь выводятся символы пароля ;

-))) } ( f ) ;

15.3.3. BootLock Еще один программный продукт, предназначенный для защиты данных и выпускавшийся, как и Norton Utilities, компанией Symantec, назывался Norton You Eyes Only (NYEO). Одной из составляющих NYEO являлась программа BootLock, позволявшая зашифровать даже загрузочный диск, сделав, таким образом, всю вычислительную систему недоступной для про тивника.

Однако разработчики BootLock по неизвестным причинам приняли решение шифровать не все данные диска, а только системные области: загрузочную запись (Boot) и корневую директорию (Root). А таблица размещения файлов (File Allocation Tables, FAT) и область данных, в которой хранится содержи мое файлов, оказывались незашифрованными.

Шифрование выполнялось путем наложения 512-байтовой гаммы на каж дый шифруемый сектор. Причем для всех секторов одного диска использо валась одна и та же гамма. Следовательно, наличие одного открытого секто ра давало возможность расшифровать все остальные сектора.

Одной из особенностей файловой системы FAT является то, что количество записей в корневой директории определяется при форматировании диска и не может быть ни увеличено, ни уменьшено. Пока на диске не создано ни 186 Часть IV. Основные аспекты защиты данных одного файла, все сектора, относящиеся к корневой директории, заполнены нулями. Информация, описывающая каждый добавленный файл или дирек торию, занимает 16 байт.

Обычно в корневой директории резервируется место под несколько сотен файлов, но редко кто хранит много файлов в корне диска. Следовательно, с очень большой вероятностью в последнем секторе корневой директории за все время не будет ни одной записи, т. е. сектор будет содержать они нули.

А сектор, зашифрованный при помощи BootLock, — гамму, использованную для шифрования.

Причем складывается ощущение, что компания Symantec знала о нестойко сти защиты, обеспечиваемой ее программным продуктом. Во всяком случае, на сайте компании можно было найти информацию о платной услуге по восстановлению данных диска, защищенного BootLock, в случае утери па роля. Стоимость этой услуги составляла всего $ 300 при восстановлении в недельный срок или $ 600 при восстановлении за 24 часа.

Документы PDF Формат переносимых файлов PDF (Portable Documents Format), разработан ный компанией Adobe Systems, Inc., предназначен для хранения документов, представленных в электронной форме. PDF является основным форматом продуктов семейства Acrobat.

Во второй версии спецификации (PDF была добавлена поддержка шифрования, но начальная редакция алгоритма защиты оказалась не очень удачной — похоже, один и тот же ключ использовался многократно при шифровании потоковым алгоритмом Точного описания особенностей реализации этого алгоритма найти не удалось, но официальная документа ция от Adobe гласит, что этот алгоритм не поддерживается и не рекоменду ется к использованию.

Для более гибкого управления процедурой вычисления ключа шифрования продукты семейства Acrobat поддерживают так называемые модули защиты (Security Handlers), которые могут быть подключены через средства расши рения (plug-ins). Изначально Security Handler отвечал только за вычисление ключа шифрования документа, а все операции по шифрованию выполнял сам Acrobat.

Вплоть до версии Acrobat 5.0 ключ шифрования документов по ной информации всегда имел длину в 40 бит из-за экспортных ограничений.

Однако уже в Acrobat Reader 4.0.5 появилась поддержка ключей большей длины, использовавшихся для защиты электронных книг.

Глава 15. Обеспечение секретности Начиная с Acrobat 5.0 (и соответствующей ему спецификации PDF 1.4) бы ли добавлены сразу две новых версии алгоритма защиты, позволяющие работать с ключами длиной до 128 бит. Одна из новых версий была доку ментирована, а вторая формально держится в секрете по требованию депар тамента коммерции США (хотя ее поддержка давно реализована в продуктах сторонних компаний).

Наконец, в Acrobat 6.0 (спецификация PDF 1.5) модуль защиты получил возможность не только вычислять ключ шифрования, но и выполнять само шифрование.

Возможность создания собственных модулей защиты с нужной функцио нальностью привела к тому, что на рынке появилось несколько таких моду лей, разработанных разными компаниями. Рассмотрим основные характери стики некоторых из них.

15.4.1. Password Security (Standard Security Handler) Этот модуль защиты был разработан компанией Adobe и является основным средством защиты, встроенным в Acrobat и бесплатный Acrobat Reader.

При защите документов стандартным методом автор имеет возможность ус тановить два пароля: для владельца и пользователя соответственно. Для того чтобы открыть документ и отобразить его на экране, достаточно знать лю бой из паролей, но некоторые операции, такие как редактирование доку мента, его печать или копирование фрагментов в буфер обмена, могут быть недоступны, если введен пароль пользователя. И, разумеется, настройки за щиты могут быть изменены только в том случае, если документ открыт по паролю владельца.

Часто на документ устанавливается только пароль владельца, а пароль поль зователя остается пустым. При этом документ открывается без запроса па роля, но операции, запрещенные автором, оказываются недоступными.

Очевидно, что если известен хотя бы один пароль или пароль пользователя просто отсутствует, то документ может быть расшифрован и сохранен со снятыми ограничениями. Это нельзя считать ошибкой реализации — это просто свойство, о котором Грубых ошибок в реализации стандартной защиты допущено не было, но несколько недочетов, относящихся к самой популярной версии алгоритма, использовавшей только 40-битовый ключ, найти можно.

Так процедура проверки пароля выполняется очень быстро. Для проверки правильности пароля пользователя необходимо вычислить один раз значе Часть IV. Основные аспекты защиты данных ние хэш-функции MD5 и расшифровать 32 байта алгоритмом RC4. Провер ка пароля требует повторить те же действия дважды. Все это по зволяет подбирать пароли с очень высокой скоростью.

Если же проводится поиск 40-битового ключа шифрования, то для проверки правильности ключа требуется лишь одно шифрование алгоритмом Это позволяет на современном компьютере гарантированно найти клю| примерно за одну неделю.

То, как проверяется правильность ключа шифрования, позволяет тельно сократить среднее время, затрачиваемое на расшифрование одного документа за счет предварительных вычислений и сохранения вспомога тельных данных на диске.

Также один раз перебрав ключей, можно расшифровать любое количест во документов, защищенных стандартным методом.

Все эти недочеты были исправлены с появлением новой версии алгоритма в Acrobat 5. Так для проверки каждого пользовательского пароля теперь тре буется выполнить 51 вычисление MD5 и 20 шифрований RC4. Это снижает скорость проверки паролей в несколько десятков раз. А перебрать клю чей шифрования современный уровень развития технологий не позволяет.

15.4.2. Другие модули защиты от Adobe В Acrobat Reader 4.0.5 появилась поддержка модуля Adobe PDF Merchan Web Buy), предназначенного для защиты электронных книг. До кументы защищались ключами длиной от 64 до 128 бит.

Примерно в то же время получил распространение модуль изначально реализованный в программе GlassBook Reader, разработанной компанией GlassBook, Inc. и предназначенной для покупки и просмотра защищенных электронных книг в формате PDF. Позже Adobe приобрела компанию GlassBook, их Reader оказался переименован в Adobe eBook Reader, a стал основным модулем защиты для тех нологии распространения электронных книг, продвигаемой Adobe (более подробная о защите электронных книг в формате PDF приведена в гл.

Еще один модуль защиты, разработанный Adobe, назывался Acrobat Self-Sign Security и представлял собой первую попытку использова ния схем с открытым ключом в защите PDF-документов, предпринятую в Acrobat 5. Однако эта попытка не имела большого успеха, т. к. не опира лась на существующую инфраструктуру открытых ключей.

На смену Self-Sign Security пришел модуль Certificate Security представленный в Acrobat 6, который уже умел работать Глава 15. Обеспечение секретности с сертификатами, выдаваемыми основными мировыми центрами сертифи кации.

Но оба эти решения относятся скорее к организации защищенного корпо ративного документооборота, чем к обеспечению секретности, и подробно рассматриваться не будут. Хотя для обеспечения секретности они вполне пригодны.

SoftLock (SLCK_SoftLock) Модуль защиты SoftLock, разработанный одноименной компанией, получает 40-битовый ключ шифрования документа следующим образом. При первом открытии документа вычисляется значение, являющееся функцией от иден тификатора документа и некоторых параметров конкретного компьютера (например метки тома диска С), и это значение сообщается пользователю.

В ответ пользователь должен ввести 8-символьный ключ, полученный от продавца документа. На основании полученного от пользователя ключа и параметров компьютера вычисляется и проверяется ключ шифрования документа. Следовательно, при переносе на другой компьютер документ невозможно будет открыть с тем же 8-символьным ключом, т. к. параметры компьютера, а значит, и вычисленный ключ шифрования документа, будут Если бы каждый из восьми символов ключа, вводимого пользователем, мог принимать одно из 95 значений ASCII-символов, доступных на стандартной английской клавиатуре, то общее число комбинаций превысило бы 252.

Однако каждый символ преобразуется в одно из 16 возможных значений, а 2 символа из 8 являются контрольными и не участвуют в вычисле нии ключа шифрования. Таким образом, существует всего 232 различных 8-символьных ключей, и один из них является правильным. Полный пере бор 232 ключей, очевидно, не отнимает много времени и позволяет быстро расшифровать любой документ с защитой SoftLock.

На настоящий момент компания SoftLock уже не существует и модуль за щиты больше не поддерживается.

Newsstand Crypto (NWST_Crypto) Модуль разработанный в NewsStand, Inc., используется для за щиты периодических изданий, распространяемых через Интернет в элек тронной форме. Например, всего за $ 0.65 можно приобрести свежий вы пуск New York Times, находясь при этом в любой точке Земли, откуда есть доступ к Интернету.

190 Часть IV. Основные аспекты защиты NewsStand использует 40-битовые ключи шифрования, но каждый из пяти байт ключа принимает только 16 возможных состояний — от '0' до '9' и от 'А' до 'F. Вследствие этого эффективная длина ключа оказывается равна всего 20 битам, а комбинаций перебираются на современном ре за считанные секунды.

15.4.5. Panasonic Crypto (PSDS_Crypto) Этот модуль использовался для защиты сервисной технической ции к аппаратуре, производимой компанией Panasonic. Формально для лучения доступа к зашифрованным документам требовался ключ защиты, втыкаемый в LPT-порт. Но процедура получения ключа шифрования была реализована не лучшим способом.

Выполнялась только проверка наличия аппаратного ключа без использова-| ния хранимой в ключе информации для расшифровки документов. Кроме того, в результате вычисления ключа шифрования в модуле защиты всегд возвращалось одно из двух возможных 40-битовых значений. То есть доста-J точно было проверить всего 2 ключа для того, чтобы расшифровать любой документ с такой защитой.

15.4.6. KEY-LOK Этот модуль защиты также требует наличия аппаратного ключа для откры тия документов, но, на самом деле, всегда используется один и тот же фик-j сированный 40-битовый ключ шифрования, который жестко прошит в теле модуля защиты.

Весьма занимательно, что в состав SDK для Adobe Acrobat 4 входит пример модуля защиты с названием Rotl3. И в этом примере ключ шифрования также является константой. Видимо, разработчики модуля KEY-LOK не осмелились сильно модифицировать готовый пример, а просто вставили| проверку наличия аппаратного ключа и изменили константу, в качестве ключа шифрования.

Существует как минимум четыре модуля защиты, разработанные компаниек Normex, Ltd. Эти модули называются Normex level Normex level 2 Normex level 3 и demo Скорее всего, эти модули защиты чем-то отличаются друг от друга, но их объединяет одно очень важное свойство — для шифрования документа они используют фиксированные 40-битовые ключи.

Глава 15. Обеспечение секретности То есть достаточно один раз определить значения ключей, которые жестко прошиты в файлах, содержащих код модуля зашиты, после чего любой до кумент можно будет моментально расшифровать.

Liebherr Модуль защиты, разработанный компанией Informationssysteme GmbH, также не обеспечивает никакой секретности, т. к. использует фик сированный 40-битовый ключ шифрования для всех документов.

15.4.9. DocuRights Модуль защиты DocuRights, разработанный компанией Aries Systems Corp., построен несколько нестандартным образом. PDF-документ, с которым имеет дело пользователь, представляет собой контейнер, зашифрованный при помощи стандартного модуля защиты (Standard Security Handler, SSH) с пустым паролем, внутри которого находится другой PDF-документ, но защищенный уже с помощью DocuRights.

Однако такая схема никак не увеличивает защищенность и, скорее всего, используется исключительно для более красивой подачи пользователю формации о том, что у него нет прав доступа к документу. Стойкость защи ты все равно определяется тем, как DocuRights вычисляет ключ шифрова ния. Но здесь разработчики, видимо, решили себя не утруждать, т. к. для шифрования всегда используется постоянный 40-битовый ключ.

FileOpen Publisher Этот модуль защиты разработан компанией FileOpen Systems и является со ставной частью ее продукта FileOpen Publisher, лицензия на который стоит $ 2500.

Согласно рекламе, FileOpen Publisher предназначен для издателей, желаю щих иметь полный контроль над распространением произведений в элек тронной форме. Этот продукт включает в себя инструменты для управления электронной подпиской и аутентификацией конкурирующих пользователей, позволяет создавать документы с ограниченным сроком действия и доку менты, привязанные к конкретным носителям, например CD-ROM. Также издатель имеет возможность ограничивать, когда и в каком объеме можно распечатывать документ.

FileOpen Publisher прошел довольно длинный путь эволюции в области защиты.

Вплоть до версии 2.3 для всех защищаемых документов использовался 40-битовый фиксированный ключ.

192 Часть IV. Основные аспекты защиты данных В версии 2.4 появилась поддержка переменных ключей, но вся информация, необходимая для вычисления ключа, хранилась в самом документе.

В версии 2.5 (самой новой на настоящий момент) была добавлена возмож ность ручного ввода ключа шифрования, который будет использоваться для всех документов, защищаемых в рамках текущего проекта. Этот ключ не хранится в документе, но и он не обеспечивает нормальной защиты по не скольким причинам.

Во-первых, у каждого защищенного документа должен быть свой уникаль ный ключ, и знание ключа к одному документу не должно позволять вы числить ключ к любому другому документу. А это требование не выполняет ся, т. к. у всех файлов одного проекта будет один и тот же ключ.

Во-вторых, ключ шифрования должен генерироваться случайным образом, т. к. человек обычно вводит предсказуемые данные.

А в-третьих, в диалоговом окне, где издателю предлагают вручную задать ключ, можно вводить только цифры. И первые пять введенных символов будут использованы в качестве ключа шифрования. То есть издатель может ввести всего 105 различных ключей, а значит, эффективная длина ключа со ставит менее 17 бит.

FileOpen WebPublisher Этот модуль защиты является составляющей еще одного продукта компании FileOpen, носящего имя и предназначенного для распространения электронных документов и управления доступом к ним через Интернет.

Первая версия WebPublisher2 в каждом документе сохраняла и ключ шифро вания, необходимый для открытия документа. То есть стойкость защиты была нулевой.

После выпуска обновления ключ не сохраняется внутри документа, но его длина составляет всего 40 бит, хотя был выпущен в феврале 2002 а пятая версия Acrobat SDK, включающая все необходимое для поддержки ключей длиной до 128 бит, появился в апреле 2001 года.

Один и тот же ключ шифрования снова используется для всех документов, защищаемых в рамках одного проекта, т. е. один раз затратив вычислитель ные ресурсы на поиск ключа, можно будет расшифровать сразу несколько Ключ снова выбирается не случайно, а задается издателем в файле настроек как ASCII-строка. Это ограничивает множество возможных символов, ис пользующихся в ключе. Да и вряд ли издатель будет вводить истинно слу чайную комбинацию. Так файлы примеров, выложенные на сайте FileOpen, Глава 15. Обеспечение секретности были защищены ключами 'bcdef, 'cdefg', и Образец защищенного документа на сайте Briefsmart шифровался по ключу а компания распространяющая свои файлы под защитой WebPublisher2, использует в ключе только десятичные цифры.

15.4.12. Другие модули защиты Кроме уже перечисленных модулей защиты, существуют и другие.

Так, например, модуль Australian Standards Online использовался для защиты Австралийских стандартов, распространяемых в электронной форме. Этот модуль не содержал грубых ошибок в реализа ции защиты. Но в апреле 2001 года в Standards отказались от ис пользования шифрования при распространении документов, введя при этом защиту на основе водяных знаков.

Уровень защиты, эквивалентный 40-битовому ключу, обеспечивали и моду ли защиты PDFLock (XESC_XELock) и Но эти модули тоже давно не поддерживаются (по неизвестным причинам), и найти какую-либо по лезную информацию о них уже практически невозможно.

В составе продуктов семейства Acrobat версии 5 поставлялся модуль защиты InterTrust.DocBox, разработанный компанией Computing. Но его, ве роятно, тоже постигла печальная участь, т. к. в Acrobat 6 он уже не входит. Хотя сама компания InterTrust продолжает существовать и даже обвиняет Microsoft в том, что последняя нарушает 8 патентов, принадлежащих InterTrust.

Еще существует модуль защиты Authentica Recall Vault), разрабо танный компанией Authentica, Inc., но он нацелен на корпоративный рынок — стоимость лицензии на PageRecall начинается с S 32 500. И досто верных результатов оценки стойкости защиты, обеспечиваемой PageRecall, пока нет.

Таким образом, из доступных на настоящий момент модулей защиты, раз работанных различными компаниями, за исключением Adobe и Authentica, нет ни одного, который бы применял 128-битовое шифрование или хотя бы использовал все ресурсы 40-битового ключа.

И нет никакой надежды, что ситуация в ближайшее время изменится. Если раньше стоимость лицензии на Reader Integration Key, позволяющей ис пользовать модуль расширения в бесплатных версиях Acrobat Reader, со ставляла $ 100 и позволяла создавать любое количество модулей расшире ния, работающих в Reader, то с выходом Acrobat 6.0 все изменилось. Теперь за право доступа к полной версии SDK придется заплатить $ 200, a Reader Integration Key на каждый модуль расширения, предназначенный для сво бодного использования, обойдется в $ 2500.

Pages:     | 1 | 2 || 4 | 5 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.