ZX Review
#3-4
22 июля 1997 |
|
Читатель-читателю - В.Сироткин. Защита программ (взгляд на проблему).
ИФК: представленная ниже статья была написана автором до- вольно давно и поэтому не отра- жает самых последних достижений в области установки и снятия за- щит. Однако, как нам представ- ляется, она будет весьма полезна начинающим программистам и хак- керам. С удовольствием предоставим место в журнале для описания са- мых последних достижений в этой области. ┌──────────────────────────────┐ │ В. СИРОТКИН. │ │ ЗАЩИТА ПРОГРАММ │ │ (взгляд на проблему). │ └──────────────────────────────┘ Необходимое отступление... Хочу сразу предупредить, что автор всегда был и будет против всяческих там, как програмных, так и аппаратных защит. Любая "крутая" защита рано или поздно вскрывается, и чем она "круче", тем сильнее желание хаккеров ее снять. Да и вообще, защитить надежно и надолго программу для Спектру- ма практически невозможно. Мож- но, конечно, наворотить гору за- щит, но чем сложней защита, тем больше памяти она занимает в ущерб головной программе. Но и в этом случае, взлом защиты - это лишь дело времени. Да, программам нужна защита, но не программно-аппаратная, а ЮРИДИЧЕСКАЯ ! * * * Но так как программы защи- щают и еще долго будут защищать именно всяческими программно-ап- паратными методами, давайте рас- смотрим, как это можно сделать. В основном, все средства за- щиты информации делятся на 3 ка- тегории, которые тесно перепле- таются и взаимодействуют друг с другом. Защитные меры делятся на: 1. Организационные, (тут и юридические, и экономические, и административные). 2. Программные (кодирование, динамически изменяемая настрой- ка, скрытые переходы, нестандар- тное форматирование и т.д.). 3. Аппаратные (специальные платы доступа, защищенные мик- росхемы типа ULA, новейшая схе- мотехника). Первый способ защиты у нас в стране находится еще в зачаточ- ном состоянии, хотя на Западе он является определяющим в деле програмистского бизнеса. Второй и третий пункты нераз- рывно связаны между собой, и на данный момент являются домини- рующими в защите программ Спек- трума. Остановимся немного на аппа- ратной защите. Сам компьютер Спектрум изна- чально представлял из себя "чер- ный ящик" для непосвященных из- за микросхемы ULA на плате. Та- кая защита оказалась удачной, и долгое время не могли полностью "раскусить" схемотехнику этой секретной микросхемы. Сейчас, когда в стране "хо- дит" не один десяток версий Спектрума, совместимость с про- тотипом, а значит и с програм- мным обеспечением, как раз и оп- ределяется, насколько правильно аппаратно составлена схема из дискретных элементов, заменяющая микросхему ULA. По этому же пути пошли разра- ботчики компьютера "АТМ-ТУРБО", важные узлы которого собраны на микросхемах с заказной логичес- кой прошивкой, которую невозмож- но считать обычными способами, (т.н. микросхемы ПЛИС). Такая защита в конце концов вскрывается, но она делает свое дело, и определенное время раз- работка остается недоступна для пиратского копирования и прино- сит денежный и моральный доход своему автору. Нас же в этой статье будет, прежде всего, интересовать защи- та программная. Механизм защиты программного обеспечения можно свести к сле- дующим пунктам: 1. Блок защиты от "раздевания". 2. Блок защиты от копирования. 3. Блок ответной реакции на "раздевание" или незаконное ко- пирование. 1. В блок защиты от "раздева- ния" входит огромное количество методов и способов, которые ус- пешно (или безуспешно) применя- лись и применяются в программах для Спектрума. Это и нестандартные загрузчи- ки с ленты, и шифрация, и приме- нение недокументированных ко- манд процессора, и самогенери- рующиеся исполняемые команды, и работа во ВТОРОМ прерывании, и контроль времени исполнения от- дельных кусков и многое-многое другое. Весь смысл такой защиты сво- дится к тому, чтобы не дать хак- керу быстренько раскусить глав- ный модуль программы, а запуты- вать хаккера, запутывать и не давать возможности пользоваться всяческими там Мониторами, От- ладчиками и Трассерами. По этому поводу написано уже множество статей и книг, и мы рассмотрим лишь некоторые прин- ципы типичных защит, знание ко- торых будет полезно начинающим программистам. ШИФРАЦИЯ. Это, вообще, тема для тол- стенной книги. В основном, в программах шифрация идет по принципу КСОРКИ (команда XOR). Берется кусок программы и ксорится - или с одинаковым зна- чением, или со значением из ре- гистра 'R', или со значением числа, получаемого в результате арифметико-логических действий. В некоторых программах одна ее часть ксорится со второй частью. Но шифрация может происхо- дить не только с помощью -XOR- команды. Закодировать можно и с помощью арифметических, логичес- ких команд сдвига и ротации. Типичным случаем "крутой" ксорки является следующий при- мер, взятый из одной программы. 148. ; Дизассемблированный листинг модуля дешифратора. START DI ; запрет прерыванию LD A,0 ; обнулим A LD HL,DECODE+1 ; загрузим начальный адрес ; зашифрованного модуля LD BC,#64 ; длина закодированного ; блока LD R,A ; занести значение в ; регистр 'R' LD A,R ; и сразу вернуть для работы IM 2 ; прерывание ДВА 2 (Во-первых, сбивает с толку, во- вторых, участвует в формировании регистра 'R', в-третьих - может зависнуть отладчик при трасси- ровке и в-четвертых - первая ко- манда расксоренного блока может быть 'EI', и программа сразу тогда уйдет на процедуру обра- ботки прерывания). 148. XOR #71 ; расшифруем первый раз XOR HL ; расшифруем второй раз LD (HL),A ; и запишем в память INC HL ; увеличим адрес ; декодируемого блока DECODE DJNZ ADRES ; вернемся, если весь ; блок не расшифрован ; далее следует зашифрованный блок 2 Посмотрев на листинг беглым взглядом, можно и не увидеть, в чем же здесь "крутая" заковыка. А дело в том, что адрес, загру- жаемый вначале в регистр 'HL', указывает на значение смещения в операторе DJNZ. Как раз с этого заначения и начинается дешифра- ция. Что это дает ? А то, что неизвестно, куда замкнут цикл расксоривания. Ис- пользование регистра 'R' для формирования начального ключа декодера не позволяет просле- дить работу дешифратора в поша- говом режиме. Точку останова ставить тоже нельзя, так как она изменится декодером или собьет значение в регисте 'R'. Дать отработать этому куску полностью - тоже не выход: что там идет первыми командами - неизвестно! Единственное, что можно сделать в этой ситуации для "раскалывания", это... А впрочем, поломайте голову сами. Данная программа может приме- няться и как дешифратор, и как шифратор в разные моменты време- ни. А если таких модулей в прог- рамме много и они шифруют - де- шифруют не только головной мо- дуль, но и друг друга, то можно с уверенностью сказать - легкой победы у хаккера не будет. ДИНАМИЧЕСКАЯ ЗАЩИТА. Данный метод включает в себя команды 'JP', 'CALL' по динами- чески изменяемым адресам и само- генерирующиеся исполняемые кус- ки программы (например, в ре- зультате каких-то арифметичес- ких действий). Сюда же можно от- нести работу во ВТОРОМ прерыва- нии, постоянный контроль особо важных кусков методом подсчета контрольной суммы и контроль времени исполнения отдельных мо- дулей программы ( по регистру 'R'). СКРЫТЫЕ (неявные) ПЕРЕХОДЫ. Вместо команд 'JP', 'CALL' можно использовать команды 'RET', 'RETN', 'RETI', предвари- тельно записав в стек нужные ад- реса, полученные каким-нибудь заумным способом. Или же исполь- зовать нестандартные входы в ПЗУ SOS или ТРДОС, где лежат нужные Вам команды. ПРИЕМ "БАБЫ ЯГИ" или бег впереди паровоза. 1. Стек определяется непос- редственно в область исполняемых команд, и данные, сохраняемые в стеке, являются как бы частью генерируемой кодовой последова- тельности. 2. Для каждой подпрограммы выделяется свой маленький стек, лежащий сразу за самой подпрог- раммой, выше по адресам. Первый способ хорошо приме- нять в самосоздающейся програм- ме, которая при генерации испол- няемого кода бежит вверх по ад- ресам, а за ней следом бежит ее стек, затирая следы модуля гене- рации. А за стеком бегут коды генерируемого модуля. Программа, можно сказать, бе- жит впереди паровоза. Второй способ - не только за- путывает взломщика, но и являет- ся хорошей защитой от МАГИК кнопки, так как при нажатии на нее стек текущей подпрограммы кончится, и будут затерты уже рабочие коды. ПУСТЫШКИ. Включение в тело программы важных на вид, но никогда не ис- полнямых кусков, на которые ИМИ- ТИРУЕТСЯ передача управления. В теле пустышки должны при- сутствовать "важные" подпрограм- мы типа "печать", "обращение к диску", "дешифрация" и др. для привлечения внимания хаккера. На разборку таких пустышек обычно тратится много времени и отвле- кается внимание от главного мо- дуля. Можно сделать и иначе. В тело пустышки включить несколько осо- бо важных ключевых команд с не- явными переходами. НЕСТАНДАРТНОЕ КОМПРЕССИРОВАНИЕ. Обычно алгоритмы компрессии программ для Спектрума основаны на подсчете одинаковых повторяю- щихся байтов и записи вместо этого кодовой последовательнос- ти - "вид байта" + "число повто- ров этого байта". Но чтобы запу- тать хаккера, можно придумать и свой, отличный от других алго- ритм компрессии. Это может быть упаковка 2-х смежных байтов в один, компрессия с использова- нием специальных таблиц и т.д. Это тоже сильно снизит темпы вскрытия программы. РАБОТА НА ЭКРАНЕ (в экранном ОЗУ). Это самый распостраненный ме- тод защиты для Спектрума, и, по- моему, этот метод еще остается актуальным. Здесь широкий простор для вы- думки: можно встраивать исполня- емые коды в спрайты, в шрифты, в рисунки. А когда этот рисунок или спрайт будет выводиться на эк- ран, передавать управление на лежащую там программу. Это сильно затруднит трассировку программы отладчиком, если вооб- ще трассировка станет возможна. 2. ЗАЩИТА ОТ КОПИРОВАНИЯ. Все эти вышеперечисленные ме- тоды предназначены для защиты тела программы от взламывания, но если эти меры еще сочетаются с защитой от копирования, то уровень защищенности программы становится на порядок выше. Защита магнитофонных прог- рамм от копирования строится, как правило, на изменении стан- дартных констант сигнала считы- вания или записи. Из наиболее примечательных защит можно привести такие, как: "джерки тон" - плавающая часто- та сигнала, избыточная длина мо- дуля, добавление лишних байтов после байта паритета, гло- бальное изменение структуры сиг- нала, турбо-загрузка, загрузка задом-наперед и другие... Не останавливаясь подробно на магнитофонных защитах (об этом написано уже много книг и бро- шюр), перейдем сразу к рассмот- рению защиты ДИСКОВОЙ. Самые первые защищающие прог- раммы работали по принципу иска- жения информации в каталоге дис- ка. Искажались величины "объем файла в секторах" для БЕЙСИК- программ и изменялись данные в 8-ом секторе нулевой дорожки (байты "количество файлов на ди- ске", байт "двухсторонний - од- носторонний диск", байт "начало и количество свободного места". Весь каталог запутывался так, чтобы копировщик не мог правиль- но скопировать выбранную прог- рамму. Пример тому - программа CLO- SE. Эта программа обнуляет 13-е байты в БЕЙСИК-заголовках, иска- жает байты "начало" и "количест- во свободного места" на диске, тип диска, количество файлов на диске. Изменению также подверга- ется имя первого файла на диске: в него вводится "непечатающийся" код. Программы на диске после та- кой защиты запускаются как обыч- но, так как измененные байты в процессе запуска не участвуют. Это простая защита, но коман- де ТРДОС "COPY" или копировщикам типа MOA-SERVICE здесь уже де- лать нечего. С такого диска надо или снимать защиту, или (что проще) скопировать его ТРЕКОВЫМ копировщиком. * * * Следующим методом защиты яв- ляется способ искажения всей ин- формации в области каталога. Вся служебная информация заголовков забивается нулями или фальшивыми данными. В этом случае необходима программа с именем 'boot', кото- рая имеет "правильный" заголовок и содержит в себе таблицу всех "правильных" заголовков на дис- ке. Эта программа должна иметь загрузчик (естественно, НЕ на БЕЙСИКЕ), который бы умел загру- жать кодовые блоки программ с диска, исходя из значений внут- ренней таблицы. Можно сделать несколько иначе и написать для каждой программы отдельный загрузчик в виде фай- ла. Запомнить дисковые "коорди- наты" этих файлов (это длина блока, номер начального сектора, начальный трек) и сразу же иска- зить/стереть эти координаты из каталога. Для вызова этих загрузчиков необходима головная программа, в которой будет истинная информа- ция о загрузчиках и процедура их считывания и запуска. Естественно, загрузчики дол- жны быть зашифрованы и закодиро- ваны, а то все вышеизложенное потеряет всякий смысл. Но и в этом случае потреко- вое копирование всего диска сво- дит такую защиту на нет ! Логическим продолжением вы- шеприведенного метода стал спо- соб расположения загрузчиков или на служебных дорожках диска (83-85 цилиндры) и/или в нестан- дартных секторах (номер сектора больший чем 16, и/или длина сек- тора <> 256 байтам). В этом случае необходима программа нестандартного форма- тирования, а это, как Вы пони- маете, работа на самом низком уровне, через ПЗУ ТРДОС. Диски с такой защитой "не бе- рутся" обычными трековыми копи- ровщиками и являются достаточно защищенными для коммерческого распостранения. С точки зрения хаккера такой диск копируется достаточно лег- ко. Необходимо просканировать структуру формата всех дорожек диска (например, программой "ADS" или через команду ВГ93 "ЧТЕНИЕ ДОРОЖКИ ЦЕЛИКОМ"; #E0), выудить все "неправильные" сек- тора и дорожки. Далее отформатировать диск с аналогичным форматом и, скопиро- вав сначала защищенный диск обычным трековым копировщиком, докопировать все "неправильные" сектора и дорожки при помощи функций ТРДОС (C = #05 - чтение сектора и C = #06 - запись сек- тора). Высшим программным пилотажем в деле защиты является способ глобального изменения способа форматирования. Например, в область "пробе- лов" заносятся байты, отличные от байта #4E. Изменяется длина "пробела". Тип сектора (т.е. его длина) указывается байтом, большим чем 3, что, в принципе, указывает на величину сектора > 1024. Байт "сторона диска" и "номер дорожки" тоже указывают- ся "с потолка"... Головная же программа на та- ком диске должна опрашивать эти нестандартные величины и прихо- дить к выводу: "родной или не родной это диск?". Для копирования такого диска Вам потребуется знать не только точные номера секторов, их дли- ну и количество на дорожке, но и вообще всю структуру формата. Выход тут один - скопировать формат каждой дорожки бит в бит. Сделать такую программу не так уж и сложно, надо помнить только один момент: КАК БЫ НИ БЫЛ ИЗМЕНЕН ФОРМАТ, НЕКОТОРЫЕ БАЙТЫ И ИХ ПОСЛЕДОВА- ТЕЛЬНОСТЬ ЯВЛЯЮТСЯ ОБЯЗАТЕЛЬНЫМИ !! Обязательными являются байты (уже записанные) и их последова- тельность (по порядку следова- ния): #A1,#FE -адресная метка индекса, данные о дорожке и секторе; #A1,#FB -адресная метка данных. Вывод отсюда прост и очеви- ден... Да простят меня многие, кто защищает свои диски от копирова- ния - ниже я привожу краткий ал- горитм универсального, всефор- матного копировщика дисков. 1. Прочитать командой кон- троллера #E0 всю дорожку цели- ком в ОЗУ, через подпрограмму ТРДОС #3FDB <#3FE5> (дать коман- ду 4-5 раз для верности). 2. По меткам IAM определить: сколько секторов на дорожке, длину секторов и НОМЕРА секто- ров. Запомнить где нибудь полу- ченные данные. 3. Программно проанализиро- вать и изменить считанный дамп: а) если байт МЕНЬШЕ, чем #F4 - оставить без изменения; б) если байт РАВЕН #A1, вместо него вписать #F5 и вписать по adrs-1 и adrs-2 от этого места то же самое, если по adrs+1 код #FE или #FB; в) если байт РАВЕН #FE - оста- вить; г) если байт РАВЕН #FB - оста- вить; д) вместо ШЕСТОГО байта (пер- вые байты от #A1; #FE) ПОСТАВИТЬ байт #F7 (здесь должны быть 2 байта контрольной суммы); е) далее Вы должны просто про- пустить область данных. Длина области зависит от типа сектора и ПЕРВЫЙ БАЙТ ПОСЛЕ области ДАННЫХ НЕОБХОДИМО заменить бай- том #F7 (2 байта контрольной суммы); ж) Перейти к пункту "а)" и пов- торять до тех пор, пока не кон- чится весь дамп дорожки. 4. Теперь, когда дамп форма- та у нас готов, записать его на соответствующую дорожку другого ДИСКА командой #F4 через под- программу TRDOS #3FC0 <#3FCA> (повторить запись 4-5 раз для верности). - Проанализировать, какие номе- ра секторов проставлены в форма- те и их количество. - Считать с копируемого диска соответствующие сектора (можно даже функцией ТРДОС, но только по ОДНОМУ сектору) в отведенный буфер в ОЗУ. - Записать соответствующие сек- тора из буфера ОЗУ на диск с на- шим форматом. - Повторить все снова для ос- тальных дорожек. Данную программу целесообраз- но настроить для ДВУХ дисково- дов, но можно и для одного (тог- да у Вас через 3 минуты заболит рука, меняющая диски в дисково- де). Дальнейшее усложнение защит- ных мер от копирования можно направить по пути "лазерных ды- рок" и "плавающих байтов'. Мож- но также пойти по пути записи в область пробела байтов больших, чем #F4 (без участия микросхемы ВГ93 - иначе не получится). Но и для этих способов защи- ты найдутся контрмеры. Можно только признать, что не оскуде- ла земля хаккерами. Да и арсенал средств снятия защит гораздо бо- лее изощрен и многочисленен, чем арсенал для их установки. В заключение этой статьи нес- колько слов о последнем блоке в комплексе защит. Это блок "от- ветной реакции" на взламывание или незаконное копирование. Тут уж широкий простор для фантазии: от угрожающих надписей, гудков, попыток стирания/форматирования диска до попыток "сломать" дис- ковод, давая ему команды "выйти на 255 цилиндр" или "найти 243 дорожку".
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября