4566

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

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

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

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

Русский

2012-11-22

23.15 KB

29 чел.

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

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

Задание:

  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],. Разложение циклов состоит в том, что цикл с сложным телом разбивается на несколько отдельных циклов с простыми телами и с тем же пространством итерирования.

Литература.

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


 

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

42812. Расчет электродвигателя и его основных характеристик 351.05 KB
  Эквивалентное время работы Эквивалентное число циклов нагружения для колеса для шестерни Базовое число циклов нагружения для колеса для шестерни Коэффициенты долговечности: для колеса для шестерни Базовый предел контактной выносливости для колеса для шестерени Смотри Журнал лабораторных работ табл 11] Допускаемые контактные напряжения для колеса для шестерни SH=1. Эквивалентное время работы при HBср 350 Эквивалентное число циклов нагружения для колеса...
42813. Разработка конструкции и расчёт жатки зерноуборочного комбайна 666.66 KB
  Разработка и расчёт мотовила 4. Регулировка положения мотовила по высоте производится на ходу с помощью гидросистемы трактора. Технические характеристики: Пропускная способность кг с 55 Производительность т ч 72 Приспособления для уборки незерновой части урожая капот измельчитель универсальный измельчительразбрасыватель копнитель Жатка ширина захвата жатки м предварительные установки высоты среза мм скорость срезов ножа срезов мин частота вращения мотовила об мин 41 50 60 50 100 130 180 452 1542 Обмолот диаметр...
42814. Розрахунок електтродвигуна з заданими характеристиками 354.91 KB
  Зазвичай обирається електродвигун з потужністю, яка трохи більша, ніж потрібна. За потрібною потужністю електродвигуна та синхронною частотою обертання обираємо електродвигун з характеристиками, які наведено у таблиці
42815. Расчет электродвигателя мощностью 4000Вт 485.77 KB
  Мощность на выходном валу P= 4000Вт Скорость выходного вала V=1м с Термообработка зубчатого колеса улучшение HB 350 Время работы редуктора L = 15000ч Долговечность роликовых подшипников L10h = 25000ч Выбор электродвигателя. частота 2900 1455 970 730 D вала 42 48 48 55 По таблице выбираем ближайшую стандартную мощность электродвигателя Рэ. Частота вращения вала электродвигателя nвых= об мин где р – шаг резьбы винтовой передачи = 0. Определение частоты вращения валов: nт = nвых = 300об мин – частота вращения вала тихоходной...
42816. Розробка серії графічних елементів портфоліо, відео композиції, художньої графіки 460.5 KB
  Дипломна робота присвячена розробці дизайн проекту на основі розробки сайту, відео презентації, єлектроного та друкованого портфоліо за допомогою теоретичних знань та практичних навичок, які були набуті на протязі навчання з використанням комп’ютерної графіки та сучасних новітніх матеріалів.
42818. установочное приспособление для растачивания отверстия детали «Кронштейн» 1.14 MB
  Изучение закономерности влияния приспособления на точность и производительность выполняемых операций позволяет проектировать приспособления интенсифицирующее производство и повышающее его точность. Проводимая работа по унификации и стандартизации элементов приспособления создала основу для автоматизированного проектирования приспособлений с использованием ЭВМ и автоматов для графического изображения что приводит к ускорению технологической подготовке производства. неподвижная опора с плоской формой рабочей...
42819. Технологический процесс производства детали Вилка 8А67-20275 2.02 MB
  Технологический контроль чертежа детали и анализ детали на технологичность Определяем тип производства по коэффициенту закрепления операций. Определяем величину производственной партии = 1. Определяем массу заготовки: = ; 2. Определяем объем заготовки: = ; 2.