Обфускация

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

Наиболее часто обфусцируют программы, написанные на C, C++, Perl, Java и для .NET

 

Цели обфускации

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

 

Технологии

 

На уровне исходных текстов

 

На JavaScript, VBScript и подобных скрипт-языках пользователю доступен исходный текст программы. В этом случае форматированием текста и заменой имён можно сделать текст менее читаемым.

 

Исходный текст:
 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];}

 

На уровне машинного кода

Как правило, обфускация на уровне машинного кода уменьшает (а не увеличивает) скорость выполнения программы. Поэтому она применяется в критичных к безопасности, но не критичных к скорости местах программы, таких как проверка регистрационного кода.

Простейший способ обфускации машинного кода — вставка в него недействующих конструкций (таких как or ax, ax)

 

На уровне промежуточного кода

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

 

Назначение

 

Усложнение исследования кода

Как было сказано выше, декомпиляция программ Java и .NET достаточно проста. В этом случае обфускатор оказывает неоценимую помощь тем, кто хочет скрыть свой код от посторонних глаз. Зачастую после обфускации декомпилированный код вообще не компилируется, и вместо модификации исходного текста приходится довольствоваться патчем промежуточного кода.

Обфускация может использоваться программистами, которые используют в своих программах сторонние библиотеки, распространяемые под лицензией GPL или ей подобных. В лицензии GPL прописано требование, что при использовании GPL-кода разработчик обязан распространять исходный код программы так же под лицензией GPL. Если программист
не хочет показывать своего исходного кода;
хочет затруднить создание форка своей программы;
опасается быстрого появления на рынке конкурирующих с его программой продуктов, основанных на исходном коде его же программы;
не нуждается в помощи OpenSource-сообщества,

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

 

Обфускация HTML помогает спамерам: на почтовом клиенте, который способен отображать HTML, текст читается, но антиспамовый фильтр, который имеет дело с исходным HTML-файлом, пропускает нежелательное сообщение, не видя в нём запретной строки.

Простейший пример обфусцированного HTML:
 <b>Виа</b><b>гра</b>

 

При просмотре в браузере вы увидите слово «Виагра», в то время как в исходном коде его нет. Добавление в текст JavaScript, CSS и т. д. ещё усложняет задачу детекции спама.

 

Оптимизация

 

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

 

Проблема уменьшения размера важна, например, при программировании для сотовых телефонов на J2ME, где размер программы серьёзно ограничен. Обфускация JavaScript уменьшает размер HTML-файлов и, соответственно, ускоряет загрузку.

 

Недостатки

 

Потеря гибкости кода

Код после обфускации может стать более зависимым от платформы или компилятора.

 

Трудности отладки

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

 

Недостаточная безопасность

Хотя обфускация помогает сделать распределённую систему более безопасной, не стоит ограничиваться только ею. Обфускация — это «безопасно, потому что засекречено» (en:security through obscurity, см. также Принцип Керкгоффса). Ни один из существующих обфускаторов не гарантирует сложности декомпиляции и не обеспечивает безопасности на уровне современных криптографических схем; вполне вероятно, что эффективная защита невозможна.

 

Ошибки в обфускаторах

Современный обфускатор — сложный программный комплекс. Зачастую в обфускаторы, несмотря на тщательное проектирование и тестирование, вкрадываются ошибки. Так что есть ненулевая вероятность, что прошедший через обфускатор код вообще не будет работать. И чем сложнее разрабатываемая программа, тем больше эта вероятность.

 

Вызов класса по имени

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

 

 


 
Источник: википедия
 

 
12.12.2008

Отзывы и комментарии

 


 
Тема
Ваше имя
Почтовый адрес
Текст сообщения
Ключ защиты:
Защита от спама
 
 
 
 
10.12  .NET Reactor
15.11  n
15.11  C# ClickOnce
 
01.08  Task Context
01.08  XLSX в Mono