Пользователь
- Статус
- Онлайн
- Регистрация
- 12 Дек 2022
- Сообщения
- 129
- Реакции
- 31
Проблема защиты ПО остаётся одной из важнейших. С точки зрения реверс-инжиниринга и защиты, условно можно выделить три направления: защита приложения, защита кода и защита алгоритма. В статье мы разберём каждый из этих аспектов подробно
Защита приложения (Packing, Obfuscation Shells)
Защита на уровне приложения (также известная как "пакеры", "обфускаторы", "оболочки") — это способ защитить авторские права, ресурсы и ключевую логику. Термин "оболочка" (shell) здесь не случайный — как у яйца есть скорлупа, так и у программы может быть "оболочка", которая защищает содержимое
Исторически защита программ существовала ещё в эпоху DOS — тогда начали появляться первые техники анти-дизассемблинга. Позже "пакеры" эволюционировали в более продвинутые решения, среди которых можно выделить следующие типы:
Компрессирующие пакеры (упаковка кода)
Шифрующие пакеры (шифрование с runtime-дешифрацией)
Экстрагирующие пакеры (разделение логики на runtime-загрузку)
Защитные/обфусцирующие пакеры
Виртуализирующие пакеры (VMProtect, Themida, другие.......)
Одной из главных целей является скрытие настоящей точки входа (OEP, Original Entry Point) — иногда подменяют её фейковой. Чтобы выполнить "анпак", реверсеру нужно найти настоящий OEP и восстановить исполняемый код
Процесс анпака схож с криптографическим процессом расшифровки — это обратная операция к упаковке. Обычно он включает три этапа:
Анпак может выполняться различными способами: через дампинг памяти, перехват API (Hooking), либо инъекцией. Метод зависит от типа пакера и уровня защиты
Защита кода (Code Obfuscation)
Если защита приложения — это замок на двери, то защита кода — это запирание каждой комнаты в доме. Из-за мелкозернистой структуры кода, методов защиты здесь больше
Цель обфускации — замедлить реверсера, усложнить анализ и отладку. Однако, это не "пуля в лоб" — обфускация не даёт 100% защиты, но она усложняет задачу. НО, она может влиять на производительность, поэтому всегда требуется баланс
Основные виды защиты:
Статическая обфускация
Статический анализ — это анализ бинаря без выполнения. Он позволяет построить карту программы (CFG, AST и т.д.). Чтобы усложнить такую аналитику, применяют:
Лейаут-обфускация: удаление/искажение метаинформации (комментарии, имена, отладочные символы)
Обфускация данных: маскирование строк, чисел, логических выражений
Контрольная обфускация: изменение control flow — например, с помощью непрозрачных предикатов, junk-кода, flattening'а
Превентивная обфускация: вставка анти-анализных конструкций — проверка на отладчики, "цветочные инструкции", ложные ветви и ловушки
Обфускация данных:
Строки — шифруются/кодируются, чтобы скрыть семантически важные элементы: имена классов, ошибок, функций
Числа — преобразуются через формулы, побитовые операции, смену систем счисления
Булевы выражения — обфусцируются через арифметику или костыльные логические конструкции
Динамическая обфускация
В отличие от статической, динамическая защита работает в рантайме. Это позволяет противостоять динамическому анализу и инструментам отладки
Основные техники:
SMC (Self-Modifying Code) — самопереписывающийся код, который меняет себя в памяти, ломая дизассемблеры
VM (виртуальные машины) — исполняемый код транслируется в байткод, интерпретируемый на лету
SMC активно использует особенности архитектуры фон-Неймана, где код и данные — в одном адресном пространстве. Это позволяет внедрять инструкции прямо в кодовую секцию, которые модифицируют другие инструкции — это сильно усложняет дизассемблирование и отладку
Полиморфизм и метаморфизм
Полиморфная защита — динамическое изменение кода при каждом запуске или сборке. Даже если функционал идентичен, бинарь будет отличаться
Метаморфизм идёт ещё дальше — изменяется не только обёртка, но и тело алгоритма. Это не просто перестановка инструкций, а глубокая трансформация логики исполнения (иногда даже с заменой структур данных и паттернов)
Защита алгоритмов
Шифрование и кодирование — частая практика, но использование стандартных алгоритмов вроде Base64, MD5, AES делает бинарь уязвимым, потому что их легко распознать по сигнатурам
Методы защиты:
Алгоритмический моддинг (алгоритм-модификация) — кастомизация криптоалгоритма, изменение операций, таблиц, констант и логики
White-Box криптография — объединение алгоритма и ключа в единую таблицу, которая заменяет традиционную криптографию
Шифрование/ дешифрование происходит без раскрытия ключа в явном виде
TEE (Trusted Execution Environment) — защищённое исполняемое окружение на уровне железа, где происходит выполнение критически важных
операций (например, Android Keystore, Intel SGX)
Если защита не развивается, то со временем она теряет смысл — любая статичная защита будет сломана. Только за счёт комбинации методов и постоянной эволюции можно достигать приемлемой устойчивости к реверсу
Защита приложения (Packing, Obfuscation Shells)
Защита на уровне приложения (также известная как "пакеры", "обфускаторы", "оболочки") — это способ защитить авторские права, ресурсы и ключевую логику. Термин "оболочка" (shell) здесь не случайный — как у яйца есть скорлупа, так и у программы может быть "оболочка", которая защищает содержимое
Исторически защита программ существовала ещё в эпоху DOS — тогда начали появляться первые техники анти-дизассемблинга. Позже "пакеры" эволюционировали в более продвинутые решения, среди которых можно выделить следующие типы:
Компрессирующие пакеры (упаковка кода)
Шифрующие пакеры (шифрование с runtime-дешифрацией)
Экстрагирующие пакеры (разделение логики на runtime-загрузку)
Защитные/обфусцирующие пакеры
Виртуализирующие пакеры (VMProtect, Themida, другие.......)
Одной из главных целей является скрытие настоящей точки входа (OEP, Original Entry Point) — иногда подменяют её фейковой. Чтобы выполнить "анпак", реверсеру нужно найти настоящий OEP и восстановить исполняемый код
Процесс анпака схож с криптографическим процессом расшифровки — это обратная операция к упаковке. Обычно он включает три этапа:
- Отслеживание runtime-логики пакера
- Сбор распакованных данных
- Воспроизведение или симуляция логики "распаковщика"
Анпак может выполняться различными способами: через дампинг памяти, перехват API (Hooking), либо инъекцией. Метод зависит от типа пакера и уровня защиты
Защита кода (Code Obfuscation)
Если защита приложения — это замок на двери, то защита кода — это запирание каждой комнаты в доме. Из-за мелкозернистой структуры кода, методов защиты здесь больше
Цель обфускации — замедлить реверсера, усложнить анализ и отладку. Однако, это не "пуля в лоб" — обфускация не даёт 100% защиты, но она усложняет задачу. НО, она может влиять на производительность, поэтому всегда требуется баланс
Основные виды защиты:
Статическая обфускация
Статический анализ — это анализ бинаря без выполнения. Он позволяет построить карту программы (CFG, AST и т.д.). Чтобы усложнить такую аналитику, применяют:
Лейаут-обфускация: удаление/искажение метаинформации (комментарии, имена, отладочные символы)
Обфускация данных: маскирование строк, чисел, логических выражений
Контрольная обфускация: изменение control flow — например, с помощью непрозрачных предикатов, junk-кода, flattening'а
Превентивная обфускация: вставка анти-анализных конструкций — проверка на отладчики, "цветочные инструкции", ложные ветви и ловушки
Обфускация данных:
Строки — шифруются/кодируются, чтобы скрыть семантически важные элементы: имена классов, ошибок, функций
Числа — преобразуются через формулы, побитовые операции, смену систем счисления
Булевы выражения — обфусцируются через арифметику или костыльные логические конструкции
Динамическая обфускация
В отличие от статической, динамическая защита работает в рантайме. Это позволяет противостоять динамическому анализу и инструментам отладки
Основные техники:
SMC (Self-Modifying Code) — самопереписывающийся код, который меняет себя в памяти, ломая дизассемблеры
VM (виртуальные машины) — исполняемый код транслируется в байткод, интерпретируемый на лету
SMC активно использует особенности архитектуры фон-Неймана, где код и данные — в одном адресном пространстве. Это позволяет внедрять инструкции прямо в кодовую секцию, которые модифицируют другие инструкции — это сильно усложняет дизассемблирование и отладку
Полиморфизм и метаморфизм
Полиморфная защита — динамическое изменение кода при каждом запуске или сборке. Даже если функционал идентичен, бинарь будет отличаться
Метаморфизм идёт ещё дальше — изменяется не только обёртка, но и тело алгоритма. Это не просто перестановка инструкций, а глубокая трансформация логики исполнения (иногда даже с заменой структур данных и паттернов)
Защита алгоритмов
Шифрование и кодирование — частая практика, но использование стандартных алгоритмов вроде Base64, MD5, AES делает бинарь уязвимым, потому что их легко распознать по сигнатурам
Методы защиты:
Алгоритмический моддинг (алгоритм-модификация) — кастомизация криптоалгоритма, изменение операций, таблиц, констант и логики
White-Box криптография — объединение алгоритма и ключа в единую таблицу, которая заменяет традиционную криптографию
Шифрование/ дешифрование происходит без раскрытия ключа в явном виде
TEE (Trusted Execution Environment) — защищённое исполняемое окружение на уровне железа, где происходит выполнение критически важных
операций (например, Android Keystore, Intel SGX)
Если защита не развивается, то со временем она теряет смысл — любая статичная защита будет сломана. Только за счёт комбинации методов и постоянной эволюции можно достигать приемлемой устойчивости к реверсу