18c0693f

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


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

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

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

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


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

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

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