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

Литература.

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


 

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

74344. ОБЩАЯ ХАРАКТЕРИСТИКА ЗАДАЧИ РАСЧЕТА И АНАЛИЗА УСТАНОВИВШИХСЯ РЕЖИМОВ. ЦЕЛЬ РАСЧЕТОВ. ОСНОВНЫЕ ДОПУЩЕНИЯ ПРИ РАСЧЕТЕ РЕЖИМОВ 95.5 KB
  Естественно такая электрическая цепь обязательно включает в себя ИП и ЭП как составные части и в едином смысле понятие электрической сети формально совпадает с понятием ЭЭС как электрической цепи. При решении ряда задач эксплуатации развития и проектирования электрических сетей необходимо оценить условия в которых будут работать потребители и оборудование электрической сети. Также эти оценки дают возможность установить допустимость анализируемого режима при передаче по сети данных мощностей при подключении новых и отключении...
74345. РАСЧЕТ И АНАЛИЗ УСТАНОВИВШЕГОСЯ РЕЖИМА УЧАСТКА ЭЛЕКТРИЧЕСКОЙ СЕТИ 1.09 MB
  В качестве участка может рассматриваться любой элемент трехфазной электрической сети (линия электропередачи, трансформатор и т.д.), в дальнейшем именуемый также общим термином — электропередача. Предварительно рассмотрим участок — электропередачу, схема замещения которого состоит из одной продольной ветви с сопротивлением
74346. ПРЕДСТАВЛЕНИЕ КОМПЕНСИРУЮЩИХ УСТРОЙСТВ 158 KB
  Создаются возможности регулирования напряжения в узлах сети и на зажимах электропотребителей: Реактивная мощность передаваемая от электростанции и других центральных источников загружает все элементы электрической сети уменьшая возможность передачи активной мощности. Поэтому по экономическим соображениям потребность в реактивной мощности в большей ее части необходимо удовлетворять за счет установки местных источников реактивной мощности. В этом случае уменьшается передача реактивной мощности по участкам сетей: снижаются потери...
74347. Составление схем замещения сетей одного или нескольких напряжений. Учет трансформации 64 KB
  Схема имеет 5 линий различного класса напряжения и 5 подстанций ступеней трансформации. Например если подстанция ПС1 соединяет выводы генератора с ЛЭП 500кВ то возможными напряжениями линий последующих ступеней будут 220 110 и т. Чем ниже напряжение сети тем большее количество линий она имеет и тем меньшая мощность передается по каждой из них.
74348. Электрические параметры режима и параметры схемы замещения. Виды режимов и их характеристика 51 KB
  Электрические параметры режима и параметры схемы замещения. Исходными данными для расчета установившихся режимов служат: схема электрического соединения и параметры сети электроэнергетической системы данные о потребителях и источниках электроэнергии. Нагрузки реальных электрических сетей при их проэктировании и эксплуатации обычно задают значениями потребляемых ими мощностей или токов ЭЭС представляется схемой замещения параметры которой обычно разделяют на продольные входящие в последовательную цепь передачи и распределения...
74349. Виды записи и составляющие полной мощности при сопряженном векторе тока. Векторные диаграммы комплексов мощности и тока 1.21 MB
  Виды записи и составляющие полной мощности при сопряженном векторе тока. Векторные диаграммы комплексов мощности и тока запись мощности при сопряженном токе Рассмотри общий случай при активноиндуктивной нагрузки источник синусоидального тока. Смещение тока относительно напряжения и определяет соотнощение между активной и реактивной составляющими мощности. Это соотношение известно как коэффициент мощности.
74350. Закон Ома для участка электрической цепи. Математическая запись. Падение и потери напряжения. Векторная диаграмма токов и напряжений 525 KB
  Падение и потери напряжения. Закон Ома для участка электрической сети: Ток на участке сети при неизменном сопротивлении пропорционален падению напряжения на участке сети. При неизменном падении напряжения ток на участке сети обратно пропорционален сопротивлению сети Математическая запись: Падение и потери напряжения: Если взять разность показаний вольтметров V1 и V2: эта разность компенсируется потерей или перепадом напряжения. эта величина называется падением напряжения Протекание электрического тока обусловлено...
74351. Характеристика и определение потерь мощности в ЛЭП напряжением 6-500 кВ. Баланс мощности ЛЭП 33.5 KB
  Баланс мощностей является следствием закона сохранения энергии и может служить критерием правильности расчета электрической цепи. а Постоянный ток Для любой цепи постоянного тока выполняется соотношение: 14 Это уравнение представляет собой математическую форму записи баланса мощностей: суммарная мощность генерируемая источниками электрической энергии равна суммарной мощности потребляемой в цепи. Из закона сохранения энергии следует что сумма всех отдаваемых активных мощностей равна сумме всех потребляемых активных мощностей т. 15В...