Обфускация (программное обеспечение)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Обфуска́ция(отлат.obfuscare— затенять, затемнять; иангл.obfuscate— делать неочевидным, запутанным, сбивать с толку) илизапутывание кода— приведениеисходного кодаили исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию придекомпиляции.

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

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

[править|править код]

Затруднениедекомпиляции/отладкии изученияпрограммс целью обнаружения функциональности;

Затруднение декомпиляциипроприетарныхпрограмм с целью предотвращенияобратной разработкиили обходаDRM и систем проверки лицензий;

Затруднениевзлома программного обеспечения;

Оптимизацияпрограммы с целью уменьшения размера работающегокодаи (если используетсянекомпилируемыйязык) ускорения работы;

Демонстрация неочевидных возможностей языка и квалификации программиста (если производится вручную, а не инструментальными средствами);

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

[править|править код]

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

Исходный текст на языкеC:

intCOUNT=100;
floatTAX_RATE=0.2;
for(inti=0;i<COUNT;i++)
{
tax[i]=orig_price[i]*TAX_RATE;
price[i]=orig_price[i]+tax[i];
}

Код после обфускации[1]:

for(inta=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a]+b[a];}

Более сложный пример:

char*M,A,Z,E=40,J[40],T[40];main(C){for(*J=A=scanf(M="%d",&C);
--E;J[E]=T
[E]=E)printf("._");for(;(A-=Z=!Z)||(printf("\n| "
),A=39,C--
);Z||printf(M))M[Z]=Z[A-(E=A[J-Z])&&!C
&A==T[A]
|6<<27<rand()||!C&!Z?J[T[E]=T[A]]=E,J[T[A]=A-Z]=A,"_.":"|"];}

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

[править|править код]

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

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

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

[править|править код]

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

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

[править|править код]

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

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

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

<b>Маш</b><b>ина</b>

При просмотре пользователь увидит слово «Машина», в то время как в исходном коде оно расчленено и воспринимается как два раздельных слова.

Оптимизация

[править|править код]

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

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

Защита проприетарного программного обеспечения

[править|править код]

Защита исходного кода от редактирования в целях получения выгоды.

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

[править|править код]

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

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

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

[править|править код]

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

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

[править|править код]

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

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

[править|править код]

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

  1. В данном случае это можно назватьминификацией
  2. 10.2. Методы проверки регистрационных кодов.www.rfcmd.ru. Дата обращения: 2 февраля 2016.Архивировано12 декабря 2016 года.
  • Бойцев О. М.Защити свой компьютер на 100% от вирусов и хакеров. — Питер, 2008. —ISBN 9785388003478.