Программное обеспечение как услуга
- 1 year ago
- 0
- 0
Обфуска́ция (от лат. obfuscare — затенять, затемнять; и англ. obfuscate — делать неочевидным, запутанным, сбивать с толку) или запутывание кода — приведение исходного кода или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции .
«Запутывание» кода может осуществляться как на уровне наименований компонентов программы, так и на уровне алгоритмов программы. Для создания запутанного ассемблерного текста могут использоваться специализированные компиляторы , использующие неочевидные или недокументированные возможности среды исполнения программы. Существуют также специальные программы, производящие обфускацию, называемые обфускаторами ( англ. obfuscator ).
Затруднение декомпиляции / отладки и изучения программ с целью обнаружения функциональности;
Затруднение декомпиляции проприетарных программ с целью предотвращения обратной разработки или обхода DRM и систем проверки лицензий ;
Затруднение взлома программного обеспечения ;
Оптимизация программы с целью уменьшения размера работающего кода и (если используется некомпилируемый язык) ускорения работы;
Демонстрация неочевидных возможностей языка и квалификации программиста (если производится вручную, а не инструментальными средствами);
На JavaScript , VBScript и подобных скрипт -языках пользователю доступен исходный текст программы. В этом случае форматированием текста и заменой имён можно сделать текст менее читаемым.
Исходный текст на языке C :
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];}
Более сложный пример:
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,"_.":" |"];}
Как правило, обфускация на уровне машинного кода уменьшает скорость выполнения и соответственно увеличивает время выполнения программы. Поэтому она применяется в критичных к безопасности , но не критичных к скорости местах программы, таких как проверка регистрационного кода .
Простейший способ обфускации
машинного кода
— вставка в него недействующих конструкций (таких как
or ax, ax
).
В отличие от обычных языков программирования, таких как C++ или Паскаль , компилирующихся в машинный код , язык Java , и языки платформы .NET компилируют исходный код в промежуточный код ( байт-код ), который содержит достаточно информации для адекватного восстановления исходного кода. По этой причине для этих языков применяется обфускация промежуточного кода.
Как было сказано выше, декомпиляция программ Java и .NET достаточно проста. В этом случае обфускатор оказывает неоценимую помощь тем, кто хочет скрыть свой код от посторонних глаз. Зачастую после обфускации декомпилированный код повторно не компилируется.
Обфускация HTML помогает спамерам : на почтовом клиенте , который способен отображать HTML, текст читается, но антиспам-фильтр , который имеет дело с исходным HTML-файлом, пропускает нежелательное сообщение, не распознавая в нём запретной строки.
Простейший пример обфусцированного HTML:
<b>Маш</b><b>ина</b>
При просмотре пользователь увидит слово « Машина », в то время как в исходном коде оно расчленено и воспринимается как два раздельных слова.
В интерпретируемых языках обфусцированный код занимает меньше места, чем исходный, и зачастую выполняется быстрее, чем исходный. Современные обфускаторы также заменяют константы числами, оптимизируют код инициализации массивов , и выполняют другую оптимизацию, которую на уровне исходного текста провести проблематично или невозможно.
Проблема уменьшения размера была важна, например, при программировании для сотовых телефонов на J2ME , где размер программы серьёзно ограничен. Обфускация JavaScript уменьшает размер HTML -файлов и, соответственно, ускоряет загрузку.
Защита исходного кода от редактирования в целях получения выгоды.
Код после обфускации может стать более зависимым от платформы или компилятора.
Обфускатор не даёт постороннему выяснить, что делает код, но также не даёт и разработчику отлаживать его. При отладке придётся работать с исходной версией кода, затем обфусцировать его заново.
Хотя обфускация помогает сделать распределённую систему более безопасной, не стоит ограничиваться только ею. Обфускация — это безопасность через неясность . Ни один из существующих обфускаторов не гарантирует сложности декомпиляции и не обеспечивает безопасности на уровне современных криптографических схем. Вполне вероятно, что эффективная защита невозможна (по крайней мере в некотором конкретном классе решаемых задач).
Современный обфускатор — сложный программный комплекс. Зачастую в обфускаторы, несмотря на тщательное проектирование и тестирование , вкрадываются ошибки. Так что есть ненулевая вероятность, что прошедший через обфускатор код вообще не будет работать. И чем сложнее разрабатываемая программа, тем больше эта вероятность.
Большинство языков с промежуточным кодом может создавать или вызывать объекты по именам их классов . Современные обфускаторы позволяют сохранить указанные классы от переименования, однако подобные ограничения сокращают гибкость программ.