Блог → О защите компьютерных программ от вскрытия. Часть 4

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

1. Место физического размещения защищаемого файла. Поле DOSWRK FCB, как утверждается, было отведено для резерва. Фактически после открытия файла, операционная система размещает в этом поле адрес физического расположения секторов файла на диске, и таким образом, для каждого файла содержимое этого поля является уникальным. Разумеется, это даёт нам шанс использовать поле в целях защиты. Любое копирование файла приведёт к изменению адреса физического расположения секторов файла, а вероятность копирования файла с одного диска на другой с сохранением указанного адреса ничтожно мала, тем более если речь идет о винчестере (это сотни и тысячи мегабайт, представьте какова вероятность "попадания" файла в то же самое место).

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

Возможный порядок установки защиты таков. В начало программы добавляется оператор вызова подпрограммы, ответственной за защиту (для надёжности можно сделать несколько модификаций подпрограммы под разными именами и несколько вызовов). Единственным параметром подпрограммы является имя защищаемого файла. Подпрограмма в области данных должна содержать следующие поля (а чуть ниже я приведу алгоритм работы подпрограммы):
- поле шифра (обозначим PSCH), размерность N байт (величина N остаётся на усмотрение пользователя), содержимое поля - комбинация N любых символов;
- поле первого запуска (PZ), размерность - слово, первоначальное содержимое - 0;
- блок описания файла (FCB).

Шаг 1. В блоке описания файла FCB установить поля FNAME и ENAME, в которых содержится имя файла (программы). Значение данного параметра передаётся в подпрограмму из защищаемой программы.
Шаг 2. Открыть файл.
Шаг 3. Проверить содержимое поля PZ (если 0, то переход к шагу 7).
Шаг 4. Сравнить содержимое полей PSRED и поля D0SWRK из FCB (если не совпало, то переход к шагу 6).
Шаг 5. Закрыть файл. Выйти из подпрограммы.
Шаг 6. Выполнить "ответные" действия по защите. Уничтожить информацию на магнитном носителе или уничтожить данную программу на носителе и перейти к шагу 5.
Шаг 7. Читать файл с магнитного носителя, отыскивая в нем комбинацию из N символов, заданных в поле шифра PSCH. Если не найдено, перейти к шагу 6.
Шаг 8. После PSCH находятся поля PZ и PSRED. Установить PZ в 1. В поле PSRED переписать содержимое поля DOSWRK из FCB.
Шаг 9. Записать в файл отредактированные данные. Перейти к шагу 5.


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

3. Наличие на компьютере "привычных" для пакете драйверов, таблиц, файлов. Простой для реализации, но столь же простой для снятия зашиты способ. Хорошо известно, что люди по-разному относятся к своим привычкам, кто-то способен в течение дня бросить привычный XTREE и перейти на NC. Другой же, даже при появлении XTPRO, XTGOLD еще долго думает, прежде чем изменить пакету. Можно, конечно, рискнуть и ориентироваться на инерционность человеческой психики, но в конечном счёте, время жизни версий большинства пакетов не так уж велико: от силы год или два. И скорее всего, защищаемый вами пакет умрёт естественной смертью раньше, чем произойдёт такое изменение среды его обитания, что он вынужден будет "покончить с собой".

Но если вы всё-таки выбрали данный способ защиты, то помните - для того чтобы посмотреть перечень программ, к которым "привязан" будущий хозяин вашего пакета, совершенно не обязательно обращаться к жёсткому диску. Самая важная информация, имена наиболее популярных программ для данного компьютера и пути к этим программам (AUTOEXEC.BAT) уже содержатся в оперативной памяти (для каждой конкретной версии DOS можно самому предварительно найти эти адреса в оперативной памяти, используя любой отладчик или специальную программу).

4. Наличие заданной последовательности вызовов определенных программ перед запуском защищаемого пакета. Выводы аналогичны предыдущему пункту.

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

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

Модифицированный байт делает программную среду уникальной, а защищённая таким образом программа обязана проверять наличие "своего" байта в файлах операционной системы либо в оперативной памяти, если уже загружена ваша версия "операционки". Удобнее всего модифицировать DOS по принципу изложенному ранее (где речь идёт о способах модификации BIOS), разница лишь в том, что в данном случае следует изменять обработку прерываний DOS, в частности лучше всего самого популярного прерывания 21h.

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

Шаг 1. Защищаемая программа пропускается через модификатор, который модифицирует команды программ, предшествующие команде int21h в части занесения значения в регистр АН или любой другой регистр. Например, заменить везде 9 на 100, 10 на 101 и т.д.
Шаг 2. Инсталлятор модифицированного пакета на машину заказчика осуществляет следующие действия: изменяет атрибуты файла операционной системы, позволяя самому себе туда писать; в месте обработки прерывания 21 h делает безусловный переход (JMP) в область данных, где восстанавливает первую, затертую командой перехода (JMP) команду, за ней размещает команду сравнения 100 с содержимым регистра АН (если значение АН больше 100, то предусматривает вычитание из регистра АН значения 100); осуществляет размещение команды, ответственной за безусловный переход на вторую команду обработки прерывания 21h; восстанавливает первоначальные атрибуты файла IBMBIO.COM.
Шаг 3. Инсталлятор копирует пакет на компьютер заказчика, операционная система которого теперь поддерживает модифицированные изложенным выше образом (шаг 1) программы.

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

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

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

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

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

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

Второй изменяемый параметр при форматировании дорожки - код длины. В процессе форматирования размер каждого сектора определяется индивидуально, благодаря этому существует возможность создать на дискете ряд уникальных секторов с разным кодом длины. Для того чтобы записать данные в выделенные таким образом сектора, необходимо при выполнении операции записи/чтения соответственно изменять указатель размера сектора в таблице базы диска. База диска - это таблица, состоящая из 11 байт, которая содержит ряд параметров, необходимых для работы дисководов, включая и определенную информацию о формате дискет. Адрес таблицы базы диска находится в векторном пространстве по адресу 120, а смещение байта, ответственного за длину сектора, относительно начала таблицы равно 3. Суть метода в том, что обычными средствами DOS подобные сектора не читаются, что позволяет спрятать в них необходимые нам данные.

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

9. Размещение в теле программы в зашифрованном виде данных, которые бы однозначно идентифицировали автора программы и пользователя, которому она была официально продана. В качестве твких данных часто используется строка "(c) ФИО дата" и системный номер программы. Такого рода данные позволят впоследствии применять юридические средства защиты, (которые, впрочем в России не работают).

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

Маскировка

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

Активное противодействие

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