Метод   взлома   хитрых  защит:  1.  Пишется  программа,  которая
переводит  процессор  в  виртульный  режим  и запускает легальную
копию  взламываемой  программы.  ри  этом  исследуемой  программе
запрещаются:  все  операции ввода-вывода (через порты ); доступ к
сегментам памяти, котрые могут быть использованы для нужд системы
защиты  (например,  вся область ПЗУ, так как может использоваться
его контрольная сумма, область данных BIOS и др.) 2. Если система
защиты  попытается  воспользоваться  теми  командами  и областями
памяти, доступ к которым ей запрещен, то через механизм обработки
особых  ситуаций  эти  попытки  легко обнаруживаются, и снимается
протокол   обмена  информацией.  3.  Пишется  загрузчик,  который
запускает  нелегальную  копию  в  виртуальном  режиме и полностью
эмулирует  процесс  получения информации так,что у системы защиты
создается  иллюзия  штатной  работы.  Как  и в предыдущем случае,
данный  метод  легко  поддается  автоматизации. Однако есть смысл
написать   полуавтоматический   взломщик.  Это  даст  возможность
опытным    путем   подобрать   минимальный   набор   ограничений,
накладываемых  на  снимаемую  защиту.  В  противном случае размер
файла,   содержащего   протокол  поддержки  защиты,  может  резко
возрасти.  АНТИВИРУСНАЯ  ОБОРОНА. Большинство антивирусных систем
работают  стандартным  образом.  Они  или  проверяют  выполняемые
программы  на  наличие заражения по какимлибо признакам (прямым -
присутствие  в  программе,  на  диске или в памяти в определенном
месте  заранее  известной  кодовой цепочки; косвенным - изменение
длин  файлов, контрольных сумм и др.), или, постоянно присутствуя
в  памяти  машины  (в  виде  резидентных программ или драйверов),
контролируют  жизненно  важные точки операционной системы. Однако
все  подобные  системы защиты от вирусов являются рудиментарными,
вследствие  того,  что  MS DOS сама по себе полностью беззащитна.
Поэтому здесь можно говорить лишь о попытках залатать те или иные
дыры,  но  никоим  образом  не о глубоко эшелонированной и хорошо
продуманной  обороне.  Положение  резко  изменится,  если  начать
использовать  над  стройки  DOS,  работающие  в защищенном режиме
(protekted   mode).   Эти   программы   так  распределяют  уровни
привилегий при запуске пользовательских программ, что если даже в
последних  и содержится вирус, то он все равно не сможет поразить
операционную  систему.  Любая  злодейская  попытка  будет  тут же
пресечена  при  помощи механизма обработки критических ситуаций (
процессоры   i286   и  старше  расценивают  попытку  "залезть"  в
запрещенный   сегмент   или   выполнить   запретную  команду  как
критическую  ситуацию  и  вызывают  соответствующий  обработчик).
Теперь  ликуй пользователь, ты надежно защищен! Но... Опять то же
самое  проклятое "но". Система защиты процессора основана на том,
что   каждому   сегменту   памяти   присваивается   свой  уровень
привилегий.     Если    программа,    расположенная    в    менее
привилегированном    сегменте,   попытается   залезть   в   более
привилегирванный   сегмент,   то  процессор,  который  легко  это
обнаруживает,  формирует  критическую ситуацию. При этом контроль
соответствия    уровней   привилегий   осуществляется   полностью
автоматически.   Информация   об   уровнях  привилегий  сегментов
содержится   в  глобальной  дескрипторной  таблице  (GDT),  адрес
которой  хранится  в  регистре  GDT.  Так  как на этой информации
зиждется  вся  система  защиты процессора, то имеется возможность
запретить  низкопривилегированным  программам изменять содержимое
регистра  GDT,  а  путем  присвоения  сегменту  с  GDT  наивысшей
привилегии  можно  перекрыть  возможност  ее несанкционированного
изменения.   Именно   так   и   поступают  операционные  системы,
работающие  в  защищенном режиме. Своим сегментам они присваивают
наивысший  уровень  привилегий,  а  всем  порожденным процессам -
более  низкий. Как же прорвать эту защиту? Ясно, что полностью ее
обезвредить  можно  только  путем  изменения уровней привилегий в
GDT.   И   сделать   это  оказывается  очень  просто.  Достаточно
использовать   такой   метод   доступа   к   памяти,  который  не
контролируется  процессором,  и  имя  этому  методу - ПДП (прямой
доступ  к  памяти).  Действительно,практически  во  всех системах
компьютеров   имеются  контроллеры  ПДП,  без  которых  немыслима
маломальски   терпимая  работа  с  жесткими  и  гибкими  дисками,
стримерами,сканерами   и   другими   устройствами.   Именно   эти
контроллеры и можно использовать для взлома системы безопасности.
Итак,  метод прорыва колец защиты виртуального режима (представим
себя      вирусом,      пытающимся      заразить      компьютер):
-------------------------------------------------------------  1.
Проверим,  в  каком  режиме  нас  запустили.  Если в реальном, то
никаких  хлопот,  а  если в виртуальном, то придется попотеть. 2.
Прочитаем  адрес  глобальной дескрипторной таблицы (регистр GDT),
благо, что разработчики i286 не предусмотрели возможности запрета
операции  чтения  регистра  GDT  (LGDT),  как  они  это сделали с
операцией  записи в регистр GDT(SGDT). 3. Отведем в нашем сегмете
достаточно  места под буфер для копии GDT. 4. Настроим контроллер
ПДП  на  передачу  информации  из  сегмента  с  GDT наш буфер. 5.
Заставим  контроллер  скопировать  необходимое нам число байт. 6.
Внимательно  изучим  полученную  копию GDTи найдем в ней свои сег
менты.  7.  Назначим  своим  сегментам  наивысшие  привилегии. 8.
Скопируем   подправленную   GDT   на  прежнее  место  (опять-таки
пользуясь  ПДП).  9.  А  теперь  -  делаем, что хотим! Искушенный
программист  сразу  заметит,что данный способ можно заблокировать
путем  запрета пользовательским программам выполнения команд IN и
OUT (чтения и записи портов ввода-вывода), без которых невозможно
настроить  контроллер  ПДП. Однако в этом случае программирование
на   персоналке  потеряет  всю  свою  прелесть  и  превратится  в
монотонную  и  рутинную  работу,  ибо  программист не сможет даже
запрограммировать  адаптер  EGA/VGF (а это означает, что придется
распроститься  даже  с  русификацией  дисплея).  Другим  способом
противодействия  может  стать  регулярное  сравнение операционной
системой   текущей   GDT  с  ее  резервной  кипией.  При  наличии
рассогласования  необходимо  производить расследование ее причин.
Но  нельзя  слишком часто выполнять такое сравнение, так, как это
приведет  к  значительной  потере производительности. Это значит,
что  все равно всегда найдется временое окнодля вирусной атаки. И
главный  выход  здесь  заключается  в  том,  что,  хоть  на самое
короткое  мгновение,  вопреки всем стражам все-таки можно сломать
систему  колец  защиты  процессора i286. Каков же способ борьбы с
напастями?  Не  пользуйтесь  ворованными программами! К сожалению
этот  простой  совет практически не выполним в наших условиях. Не
каждый  сможет  выкроить  свободных долларов этак 200 для покупки
необходимого  пакета,  а то, что продается за рубли, либо слишком
дорого  для  рядового пользователя, либо несколько не то, что ему
нужно.  Вот  так  и складывается знакомая до боли ситуация, когда
позволить  себе  хоть  что-нибудь  купить  могут  только  богатые
предприятия.Руководители  же этих предприятий в большинстве своем
считают, что покупать нужно все, что угодно, только не программы.
Зачем  покупать,если  можно  просто  списать?! Выход у нас только
один-постепенное  формирование  рынка  программного  обеспечения.
Только  при наличии такого рынка (и при его поддержке полноценной
законодательной  защитой авторских прав) могут увеличиться тиражи
программ,  а  следовательно,  упадут  цены.  Но пока рынок только
формируется   ,  а  то,  что  его  заменяет,  дико  по  творимому
беззаконию,  и  поэтому  надо защищаться от воров самим."Спасение
утопающих  -  дело рук самих утопающих...", и перед разработчиком
со    всей    остротой    встает    проблема    защитыограмм   от
несанкционированного   копирования.   ОБЩАЯ   СТРУКТУРА  ЗАЩИТНЫХ
МЕХАНИЗМОВ. Как весь комплекс мероприятий защиты, так и отдельные
ее  элеметы  испытаны природой на всех уровнях развития:в неживой
природе, на биологическом уровне и в человеческом обществе. Каким
образом   это  происходит?  Система  взаимодействующих  элементов
защищена от изъятия ее из интегрирующей системы благодаря наличию
разнообразных взаимодействий с внешними элементами на физическом,
химическом,  биологическом  уровнях.Нормального  функционирования
изъятой системы в чужой для нее итегрирующей среде можно добиться
только   исключительно   точным   перенесением  вместе  с  ней  и
окружающих  взаимовлияющих внешних сил. Программа, пересаженная в
другую   среду,   должна  быть  отторгнута,  как  отторгаются  от
организма  пересаженные  чужие ткани. при этом процесс отторжения
может  вызвать  необратимые изменения и в самом "организме" ПЭВМ.
Для  реализации  механизма отторжения необходимо, чтобы программа
имела  возможность  предварительно  "привыкнуть" к своей среде, а
взаимодействие ее с чужой средой приводило к мгновенной гибели ее
самой,  окружающей  среды  или  носило на себе следы постепенного
разрушения.   Механизм   защиты   программного  обеспечения,  как
подсказывает опыт раты в данной области, может включать следующие
компоненты:  1.  Блок  защиты  от  Раздевателя  (БЗОР).  2.  Блок
установки   характеристик   среды   (БУХС).   3.  Блок  сравнения
характеристик  среды  (БСХС).  4.  Блок  ответной  реакции (БОР).
ЗАЩИТА   ОТ   РАЗДЕВАТЕЛЯ.  РАЗДЕВАТЕЛЬ  -  комплекс  программных
средств, ориентированных на исследование защищенного программного
продукта.  Возможно,  этот  термин  является  не очень удачным. В
данном случае, мы отдаем дань существующей жаргонной терминологии
профессиональных хэкеров. Главная фкнкция БЗОР заключается в том,
чтобы  обеспечить  надежную  защиту от профессиональных любителей
"раздевать"  чужие  программы,  т.е.  снимать  защиту  с  пакетов
программ.Ниже  изложены  некоторые способы, которые направлены на
выявления  и  ликвидацию непредусмотренных внешних воздействий на
защищаемую  программу, характерные для средств снятия защиты. Для
снятия  защиты  используется  комбинация  двух  основных методов:
статический  и  динамический.  Статические методы предусматривают
анализ   текстов   защищенных   программ   в  естественном  и/или
преобразованном   виде.   Динамические   методы   предусматривают
слежение   за   выполнением   программы   с  помощью  специальных
средств.Обработка  результатов  слежения  может быть частично или
полностью  автоматизирована  ПРОТИВОДЕЙСТВИЕ  СТАТИЧЕСКИМ МЕТОДАМ
ЗАЩИТЫ. 1. Шифроваие. Модификация и шифрование прграммного кода -
типичные способы внесения особенностей в программную среду. Очень
эффективно  изменения способа шифрования в ходе работы программы.
В  качестве  примера  приведем программу CRYPT.EXE (v.1.3 Mamsoft
1989),  которая  использует алгоритм US Federal DES. Вообще, тема
шифрования  и  дешифроваия  немсчерпаема,  как  атом,и мы отошлем
интересующихся   к   специальным  публикациям,  например  [9,1О].
2.Включение  в тело программы переходов по динамически изменяемым
адресам   и   прерываниям,   а  также  самогенерирующихся  команд
(например,  команд, полученых с помощью сложения и вычитания). 3.
Скрытый  переход.  Вместо  команды  безусловного  перехода  (JMP)
используется  возврат из подпрограммы RET). Предварительно в стек
записывается  адрес  перехода, который в процессе работы программ
модифицируется  непосредственно  в  стеке.  4. прием " Бабы Яги".
Стек  определяется  непосредственно в области исполняемых команд,
что  приводит к затиранию команд при работе со стеком.Этот способ
хорош,  когда не требуетсяповторное исполнение программного кода.
Таким  же способом можно генерировать исполняемые команды впереди
вычислительного  процесса. 5. Включение в тело программы, если ее
размер  недостатчно велик, "пустышек". Под "пустышкой" понимается
модуль,  на  который  имитируется передача управления, но реально
никогда не осуществляется.Этот модуль содержит большое количество
команд,  не имеющих никакого отношения к логике работы программы.
Но   "ненужность"   этих   команд   не   должна   быть   очевидна
потенциальному   хэкеру.  Например,  "пустышка"  может  содержать
команды,  присущие  определенным методам защиты, это команды типа
int  21h,  int 13h со специфическими функциями и т.д. Потрошитель
программы  обязательно  обратит  внимание  на эти команды, начнет
разбираться  с  ними  и этим самым потеряет драгоценное время. 6.
Изменение  защищаемой  программы таким образом, чтобы стандартный
дизассемблер  не  смог  ее правильно дезассемблировать. Например,
такие  пакеты  защиты  как  НОТА  и  Copylock,  внедряя  защитный
механизм  в  защищаемый  файл,  полностью  модифицирует  исходный
заголовок  EXE-файла. Ниже приведен пример заголовка EXE-файла до
защиты  и  с  защитой.  В  данном  случае уже можно говорить не о
внедрении  защитного  механизма  в задачу, а наоборот,о включении
исходной  защищаемой  задачи в модуль защитного механизма (пример
2.1).    ПРОТИВОДЕЙСТВИЕ    ДИНАМИЧЕСКИМ   МЕТОДАМ   ЗАЩИТЫ.   1.
Периодический  подсчет контрольной суммы занимаемой образом задаи
области оперативной памяти в процессе выполнения. Это позвояет: -
заметить  изменения,  внесенные  в загрузочный модуь; - в случае,
если  программу  пытаются  "раздеть",  выявить контрольные точки,
установенные отадчиком. 2. Проверка количества свободной памяти и
сравнения  с  тем  объемом,  к  которому задача привыкла ии Вы ее
приучили.  Это действие позволит застраховаться от слишком грубой
слежки  за  Вашей  программой  с  помощью резидентных модулей. 3.
Проверка  содержимого  незадействованных  для  решения защищаемой
программыобастей   памяти,   которые   не   попадают   под  общее
распределление  оперативной  памяти,  доступной для программиста,
что позволяет добиться "монопольного" режима работы программы. 4.
Проверка содержимого векторов прерываний ( особенно 13h и 21h) на
наличие  тех  значений, к которым задача приучена. Иногда поезным
бывает    сравнение    первых    команд   операционной   системы,
отрабатывающих  эти  прерывания,  с  теми  командами, которые там
должны быть. Вместе с предварительной очисткой оперативной памяти
проверка  векторов  прерываий  и их принудительное восстановление
позволяет  избавиться  от  большинства  присутствующих  в  памяти
резидентных   программ.  5.  Переустановка  векторов  прерываний.
Содержимое  некоторых  векторов прерываний (например, 13h и 21h )
копируется   в   обасть   свободных  векто-  ров.  Соответственно
изменяется  и  обращение  к  прерываниям.  При  этом  сежение  за
известными  векторами  не  даст  желаемого  результата. Например,
самыми   первыми   исполняемыми  командами  программы  копируется
содержимое  вектора  21h ( 4 байта ) и вектор 60h, вместо команды
int  21h  в  программе  везде  записывается  команда  int  60h. В
результате  в  явном  виде  в тексте вашей программы нет ни одной
команды  работы  с  прерыванием  21h.  Очень  просто и изящно. 6.
Постоянное чередование команд разрешения и запрещения прерывания,
что  затрудняет  установку отадчиком контроьных точек. 7. Контроь
времени  выполнения  отдельных  частей  программы,  что позволяет
выявить "остановы" в тее исполняемого модуя. Многие перечисленные
защитные  средства  могут быть реализованы исключительно на языке
Ассембер.  Одна  из основных отичитеьных особенностей этого языка
закючается  в том, что дя него не существует ограничений в обасти
работы  со  стеком,  регистрами,  памятью, портами ввода/вывода и
т.д.  Ниже  приводятся  наиболее  красивые,  на наш взгяд, приемы
защиты  программного кода, например прием " Бабы Яги". Суть: стек
опредеяется  непосредственно  в  обасти  исполняемых  команд, что
приводит  к  затиранию команд при работе со стеком. Программа как
бы заметает за собой все следы. В данном сучае важно именно в тот
момент,  когда  верхушка  стека  приблизится к исполняемому коду,
выполнить  JMP  и  уйти от преследования. Этот прием очень хорош,
если  не  требуется возвращаться обратно. Ниже предагается пример
приема  "Бабы  Яги":  слева  -  содержимое  экрана  при  работе с
отадчиком   (на   экране   дизассемблерный  текст  программы)  до
выполнения  команды по адресу CS:000A; справа - содержимое экрана
при  работе  с  TD ( та же программа ) посе выполнения команды по
адресу CS:000D.
 

Оставит комментарий