308.89K
Категория: ИнформатикаИнформатика

Обфускация программного кода

1.

Обфускация программного
кода

2.

• Защита ПО преследует следующие цели:
• ограничение несанкционированного
доступа к программам или их
преднамеренное разрушение и хищение;
• исключение несанкционированного
копирования (тиражирования) программ.

3.

Защита на стороне сервера

4.

Водяной знак (software watermark)
и отпечаток пальца.
Такая скрытая информация, обозначим ее "W"
(которая и называется водяным знаком), должна
быть записана в программу "Р", таким образом,
чтобы:
• "W" было надежно расположено (запрятано) в "Р",
и могло быть впоследствии извлечено, без каких
либо изменений (повреждений).
• "W" не влияло на работу "Р".
• "W" несло какую-то определенную информацию,
которая позволит доказать, то что ее присутствие в
"Р" неслучайное, то есть является результатом
преднамеренных действий.

5.

Установка подлинности кода
(tamper-proofing).

6.

Пути проверки
• проверка идентичности оригинальной и запускаемой
программы. Обычно для этого определяется контрольная
сумма запущенной программы, которая потом сверяется с
записанной в процедуру проверки, контрольной суммой
оригинальной программы. Для осуществления быстрой
проверки, используют такие алгоритмы: CRC или MD4/5
(алгоритмы резюмирования сообщений).
• проверка результатов работы программы. То есть
осуществляется проверка выходных значений функций,
которые очень чувствительны, к каким либо возможным
изменениям в программном коде.
• создание запускаемой программы на лету, в соответствии с ее
оригинальным образом. Это позволяет избежать возможности
выполнения изменений внесенных в программу, так как они не
будут учитываться при ее создании.

7.

Шифрование программного кода.

8.

Возможности обхода
• Изготовление аппаратной копии ключа. Этот метод
основывается на считывании содержимого микросхемы
памяти ключа, после чего полученные данные
переносятся в микросхему другого ключа. Способ этот
достаточно трудоемкий и может применяться, если
память ключа не защищена от считывания.
• Изготовление эмулятора ключа. Заключается в создании
программы (драйвера), которая эмулирует работу
электронного ключа, в результате защищенная
программа сможет работать без электронного ключа,
для этого перед ее запуском нужно будет всеголиж
запустить программу эмулятор.

9.

Обфускация, как один из методов
защиты программ

10.

Процесс обфускации
Пусть "TR" будет трансформирующим процессом,
тогда при "PR1 =TR=> PR2" программа "PR2" будет представлять собой
трансформированный код программы "PR1". Процесс трансформации
"TR" будет считаться процессом обфускации если, будут
удовлетворены такие требования:
• код программы "PR2" в результате трансформации будет существенно
отличаться от кода программы "PR1", но при этом он будет выполнять
те же функции что и код программы "PR1", а также будет
работоспособным.
• изучение принципа работы, то есть процесс реверсивной инженерии,
программы "PR2" будет более сложным, трудоемким, и будет
занимать больше времени, чем программы "PR1".
• при каждом процессе трансформации одного и того же кода
программы "PR1", код программ "PR2" будут различны.
• создание программы детрансформирующей программу "PR2" в ее
наиболее похожий первоначальный вид, будет неэффективно.

11.

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

12.

Оценка процесса обфускации
(аналитическая)
• Устойчивость - указывает на степень сложности
осуществления реверсивной инженерии над кодом
прошедшим процесс обфускации.
• Эластичность - указывает на то насколько хорошо
данный процесс обфускации, защитит
программный код от применения деобфускаторов.
• Стоимость преобразования - позволяет оценить,
насколько больше требуется системных ресурсов
для выполнения кода прошедшего процесс
обфускации, чем для выполнения оригинального
кода программы.

13.

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

14.

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

15.

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

16.

Методы:
• изменение интерпретации данных определенного типа.
Как известно сохранение, каких либо данных в
хранилищах (переменных, массивах и т.д.)
определенного типа (целое число, символ) в процессе
работы программы, очень распространенное явление.
• изменение срока использования хранилищ данных,
например переход от локального их использования к
глобальному и наоборот.
• преобразование статических (неменяющихся) данных в
процедурные.
• разделение переменных.
• изменение представления (или кодирование).

17.

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

18.

Методы:
• объединение переменных. Две или более переменных
"v1,...,vk" могут быть объединены в одну переменную "V", если
их общий размер ("v1,...,vk") не превышает размер переменной
"V«
• реструктурирование массивов, заключается в запутывании
структуры массивов, путем разделения одного массива на
несколько подмассивов, объединения нескольких массивов в
один, сворачивания массива (увеличивая его размерность) и
наоборот, разворачивая (уменьшая его размерность).
• изменение иерархий наследования классов, осуществляется
путем усложнения иерархии наследования при помощи
создания дополнительных классов или использования ложного
разделения классов.

19.

Обфускация управления
• Обфускация такого вида осуществляет запутывание
потока управления, то есть последовательности
выполнения программного кода.
• Большинство ее реализаций основывается на
использовании непрозрачных предикат, в качестве,
которых выступают, последовательности операций,
результат работы которых сложно определить (само
понятие "предикат" выражает свойство одного
объекта (аргумента), или отношения между
несколькими объектами).

20.

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

21.

• Обфускация соединения. Объединение
или разделение определенных фрагментов
кода программы, для того чтобы убрать
логические связи между ними.

22.

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

23.

• трансформация циклов. Циклы встречаются в
коде различных программ, и их также можно
придать трансформации
• Развертка циклов, повторение тела цикла один
или более раз (если количество выполняемых
циклов известно в процессе осуществления
обфускации (например, равно "N")
• Разделение циклов, цикл состоящий из более
чем одной независимой операции можно
разбить на несколько циклов

24.

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

25.

На уровне исходных текстов
int COUNT = 100;
float TAX_RATE = 0.2;
for (int i=0; i<COUNT; i++)
{
tax[i] = orig_price[i] * TAX_RATE;
price[i] = orig_price[i] + tax[i];
}
Код после обфускации:
for(int a=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a]+b[a];}
• На уровне машинного кода
• На уровне промежуточного кода

26.

Цели
• Усложнение исследования кода
<b>Маш</b><b>ина</b>
• Оптимизация
В интерпретируемых языках обфусцированный код занимает
меньше места, чем исходный, и зачастую выполняется
быстрее, чем исходный

27.

Недостатки
• Потеря гибкости кода
• Трудности отладки
• Недостаточная безопасность
• Ошибки в обфускаторах

28.

<form name="matrix_form">
<textarea name="matrix" rows="3" cols="40" style="backgroundcolor:#000000;
color:#66FF00; font-family:Arial; font-size:16px; overflow:hidden;">
</textarea>
</form>
<script type="text/javascript">
var _0x9cda=["\x35\x20\x33\x3D\x30\x3B\x63\x20\x34\x28\x29\x7B\x33\x3D\x34\x2E\x62\x2
E\x38\x3B\
x65\x28\x69\x3D\x30\x3B\x69\x3C\x33\x3B\x69\x2B\x2B\x29\x6A\x5B\x69\x5D\x3D\x34\x2E\
x62\x5B\x69\x5D\x7D\x32\x3D\x68\x20\x34\x28\x22\u041F\u0440\u0438\u0432\u0435\u044
2\
x2E\x2E\x2E\x22\x2C\x22\u0422\u044B\x20\u0432\x20\u043C\u0430\u0442\u0440\u0438\
u0446\u0435\x2E\x2E\x2E\x22\x2C\x22\u0418\u043B\u0438\x20\u043D\u0430\x20\x67\x2E\
x66\x22\x29\x3B\x35\x20\x31\x3D\x30\x3B\x35\x20\x37\x3D\x30\x3B\x35\x20\x39\x3D\x32\
x5B\x30\x5D\x2E\x38\x3B\x63\x20\x36\x28\x29\x7B\x6F\x2E\x72\x2E\x73\x2E\x71\x3D\x32\
x5B\x31\x5D\x2E\x6B\x28\x30\x2C\x37\x29\x2B\x22\x70\x22\x3B\x61\x28\x37\x2B\x2B\x3D\
x3D\x39\x29\x7B\x37\x3D\x30\x3B\x64\x28\x22\x36\x28\x29\x22\x2C\x6C\x29\x3B\x61\x28\
x2B\x2B\x31\x3D\x3D\x33\x29\x31\x3D\x30\x3B\x39\x3D\x32\x5B\x31\x5D\x2E\x38\x7D\x6D
\
English     Русский Правила