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

Обфуска́ция (от лат. 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, NetP и языки платформы .NET компилируют исходный код в промежуточный код (байт-код), который содержит достаточно информации для адекватного восстановления исходного кода. По этой причине для этих языков применяется обфускация промежуточного кода.

Назначение

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

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

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

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

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

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

Оптимизация

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

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

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

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

Недостатки

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

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

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

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

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

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

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

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

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

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

См. также

Примечания

Литература

  • Бойцев О. М. Защити свой компьютер на 100% от вирусов и хакеров. — Питер, 2008. — ISBN 9785388003478.

Ссылки

Tags:

Программное Обеспечение Обфускация Цели обфускацииПрограммное Обеспечение Обфускация ТехнологииПрограммное Обеспечение Обфускация НазначениеПрограммное Обеспечение Обфускация НедостаткиПрограммное Обеспечение Обфускация См. такжеПрограммное Обеспечение Обфускация ПримечанияПрограммное Обеспечение Обфускация ЛитератураПрограммное Обеспечение Обфускация СсылкиПрограммное Обеспечение ОбфускацияАнглийский языкДекомпиляторИсходный кодЛатинский язык

🔥 Trending searches on Wiki Русский:

AliExpressАутизмMia BoykaПожар в клубе «Хромая лошадь»Шклярский, Феликс-Юлиан НиколаевичЧаушеску, НиколаеСбербанк ОнлайнАК-12Война в Донбассе (2014—2022)БайкалДуров, Павел ВалерьевичБесстыжиеВластелин колец (кинотрилогия)Искусственный интеллектИслам2024 годРимская империяБасманное правосудиеУсама бен ЛаденУткин, Василий ВячеславовичСайга (огнестрельное оружие)Яндекс.ТаксиКарл III (король Великобритании)Крокус Сити ХоллДюжев, Дмитрий ПетровичКрасногорскДушанбеКорейская Народно-Демократическая РеспубликаПопков, Михаил ВикторовичПи (число)Большие десантные корабли проекта 775Диль, АугустЯпонияФеномен синего или белого платьяЦиркон (ракета)Лунное затмение 25 марта 2024 годаГосударство ПалестинаРаппопорт, Ксения АлександровнаХронология вторжения России на Украину (март 2024)Солнечная системаВзрывы в Московском метрополитене (2010)Наумов, Николай Александрович (актёр)Они сражались за Родину (фильм)Приключения Михея Кларка14/88Население ЗемлиКрейсера проекта 1144НовосибирскДоренко, Сергей ЛеонидовичМизулина, Екатерина МихайловнаПервая чеченская войнаВильнёв, ДениТеррористические акты 11 сентября 2001 годаЕвровидение-2024БесланСписок государств и зависимых территорий по населениюДогменСоюз Советских Социалистических РеспубликМильчаков, Алексей ЮрьевичДженнер, КайлиНазаров, Дмитрий Юрьевич26 мартаРеспублика КосовоДом у дороги (фильм, 2024)ДаркнетВикипедияQR-кодБангладешЧемпионат Европы по футболу 2024Гагарин, Юрий АлексеевичМаска (телешоу)Трамп, ДональдХарламов, ГарикМишустин, Михаил ВладимировичШахаб аль-МухаджирТинькофф банкРамаданТеракт в аэропорту Домодедово🡆 More