Введение

Термин, используемый в естественном языке, — преднамеренное создание кода, трудного для понимания.

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

Обзор

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

Автоматизированные инструменты

Существует множество инструментов для выполнения или помощи в обфускации кода. К ним относятся экспериментальные исследовательские инструменты, созданные учеными, инструменты для энтузиастов, коммерческие продукты, разработанные профессионалами, и программное обеспечение с открытым исходным кодом. Также существуют инструменты деобфускации, которые пытаются выполнить обратное преобразование. Хотя большинство коммерческих решений для обфускации работают путем преобразования либо исходного кода программы, либо платформенно-независимого байт-кода, используемого Java и .NET, есть и те, которые работают непосредственно с скомпилированными двоичными файлами. Некоторые примеры на Python можно найти в официальном FAQ по Python и в других источниках. Компилятор movfuscator для C, предназначенный для архитектуры x86 32 ISA, использует только инструкцию mov для обфускации.

Развлекательные

Написание и чтение запутанного исходного кода может быть настоящей головоломкой. Многие конкурсы по программированию награждают за наиболее креативно запутанный код, такие как Международный конкурс запутанного C-кода и конкурс запутанного Perl. Короткие запутанные программы на Perl могут использоваться в подписях программистов Perl – это JAPHs ("Просто еще один Perl-хакер").

Криптографические

Криптографы изучали возможность сокрытия кода таким образом, чтобы обратная разработка кода была криптографически сложной задачей. Это нашло формальное выражение во множестве предложений по неотличимому сокрытию, криптографическому примитиву, который, если удастся построить безопасно, позволит создавать множество других видов криптографии, включая совершенно новые типы, создание которых на данный момент неизвестно. (Более строгая концепция, сокрытие "черного ящика", в общем случае признана невозможной.)

Недостатки затуманивания

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

Уведомление пользователей о скрытом коде

Некоторые антивирусные программы, такие как AVG AntiVirus, также предупреждают пользователей при посещении веб-сайта, содержащего намеренно усложненный код, поскольку одна из целей усложнения кода – сокрытие вредоносных программ. Однако некоторые разработчики могут использовать усложнение кода для уменьшения размера файла или повышения безопасности. Обычный пользователь может не ожидать от антивируса предупреждений о безобидном коде, особенно от надежных компаний, поэтому такая функция может оттолкнуть пользователей от использования легального программного обеспечения. Mozilla и Google запрещают размещение в своих магазинах расширений для браузеров, содержащих усложненный код.

Лицензии на затуманивание и копилефт

Велись споры о том, является ли незаконным уклонение от условий лицензий copyleft путём публикации исходного кода в запутанном виде, например, в ситуациях, когда автор не желает предоставлять исходный код. Этот вопрос рассматривается в GNU General Public License, где требуется предоставление "предпочтительной формы для внесения изменений". На веб-сайте GNU говорится: "Запутанный 'исходный код' не является настоящим исходным кодом и не считается таковым".

Декомпиляторы

Декомпилятор может восстановить исходный код из исполняемого файла или библиотеки. Декомпиляцию иногда называют атакой "человек на конце" (man-in-the-end), по аналогии с традиционной криптографической атакой "человек посередине". Это позволяет получить исходный код в распоряжение пользователя, хотя он часто бывает трудночитаемым. Восстановленный исходный код, скорее всего, будет содержать случайные имена функций и переменных, неверные типы переменных и использовать логику, отличающуюся от оригинального исходного кода (из-за оптимизаций компилятора).

Модельное затуманивание

Обфускация модели — это техника сокрытия внутренней структуры модели машинного обучения. Обфускация превращает модель в «черный ящик». Это противоположно объяснимому ИИ. Методы обфускации также могут применяться к обучающим данным перед подачей их в модель для добавления случайного шума. Это скрывает конфиденциальную информацию о свойствах отдельных образцов и групп данных.