Информационная безопасность

       

Алгоритмы процесса обфускации


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

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

Алгоритм Колберга ("Collberg`s algorithm").

Данный алгоритм оперирует следующими входными значениями:

  • программа "А" состоящая из исходных или объектных (двоичных) файлов "{С1,С2}".
  • стандартные библиотеки, используемые программой "{L1,L2}".
  • набор трансформирующих процессов "Т{Т1,Т2}".
  • определенный фрагмент кода "S", который извлекается из программы "А", и который непосредственно будет подвержен трансформации.
  • набор функций "Е{Е1,Е2}" которые будут определять эффективность применения определенных трансформирующих процессов "{Т1,Т2}" к фрагменту кода "S".
  • набор функций "I{I1,I2}" которые будут определять важность фрагмента кода "S", и в зависимости от этого будут задавать определенное значение переменной "RequireObfuscation" (чем "S" важнее тем эта переменная будет хранить большее значение).
  • две числовые переменные "AcceptCost" > 0, "RequireObfuscation" > 0, где первое хранит информацию о доступном максимальном увеличении системных ресурсов по требующихся программе "А" после того как она подвергнется обфускации, а вторая переменная будет хранить значение требуемого уровня осуществления обфускации (чем важнее фрагмент кода "S", тем это значение должно быть больше).


Алгоритм Колберга имеет такую последовательность операций:

  1. Загрузка элементов "{С1,С2}" программы "А".
  2. Загрузка библиотек "{L1,L2}".
  3. Осуществление обфускации над программой "А", путем выделения фрагмента кода "S" и определения наиболее эффективного процесса трансформации для него. Этот этап повторяется до тех пор, пока не будет, достигнут требуемый уровень обфускации "RequireObfuscation" или допустимое увеличение ресурсов "AcceptCost".
  4. Генерация трансформируемой программы "А`".

Алгоритм Колберга считается общим алгоритмом осуществления !процесса обфускации (то есть он не определяет, как именно должен осуществляться, тот или иной !метод обфускации), ниже будет рассмотрен более специализированный алгоритм, так как он описывает последовательность осуществления одного из методов обфускации, а именно обфускации управления.
Chenxi Wang`s алгоритм.
В качестве входных данных алгоритм принимает типичную процедуру, написанную на языке высокого уровня. Процесс обфускации каждой такой процедуры состоит из трех этапов:

  • создание графа потока управления этой процедуры (граф задаётся множеством блоков и множеством связей соединяющих их), после чего граф разбивается, путем замены циклических конструкций в нем на конструкции типа "if (условие) goto", ().
  • нумерация всех блоков в графе, и добавление в код процедуры переменной (например "swVar") хранящей номер следующего выполняемого блока
  • приведение графа к однородному ("плоскому") виду ()

Выше описанный вариант алгоритма обфускации ("Chenxi Wang`s algorithm") является не сильно устойчивым, так как определить следующий выполняемый блок, нетрудно (он в нашем случае будет храниться в переменной "swVar"). Поэтому для повышения его устойчивости вводят массив (например "@gg"), содержащий помимо номеров блоков, не нужную информацию, в результате запись "$swVar = S6", можно заменить на нечто подобное "$swVar = $gg[$gg[1] + $gg[3]]".

Содержание раздела