Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Шифрование кода программы как универсальный метод противодействия отладке и дизассемблированию






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

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

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

Выделяют два способа шифрования кода программы – статическое и динамическое.

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

Реализация простейшей процедуры шифрования/дешифрования кода программы может выглядеть следующим образом:

  LEA SI, beginCrypt; начало зашифрованного блока
Repeat: Xor byte ptr [SI], 077h  
  INC SI  
  CMP SI, offset endCrypt  
  JNA Repeat  
beginCrypt    
   
endCrypt    

При анализе зашифрованных блоков программы дизассемблер выдаст неверные результаты.

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

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







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.