УДК 004.056

Методы обнаружения обфусцированного вирусного ПО методами реверс-инжиниринга

Поленов Павел Алексеевич – студент Магнитогорского государственного технического университета им. Г.И. Носова.

Ивко Данил Константинович – студент Магнитогорского государственного технического университета им. Г.И. Носова.

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

Ключевые слова: дизассемблирование, обфускация, запутывание кода, деобфускация, анализ кода, обратная инженерия.

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

Обратная инженерия – процесс восстановления исходного кода из бинарного.

Она может использоваться для различных целей, таких как:

  • Анализ и аудит программного обеспечения
  • Поиск уязвимостей и исправление ошибок
  • Восстановление утраченного исходного кода
  • Кража интеллектуальной собственности

Обфускация - процесс изменения бинарного кода с целью затруднения его дизассемблирования (рисунок 1).

19 028

Рисунок 1. Пример обфусцированного кода.

Методы обфускации:

  • Использование неразличимости данных и инструкций: Дизассемблер может ошибочно интерпретировать данные как код.
  • Вставка «мусора»: Добавление ненужных байт в код для его усложнения.
  • Непроницаемые предикаты: Использование условных операторов, затрудняющих анализ потока управления.
  • Перекрытие инструкций: Объединение нескольких инструкций в одну.
  • Двойное шифрование: Шифрование кода дважды для повышения безопасности.
  • Самомодифицирующийся код: Изменение кода программы во время выполнения.
  • Антиотладочные методы: Определение и предотвращение отладки.
  • Виртуализация: Запуск программы в виртуальной среде.
  • Криптографические методы: Защита кода с помощью криптографии.
  • Стеганография: Скрытие кода в других данных.
  • Обфускация на уровне компилятора: Использование компилятора, генерирующего obfuscated код.

Существует огромное количество методов, которые применяются при работе с ПО, которое было обфусцированно, но наиболее популярными являются:

  • Динамический анализ – используется для выполнения внутри контролируемой среды, что позволяет анализировать поведение в режиме реального времени, например, влияние на оперативную память;
  • Статический анализ – используется при наличии специализированных инструментов, направленных на выявления способов обфускации;
  • Деобфускация – используется при попытке восстановления исходного кода, что облегчает дальнейший анализ другими методами;
  • Детекторы поведения – к ПО пришивается «жучок», отслеживая действия.

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

Основные методы затруднения дизассемблирования, которые необходимо обойти в процессе изучения материала и знакомства с новой темой:

  • Использование неразличимости данных и инструкций, что приводит к тому, что дизассемблер принимает данные за инструкции или наоборот. Это ведет к усложнению понимания строения программы, код становится сложнее понять. Тяжелее становится находить строковые константы, и отслеживать ссылки на них. Для обхода используется поиск вставки «мусора». Поиск вставки лишних байт в недостижимые участки кода так, чтобы они казались достижимыми – самый простой способ обфускации, который обходится исследованием потока управления программы. Именно этот способ затрудняет понимание программы;
  • Вставка «неявных предикатов» – этот метод превращения простых безусловных переходов в условные, используя сложные логические выражения. Эти выражения всегда будут истинны или ложны, но сбивают с толку дизассемблеры и аналитиков, делая код менее понятным.
  • Подмена адресов возврата функций – используется для усложнения или полного исключения возможности вычисления переходов. Обычно используются как динамическое вычисление адреса перехода (переход выполняется командой вида jmp), так и подмена адреса в стеке (при переходе по команде call в стек помещается адрес следующей команды, и при возврате – переход происходит именно на этот адрес.)
  • Наиболее эффективный метод против статического анализа – это шифрование всего программного кода. Совмещенный с антиатлочными приемами для дешифратора, он дает самые эффективные результаты, при использовании данного метода, появляется возможность изменения программного кода во время исполнения.

Существует два основных метода дизассемблирования, к которым относятся:

  • Линейный проход: Простой и эффективный метод, но может ошибаться при распознавании сложных инструкций, где каждый необработанный байт кода рассматривается как байт начала инструкции.
  • Рекурсивный обход: Более точный метод, чем линейный проход, но и более ресурсоемкий. Использует дизассемблирование инструкций для построения графа потока управления.

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

Системные вызовы при обфускации:

  • Использование нестандартных системных вызовов: Эффективный метод, но может привести к проблемам с совместимостью. Осуществляется замена стандартных системных вызовов на свои собственные, что затрудняет анализ дизассемблером.
  • Шифрование системных вызовов: Шифрование параметров системных вызовов, что затрудняет их анализ. Может быть эффективным, но требует дополнительных усилий при разработке.

Помимо этого, существуют и дополнительные методы:

  • Анализ констант: Поиск строковых констант и других данных, которые могут помочь понять логику программы.
  • Анализ потока управления: Изучение того, как программа переходит из одного фрагмента кода в другой.
  • Статический анализ: Анализ кода без его выполнения для поиска потенциальных уязвимостей и ошибок.

Наконец, рассмотрим некоторые сложности, связанные с процессом дизассемблирования. Это важно для осознания того, какие препятствия могут возникнуть при попытке разбора и анализа скомпилированного кода.

Сложности дизассемблирования:

  • Неоднозначность: Один и тот же код может быть дизассемблирован по-разному.
  • Оптимизация: Компиляторы оптимизируют код, что затрудняет его восстановление.
  • Упаковщики: Используются для сжатия и защиты кода, что осложняет дизассемблирование.
  • Рассмотрим некоторые существующие инструменты дизассемблирования:
  • IDA Pro:Один из самых популярных дизассемблеров с широким набором функций.
  • Ghidra: Бесплатный дизассемблер от NSA с открытым исходным кодом.
  • Binja: Дизассемблер с открытым исходным кодом, ориентированный на scriptable-анализ.
  • JEB Decompiler: Декомпилятор Java-байт-кода, который позволяет восстанавливать исходный код Java из APK-файлов.

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

Список литературы

  1. С.И. Алейников, А.О. Богатов. Защита программ от дизассемблирования// КиберЛенинка, 2024.
  2. Н.П. Варновский, В.А. Захаров, Н.Н. Кузюрин, А.В. Шокуров. О стойкой обфускации компьютерных программ // КиберЛенинка, 2009.
  3. Лебедь А.С., Неклюдов Д.Н., Кузьмина У.В. Анализ обхода антивирусного программного обеспечения методами обфускации //Безопасность информационного пространства. Сборник научных трудов XXII Всеросcийской научно-практической конференции студентов, аспирантов и молодых ученых. Челябинск, 2024. С. 125-129
  4. Barankova I.I., Mikhailova U.V., Afanaseva M.V. Minimizing information security risks based on security threat modeling // Journal of Physics: Conference Series. XIII International Scientific and Technical Conference "Applied Mechanics and Systems Dynamics". 2020. С. 012031.

Интересная статья? Поделись ей с другими: