Анализ защищенности программного обеспечения

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

к граф потоков управления, так и граф потоков данных.

Клонирование кода.

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

 

 

A2=A2` A2?A3Клонирование кода (слева) и внесение недостижимого кода (справа).

 

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

 

Блок-диспетчер.

 

Обфускация данных

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

 

Изменение интерпретации значения бит.

 

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

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

Разделение и объединение переменных.

Для усложнения используемых структур данных в программе можно применять соединение независимых данных или разделение зависимых. Две или более переменных v1,...,vk могут быть объединены в одну переменную V, если их общий размер (v1,...,vk) не превышает размер переменной V. При этом создастся новый поток данных, соответствующий переменной V, на который влияют отношением типа запись потоки данных переменных v1,...,vk. Обратно, переменные фиксированного диапазона могут быть разделены на две и более переменных. Для этого переменную V, имеющую тип Xtype, разделяют на k переменных v1,...,vk типа Ytype, то есть V = v1,...,vk. Потом создается набор функций, позволяющих извлекать переменную типа Xtype из переменных типа Ytype и записывать переменную типа Xtype в переменные типа Ytype. При этом создаются несколько потоков данных, на которые поток данных переменной V влияет отношением запись.

Реструктурирование массивов данных.

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

 

А

B1B2

Метод шифрования программного кода

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

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

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

Можно в