Введение
Обфуксация подразумевает затруднение понимания чего-либо. Программный код часто запутывают, чтобы защитить интеллектуальную собственность или коммерческую тайну, а также не дать злоумышленнику провести обратный инжиниринг платной программы.
Шифрование части или всего кода программы является одним из методов обфускации. Другие подходы включают удаление потенциально раскрывающих метаданных, замену имен классов и переменных бессмысленными метками и добавление неиспользуемого или бессмысленного кода в сценарий приложения. Инструмент, называемый обфускатором, автоматически преобразует простой исходный код в программу, которая работает так же, но ее сложнее читать и понимать.
К сожалению, авторы вредоносного кода также используют эти методы, чтобы предотвратить обнаружение механизмов атаки средствами защиты от вредоносных программ. Атака SolarWinds 2020 года является примером того, как хакеры используют обфуксацию для обхода защиты.
Деобфускации можно использовать для обратного проектирования или отмены обфускации. Эти методы включают в себя нарезку программы, которая предполагает сужение программного кода до соответствующих операторов в определенной точке программы. Оптимизация компилятора и синтез программы — два других метода деобфускации. Обфускация направлена на то, чтобы затруднить обратное проектирование и сделать это не стоящим усилий.
Как работает обфускация?
Обфускация компьютерного кода использует сложные обходные фразы и избыточную логику, что затрудняет понимание кода читателем. Цель состоит в том, чтобы отвлечь читателя сложным синтаксисом того, что он читает, и затруднить ему определение истинного содержания сообщения.
Читателем компьютерного кода может быть человек, вычислительное устройство или другая программа. Обфускация также используется для обмана антивирусных инструментов и других программ, которые в значительной степени полагаются на цифровые подписи для интерпретации кода. Декомпиляторы доступны для Java, операционных систем Android и iOS, и платформ разработки NET. Они могут автоматически реконструировать исходный код; цель обфускации – затруднить декомпиляцию этих программ.
Обфускация кода заключается не в изменении содержимого исходного кода программы, а в том, чтобы сделать способ доставки и представление этого кода более запутанным. Обфускация не меняет работу программы или ее конечный результат.
Эту запутанную версию практически невозможно проследить человеческим глазом.
Методы обфускации
Обфускация включает в себя несколько различных методов. Часто для создания многослойного эффекта используются несколько техник.
Программы, написанные на компилируемых языках программного обеспечения C# и Java, легче запутать. Это связано с тем, что они создают инструкции промежуточного уровня, которые обычно легче читать. Напротив, C++ сложнее запутать, поскольку он компилируется в машинный код, с которым людям труднее работать.
Некоторые распространенные методы запутывания включают в себя следующее:
- Переименование. Обфускатор изменяет методы и имена переменных. Новые названия могут включать непечатаемые или невидимый персонажи.
- Упаковка. Это сжимает всю программу, делая код нечитаемым.
- Управление потоком. Декомпилированный код выглядит как спагетти-логика, которая является неструктурированной и трудно поддерживаемой кодом со скрытым ходом. Результаты этого кода неясны, и, глядя на него, трудно сказать, в чем смысл кода.
- Преобразование шаблона инструкции. Этот подход использует общие инструкции, созданные компилятором, и заменяет их более сложными и менее распространенными инструкциями, которые фактически делают то же самое.
- Вставка фиктивного кода. В программу можно добавить фиктивный код, чтобы затруднить ее чтение и реконструирование, но это не влияет на логику или результат программы.
- Удаление метаданных или неиспользуемого кода. Неиспользуемый код и метаданные дают читателю дополнительную информацию о программе, подобно аннотациям в документе Word, которая может помочь ему прочитать и отладить ее. Удаление метаданных и неиспользуемого кода оставляет читателю меньше информации о программе и ее коде.
- Непрозрачная вставка предиката. Предикат в коде — это логическое выражение, которое может быть истинным или ложным. Непрозрачные предикаты — это условные ветви (или операторы «если-то»), результаты которых нелегко определить с помощью статистического анализа. Вставка непрозрачного предиката вводит ненужный код, который никогда не выполняется, но озадачивает читателя, пытающегося понять декомпилированный вывод.
- Антиотладка. Настоящие разработчики программного обеспечения и хакеры используют инструменты отладки для проверки кода построчно. С помощью этих инструментов инженеры




