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


Обфускация управления - часть 4


При этом существующие алгоритмы статического анализа становятся не эффективны.

Методы позволяющие осуществить обфускацию управления, классифицируются на три основных группы:

Обфускация вычислительная. Изменение касающиеся главной структуры потока управления. К ним можно отнести:

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

    $i = 1 ; while ($i < 101) { ... $i++ ; }

    после расширения условия цикла, станет:

    $i = 1 ; $j = 100 ; while (($i < 101) && ($j * $j * ($j + 1) * ($j + 1)%4 == 0)(t)) { ... $i++ ; $j = $j * $i + 3 ; }

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




    - Начало -  - Назад -  - Вперед -