4566

Запутывающие преобразования в программировании

Лабораторная работа

Информатика, кибернетика и программирование

Запутывающие преобразования Цель работы: научится программировать средства затрудняющие изучение программ. Задание: Изучить основные методы обфускации. По заданию преподавателя запрограммировать один из методов. Провести оценку зап...

Русский

2012-11-22

23.15 KB

31 чел.

Запутывающие преобразования

Цель работы: научится программировать средства затрудняющие изучение программ.

Задание:

  1.  Изучить основные методы обфускации.
  2.  По заданию преподавателя запрограммировать один из методов.
  3.  Провести оценку запутывания.
  4.  Написать отчет.
  5.  Защитить у преподавателя.

Методы обфускации для реализации

  1.  Преобразование типов
  2.  Форматирование текста
  3.  Внесение мертвого кода
  4.  Внесение бесполезного кода

Качество обфускации

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

  1.  Эффективность: Насколько программа становится нечитабельной.
  2.  Устойчивость: Насколько сложно взломать программу автоматизированными средствами деобфускации.
  3.  Прозрачность: Насколько хорошо обфусцированный код взаимодействует с остальным кодом.
  4.  Стоимость: Насколько велик объем избыточного кода в обфусцированном приложении.

Основные методы запутывания программ

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

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

  1.  Преобразования структур данных, изменяющие структуры данных, с которыми работает программа. К этой группе относятся, например, преобразование, изменяющее иерархию наследования классов в программе, или преобразование, объединяющее скалярные переменные одного типа в массив.

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

  1.  Преобразование форматирования

Под преобразованием форматирования или лексической обфускацией понимается:

-  удаление всех комментариев в коде программы или изменение их на дезинформирующие;

- удаление различных пробелов, отступов, которые обычно используют для лучшего визуального восприятия кода программы;

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

-  добавление различных лишних (мусорных) операций;

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

Преобразование структур данных

Обфускация структур данных - изменение структуры данных, с которыми работает программа. В нее входят:

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

Преобразование потока управления

Внесение недостижимого кода (adding unreachable code). Если в программу внесены непрозрачные предикаты видов PF или PT, ветки условия, соответствующие условию "истина" в первом случае и условию "ложь" во втором случае, никогда не будут выполняться. Фрагмент программы, который никогда не выполняется, называется недостижимым кодом. Эти ветки могут быть заполнены произвольными вычислениями, которые могут быть похожи на действительно выполняемый код, например, собраны из фрагментов той же самой функции. Поскольку недостижимый код никогда не выполняется, данное преобразование влияет только на размер запутанной программы, но не на скорость её выполнения. Общая задача обнаружения недостижимого кода, как известно, алгоритмически неразрешима. Это значит, что для выявления недостижимого кода должны применяться различные эвристические методы, например, основанные на статистическом анализе программы.

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

Внесение избыточного кода (adding redundant code). Избыточный код, в отличие от мёртвого кода выполняется, и результат его выполнения используется в дальнейшем в программе, но такой код можно упростить или совсем удалить, так как вычисляется либо константное значение, либо значение, уже вычисленное ранее. Для внесения избыточного кода можно использовать алгебраические преобразования выражений исходной программы или введение в программу математических тождеств. Например, можно воспользоваться комбинаторным тождеством и заменить везде в программе использование константы 256 на цикл, который вычисляет сумму биномиальных коэффициентов по приведённой формуле.

Подобные алгебраические преобразования ограничены целыми значениями, так как при выполнении операций с плавающей точкой возникает проблема накопления ошибки вычислений. Например, выражение sin2x+cso2x при вычислении на машине практически никогда не даст в результате значение 1. С другой стороны, при операциях с целыми значениями возникает проблема переполнения. Например, если использование 32-битной целой переменной x заменено на выражение x * p / q, где p и q гарантированно имеют одно и то же значение, при выполнении умножения x * p может произойти переполнение разрядной сетки, и после деления на q получится результат не равный p. В качестве частичного решения задачи можно выполнять умножение в 64-битных целых числах.

Переплетение функции (function interleaving) Идея этого запутывающего преобразования в том, что две или более функций объединяются в одну функцию. Списки параметров исходных функций объединяются, и к ним добавляется ещё один параметр, который позволяет определить, какая функция в действительности выполняется.

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

Развёртка циклов (loop unrolling) Развёртка циклов применяется в оптимизирующих компиляторах для ускорения работы циклов или их распараллеливания. Развёрка циклов заключается в том, что тело цикла размножается два или более раз, условие выхода из цикла и оператор приращения счётчика соответствующим образом модифицируются. Если количество повторений цикла известно в момент компиляции, цикл может быть развёрнут полностью.

Разложение циклов (loop fission) [5],. Разложение циклов состоит в том, что цикл с сложным телом разбивается на несколько отдельных циклов с простыми телами и с тем же пространством итерирования.

Литература.

Анализ запутывающих преобразований программ Чернов А. В., Труды Института Системного программирования РАН


 

А также другие работы, которые могут Вас заинтересовать

13030. ИССЛЕДОВАНИЕ РЕЖИМОВ РАБОТЫ БИПОЛЯРНОГО И ПОЛЕВОГО ТРАНЗИСТОРОВ 3.71 MB
  Лабораторная работа №3 ИССЛЕДОВАНИЕ РЕЖИМОВ РАБОТЫ БИПОЛЯРНОГО И ПОЛЕВОГО ТРАНЗИСТОРОВ Цель работы: Изучение режимов работы биполярного и полевого транзисторов снятие основных характеристик. Приборы: 1. Универсальный стенд. 2. Вольтметры...
13031. Включение биполярного транзистора по схеме с общим эмиттером и полевого транзистора по схеме с общим истоком 628.5 KB
  Лабораторная работа №4. Включение биполярного транзистора по схеме с общим эмиттером и полевого транзистора по схеме с общим истоком. Цель работы: изучение особенностей схем с общим эмиттером /ОЭ/ для биполярного транзистора и с общим истоком /ОИ/ для полевого транз...
13032. Включение транзистора по схеме с общей базой (ОБ) и общим коллектором (ОК) 204.5 KB
  Лабораторная работа № 5. Включение транзистора по схеме с общей базой ОБ и общим коллектором ОК. Цель работы: определение основных параметров схем с общей базой ОБ и общим коллектором ОК. Приборы: Универсальный стенд. вольтметры. Осциллограф. Гене
13033. РАСПРОСТРАНЕННЫЕ СХЕМОТЕХНИЧЕСКИЕ РЕШЕНИЯ, ИСПОЛЬЗУЮЩИЕ ТРАНЗИСТОР В СВОЕЙ ОСНОВЕ 426.5 KB
  ЛАБОРАТОРНАЯ РАБОТА №6 РТ РАСПРОСТРАНЕННЫЕ СХЕМОТЕХНИЧЕСКИЕ РЕШЕНИЯ ИСПОЛЬЗУЮЩИЕ ТРАНЗИСТОР В СВОЕЙ ОСНОВЕ Цель работы: знакомство с наиболее распространенными схемотехническими решениями лежащими в основе радиотехнических конструкций; изучение принципа их ра...
13034. Транзисторный стабилизатор напряжения 711 KB
  Лабораторная работа №7. Транзисторный стабилизатор напряжения. Цель работы: Знакомство и исследование одной из схем стабилизатора напряжения снятие его характеристик. Приборы: Измерительная панель лабораторного стенда. Электронный вольтметр. Авомет
13035. Операционные усилители. Обратная связь, ее влияние на характеристики радиоэлектронных схем (на примере операционных усилителей) 295.5 KB
  Лабораторная работа №9 Операционные усилители. Обратная связь ее влияние на характеристики радиоэлектронных схем на примере операционных усилителей. Цель работы: изучение операционных усилителей и схем выполненных на их основе; исследование влияния обратной с...
13036. Исследование процессов амплитудной модуляции и детектирования амплитудно-модулированных колебаний 208 KB
  Лабораторная работа № 11. Цель работы: исследование процессов амплитудной модуляции и детектирования амплитудно-модулированных колебаний; знакомство со схемами простого радио-передающего и радиоприемного устройств. Приборы: 1. Испытательная панель лаб...
13037. Теплотехника. Методические указания к выполнению лабораторных работ 639.5 KB
  Методические указания к выполнению лабораторных работ по дисциплине Теплотехника для студентов специальностей Методические указания к выполнению лабораторных работ составлены в соответствии с программой по дисциплине Теплотехника для студентов специальнос
13038. ЖКХ. Бухгалтерский учет 1.6 MB
  ЖКХ. Бухгалтерский учет. Согласно общемировой тенденции перехода к смешанной экономике сочетающей различные формы собственности на средства производства в России взят курс на формирование эффективной социально ориентированной рыночной системы. Представление о неэффективност