
Плагин для Binary Ninja для обнаружения обфусцированного кода и других интересных конструкций кода
Автор: Tim Blazytko
Автоматическое обнаружение обфусцированного кода и других интересных конструкций
Обнаружение обфускации — это плагин для Binary Ninja, предназначенный для обнаружения обфусцированного кода и интересных конструкций (например, конечных автоматов) в бинарных файлах. Плагин облегчает анализ, выявляя места в коде, которые могут заслуживать более пристального внимания при реверс-инжиниринге.
Основываясь на различных эвристиках, плагин выявляет функции, содержащие сложные или необычные конструкции. Такие конструкции могут реализовывать:
Следующие статьи в блоге содержат дополнительную информацию о лежащих в основе эвристиках и демонстрируют их применение:
Некоторые примеры использования можно найти в examples. Кроме того, выступление на REcon «Раскрытие секретов в бинарных файлах с помощью стратегий обнаружения кода» демонстрирует ряд вариантов использования. Слайды доступны здесь; запись доступна здесь.
Инструмент можно установить через менеджер плагинов Binary Ninja.
Для безголовой версии выполните следующие шаги:
git clone https://github.com/mrphrazer/obfuscation_detection.git
cd obfuscation_detection
# install obfuscation_detection
pip install .
Плагин можно использовать в пользовательском интерфейсе и в безголовом режиме.
Выберите Plugins -> Obfuscation Detection для запуска отдельных эвристик или Plugins -> Obfuscation Detection -> Utils для запуска отдельных утилит. Команда Plugins -> Obfuscation Detection -> All запускает все эвристики и все утилиты вместе.
Результаты отображаются в окне Log:
При нажатии на адреса идентифицированных функций Binary Ninja переходит к выбранной функции.
Для использования плагина в безголовом режиме выполните scripts/detect_obfuscation.py:
$ python3 scripts/detect_obfuscation.py <binary>
Это запускает все эвристики и все утилиты. Для машиночитаемого вывода используйте --json:
$ python3 scripts/detect_obfuscation.py --json <binary>
JSON-нагрузка содержит все результаты под ключом detections. Каждое обнаружение имеет стабильный id для автоматизации и человекочитаемый name. Каждый результат с тегом функции включает тип тега и описание, используемые плагином Binary Ninja.
Для запуска только эвристики конечного автомата в безголовом режиме используйте scripts/detect_state_machine.py:
$ python3 scripts/detect_state_machine.py [--json] <binary>
Плагин реализует различные эвристики обнаружения для выявления разных конструкций кода. Ниже кратко описаны отдельные эвристики и объясняется их применение.
Эвристика большого базового блока идентифицирует 10% функций с наибольшим средним числом инструкций на базовый блок. Она позволяет обнаружить:
Эвристика сложной функции идентифицирует 10% функций с наиболее сложными графами потока управления (на основе цикломатической сложности). Она позволяет выявить:
Эвристика конечного автомата использует теоретико-графовые свойства для выявления функций, реализующих конечные автоматы. Обычно такие конечные автоматы можно представить в виде операторов switch, которые диспетчеризуются в цикле. Эвристика позволяет выявить:
Эвристика необычной последовательности инструкций выполняет статистический анализ для выявления 10% функций, чьи шаблоны кода отклоняются от предварительно вычисленного эталона. Таким образом, эвристика позволяет обнаружить:
Эвристика перекрывающихся инструкций выявляет функции с невыровненными инструкциями (байты инструкции используются двумя разными инструкциями). Эвристика обнаруживает:
Если эвристика используется в пользовательском интерфейсе Binary Ninja, перекрывающиеся инструкции также подсвечиваются в графовом представлении.
Эвристика наиболее часто вызываемой функции выявляет 10% функций с наибольшим количеством вызовов из разных функций. Таким образом, эвристика может обнаружить:
Эвристика выявляет функции с большим количеством циклов. Такие функции могут реализовывать:
Эвристика также помогает выявить потенциальные узкие места производительности.
Эвристика выявляет функции с редкими и сложными структурами циклов, которые обычно указывают на:
Эвристика выявляет функции, выполняющие операцию XOR с константой внутри цикла. Таким образом, эвристика может обнаружить:
Эвристика выявляет функции, в которых выражения содержат более одной арифметической операции и одновременно одну булеву операцию. Таким образом, эвристика может обнаружить:
Эвристика использует итеративный подход контекстного хеширования для обнаружения повторяющихся многоблочных структур в графе потока управления каждой функции. Сравнивая сигнатуру опкодов каждого блока вместе с сигнатурами его преемников, эвристика выявляет подграфы, которые дублируются или почти дублируются в одной функции. Это помогает выявить:
Плагин также включает более узкие утилиты для интересных функций и областей кода. Они доступны в подменю Utils; команда All запускает их вместе с более общими эвристиками.
Эта утилита идентифицирует функции без известных вызывающих. Эти функции могут быть:
Эта утилита идентифицирует функции, которые не вызывают другие функции. Такие функции могут, например, быть:
Эта утилита идентифицирует рекурсивные функции — функции, которые прямо или косвенно вызывают сами себя. Рекурсивные функции могут указывать на:
Эта утилита оценивает энтропию каждой секции. Энтропия — это статистическая мера случайности со значениями от 0 до 8. Секции с энтропией, близкой к 8, указывают на высокую степень случайности и могут намекать на:
Эта утилита обнаруживает потенциальные реализации алгоритма RC4, используя эвристические маркеры, обычно связанные с алгоритмом планирования ключей (KSA) и алгоритмом генерации псевдослучайных чисел (PRGA) RC4. RC4 широко используется во вредоносном ПО для таких целей, как:
Для получения дополнительной информации обратитесь к @mr_phrazer.