
Плагин Binary Ninja для анализа и упрощения обфусцированного кода
Авторы: Tim Blazytko & Nicolò Altamura
Анализ и упрощение обфусцированного кода
Obfuscation Analysis — это плагин для Binary Ninja, который избавляет от боли при работе с сильно защищёнными бинарными файлами. Он объединяет несколько специализированных помощников, которые позволяют
Некоторые примеры использования можно найти в examples. Кроме того, доклад с REcon «Breaking Mixed Boolean-Arithmetic Obfuscation in Real-World Applications» демонстрирует некоторые сценарии использования. Слайды доступны здесь. Плагин дополняет Obfuscation Detection: после того как подозрительные функции помечены, Obfuscation Analysis помогает их очистить и понять. Со временем будут добавлены новые помощники.
Инструмент можно установить через менеджер плагинов Binary Ninja.
Для ручной установки выполните следующие шаги в папке плагинов Binary Ninja:
git clone https://github.com/mrphrazer/obfuscation_analysis.git
cd obfuscation_analysis
# optionally: use a virtual environment
python -m venv obfana-env
source obfana-env/bin/activate
# install requirements
pip install -r requirements.txt
Если вы используете виртуальное окружение, вам потребуется вручную указать путь к site-packages в настройках Binary Ninja.
Плагин доступен в верхнем меню Binary Ninja в разделе Plugins -> Obfuscation Analysis.
Чтобы упростить арифметическую обфускацию, сначала выделите выражение HLIL, которое хотите упростить, в представлении декомпилятора. Затем выберите Plugins -> Obfuscation Analysis -> MBA Simplification -> Slice & Simplify. Плагин вычисляет полное выражение, прогоняет его через msynth и вставляет упрощённый результат в виде комментария на той же строке. Короткая анимация ниже показывает весь рабочий процесс:
Упрощение MBA основано на msynth. По умолчанию плагин использует стандартный оракул упрощения msynth, который поставляется вместе с плагином и предварительно настроен. Если вы хотите использовать более крупный или пользовательский оракул, задайте obfuscation_analysis.mba_oracle_path вручную или выберите файл в окне настроек Binary Ninja.
Если что-то пойдёт не так, плагин запишет краткое сообщение для пользователя в панель Log; переключите представление журнала на Debug, чтобы увидеть полную трассировку.
Плагин включает специализированные помощники, нацеленные на типичные препятствия, с которыми вы сталкиваетесь при реверсе защищённых бинарных файлов; каждый из них можно запустить как фоновую задачу из интерфейса или из head-less скриптов. Ниже перечислены возможности, доступные в настоящее время.
Повреждённые функции — это функции, дизассемблирование которых показывает неопределённые артефакты: пустые базовые блоки, недопустимые или перекрывающиеся инструкции и тому подобное. Этот помощник обходит весь BinaryView, помечает функции с такими симптомами и выводит их список, чтобы аналитик мог быстро проверить код, который был неверно разобран или намеренно обфусцирован. Необязательное действие удаления стирает каждую помеченную функцию и запускает повторный анализ, очищая список функций. Это особенно полезно для поиска
Смешанная булева арифметика (MBA) — это техника обфускации, которая прячет простые вычисления в длинных цепочках арифметических и булевых операций. Эта возможность упрощает такие выражения в декомпиляторе. Когда вы выбираете инструкцию HLIL, плагин собирает её полную цепочку вычислений с помощью обратного SSA-среза, ограниченного текущим базовым блоком, транслирует этот срез в Miasm IR, передаёт его в msynth и, наконец, добавляет упрощённый результат в виде комментария в представлении декомпилятора. Эта возможность позволяет
Для текущей выбранной функции этот помощник рекурсивно встраивает каждый вызываемый метод внутри представления декомпилятора, давая Binary Ninja единый самодостаточный IL. Когда все границы исчезают, декомпилятор может распространять данные между функциями, что позволяет глубже сворачивать константы, устранять мёртвый код и в целом делает логику понятнее. Используйте это, чтобы
Учтите, что HLIL может стать очень большим и медленно отрисовываться на очень больших функциях или глубоких деревьях вызовов. Кроме того, некоторые оптимизации декомпилятора могут стать менее эффективными после объединения всего в единый блок. Чтобы контролировать это, вы можете ограничить глубину встраивания: задайте Settings -> Obfuscation Analysis -> Max Function Inlining Depth верхней границей N (по умолчанию установлено в 1). При ограничении глубины встраиваются только первые N уровней вызовов; более глубокие вызовы не встраиваются.
У плагина есть несколько нюансов, о которых следует знать, большинство из них связано с конвейером упрощения MBA:
баг Binary Ninja: в BN 5.0 stable шаг обратного среза может завершиться неудачей из-за отсутствующих приведений типов HLIL: https://github.com/Vector35/binaryninja-api/issues/6371; проблема исправлена в 5.1.7477-de и новее
срез ограничен одним базовым блоком: определения переменных, расположенные в блоках-предшественниках, игнорируются (часто зависят от потока управления), поэтому некоторые MBA-термы могут остаться частично нерешёнными
пробелы в трансляции HLIL в Miasm IR: не каждая конструкция HLIL имеет корректный эквивалент в Miasm; при неудаче трансляции выражение пропускается и регистрируется ошибка
покрытие IL: узлы потока управления и операции с плавающей точкой в настоящее время не транслируются
унаследованные ограничения msynth : упрощение MBA наследует все ограничения msynth
Для получения дополнительной информации свяжитесь с Tim Blazytko (@mr_phrazer) или Nicolò Altamura (@nicolodev).