Технический анализ методов обфускации DanaBot

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
DanaBot — это платформа вредоносного ПО как услуга, обнаруженная в 2018 году и предназначенная для кражи конфиденциальной информации, которая может быть и ~/ XSS.is спользована для электронного мошенничества, кражи криптовалюты или выполнения шпионских действий.

Вредоносное ПО сильно запутано, что делает его реверс-инжиниринг и анализ очень трудным и трудоемким.

Zscaler ThreatLabz провела реверс-инжиниринг различных методов обфускации, используемых DanaBot, и разработала набор инструментов с использованием сценариев IDA Python для помощи в двоичном анализе.

DanaBot, впервые обнаруженная в 2018 году, представляет собой платформу, предоставляющую вредоносное ПО как услугу, которую злоумышленники используют для кражи имен пользователей, паролей, файлов cookie сеанса, номеров счетов и другой личной информации (PII). Злоумышленники могут использовать эту украденную информацию для совершения банковского мошенничества, кражи криптовалюты или продажи доступа другим злоумышленникам.

Хотя DanaBot уже не так заметен, как раньше, вредоносное ПО по-прежнему представляет собой серьезную и активную угрозу. Недавно в сети была обнаружена версия 2646 вредоносного ПО, а также исследователь опубликовал в Твиттере скриншоты рекламного сайта Danabot, показанные на рисунке 1.

1695283738635.png



К сожалению, разработчики DanBot проделали очень хорошую работу по запутыванию кода вредоносного ПО. Поэтому реверс-инжиниринг и анализ очень трудный и трудоемкий процесс. Это сопутствующая запись в блоге к набору скриптов IDA Python, которые Zscaler ThreatLabz публикует на нашей странице Github. Цель сценариев — помочь снять некоторые слои обфускации DanaBot и стимулировать дополнительные исследования не только методов обфускации, но и самого вредоносного ПО.

Технический анализ

В следующих разделах суммируются многочисленные методы, которые разработчики DanaBot реализовали для запутывания двоичного кода вредоносного ПО.

Мусорные байтовые переходы

Одним из первых методов антианализа, который использует DanaBot, является команда «перехода ненужного байта». Это метод защиты от дизассемблирования, при котором инструкция перехода всегда будет перепрыгивать ненужный байт. Ненужный байт пропускается во время нормального выполнения программы, но заставляет IDA Pro отображать неправильную дизассемблирование. Пример этого метода показан на рисунке 2:

1695283771040.png



Скрипт IDA Python 01_junk_byte_jump.py ищет шаблоны перехода ненужных байтов и исправляет их с помощью инструкций NOP. Эта операция исправляет дизассемблирование IDA Pro, как показано на рисунке 3.

1695283779145.png



Динамические возвраты

Следующий прием антианализа — операция «динамического возврата». Этот метод вычисляет новый адрес возврата в конце функции, вызывая изменение потока управления программой. В реализации DanaBot они используются для «расширения» функции, открывая дополнительный скрытый код. Пример динамического возврата показан на рисунке 4.

1695283790337.png



Используя скрипт IDA Python 02_dynamic_return.py, эти динамические возвраты можно исправить, расширить функции и открыть скрытый код. Пример этого показан на рисунке 5.

1695283798959.png



Подготовка к деобфускации строк стека и повторный анализ кода

Прежде чем перейти к дополнительным методам антианализа DanaBot, мы включили три скрипта IDA Python:

03_uppercase_jumps.py
04_letter_mapping.py
05_reset_code.py

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

Прежде чем запускать третий скрипт, убедитесь, что в IDA Pro «Options->Compiler…» установлено значение «Delphi» (см. рисунок 6).

1695283932137.png



Поскольку предыдущие сценарии исправили много существующего кода и открыли кучу нового кода, сценарий 05_reset_code.py помогает сбросить и повторно проанализировать измененный код в IDA Pro, чтобы получить более чистую базу данных IDB. После завершения сценария и анализа может потребоваться очистка вручную. Наш общий метод:

Поиск → Последовательность байтов…
Найдите стандартный пролог функции: 55 8B EC
Сортировать по функциям
Для каждого результата без определенной функции:
Щелкните правой кнопкой мыши → Создать функцию…
Найдите адреса, вызывающие проблемы, в окне «Вывод».
Щелкните правой кнопкой мыши → Отменить определение
Щелкните правой кнопкой мыши → Код.

Ненужные вызовы функций StrAsg и StrCopy


DanaBot добавляет много ненужного кода, чтобы замедлить и усложнить реверс-инжиниринг. Одним из шаблонов ненужного кода является добавление посторонних вызовов функций StrAsg и StrCopy. Эти функции являются частью стандартной библиотеки Delphi и используются для присвоения или копирования данных между переменными. На рис. 7 показан пример фрагмента кода с несколькими такими вызовами. Если мы проследим аргументы переменных, то увидим, что они обычно присваиваются самим себе или небольшому набору других переменных, которые не используются в реальном коде вредоносного ПО.

1695283949301.png



Скрипт IDA Python 06_fake_UStrLAsg_and_UStrCopy.py пытается найти и исправить эти нежелательные вызовы. На рисунке 8 показан результат примера с рисунка 7.


1695283959129.png


Стек строк


Следующий метод обфускации — это версия DanaBot создания «строк стека». Вредоносное ПО присваивает буквы алфавита отдельным переменным, а затем использует эти переменные, указатели на эти переменные и различные функции обработки символов/строк Delphi для построения строк по одному символу за раз. На рис. 9 приведен пример построения строки «wow64.dll».

1695283973783.png



Эти строки стека засоряют большинство вредоносных функций в DanaBot и очень легко приводят к усталости от обратного проектирования. Кроме того, хотя некоторые из созданных строк используются для вредоносных программ, большинство из них оказываются ненужными строками. На рис. 10 показан фрагмент вывода сценария, который будет представлен ниже. Как видно на рисунке, большинство строк представляют собой случайные имена DLL, исполняемых файлов и Windows API.

1695283982907.png



Лучший способ извлечь эти строки стека — эмулировать код конструкции, но по следующим причинам мы экспериментировали с другим методом деобфускации:

Таких строк тысячи
Нет четких шаблонов начала/конца для автоматического извлечения кода конструкции.
Они полагаются на стандартные функции Delphi, которые не так-то легко имитировать.
Большинство из них - мусорные строки
Огромный объем строительного кода больше всего затрудняет анализ вредоносного ПО.


Целью сценариев IDA Python 07_stack_string_letters_to_last_StrCatN_call.py и 08_set_stack_string_letters_comments.py является не извлечение абсолютно точной строки стека, а достаточное количество строки, чтобы определить, является ли она мусорной или нет. После некоторых экспериментов методом проб и ошибок сценарии также изо всех сил стараются удалить код построения строки стека, чтобы значительно упростить анализ. Если строка оказывается допустимой, исходный код конструкции сохраняется в виде комментариев, поэтому при необходимости можно выполнить правильное извлечение строки.

Пустые циклы и ненужные математические циклы

После удаления ненужных вызовов функций StrAsg и StrCopy и строк стека останется куча пустых циклов. Скрипт IDA Python 09_empty_loops.py можно использовать для удаления этих циклов. Также останутся циклы, содержащие только ненужный математический код (см. рис. 11). Скрипт IDA Python 10_math_loops.py удалит эти ненужные математические циклы кода.

1695284020679.png



Ненужные строки и ненужные глобальные переменные

Как мы видели в разделе строк стека выше, было много ненужных строк DLL, исполняемых файлов и имен Windows API. Эти ненужные строки существуют и как обычные строки, см. пример на рис. 12.

1695284034300.png



Хотя мы не нашли подходящих шаблонов для автоматического удаления ссылок на эти ненужные строки, скрипт IDA Python 11_rename_junk_variables.py переименовывает их в «мусор», чтобы упростить анализ вручную.

DanaBot также добавляет много ненужного кода, включающего глобальные переменные и различные математические операции (см. пример на рис. 13).

1695284044276.png



Скрипт IDA Python 12_rename_junk_random_variables.py пытается найти и переименовать эти переменные как «мусор», чтобы облегчить анализ.

Разные советы и рекомендации

Основываясь на нашем многолетнем опыте обратного проектирования DanaBot, мы обнаружили, что следующие различные приемы и советы могут оказаться полезными. Первый — использование программы Interactive Delphi Reconstructor (IDR) для экспорта стандартных функций библиотеки Delphi и имен переменных. Мы используем Инструменты → Генератор MAP и Инструменты → Генератор IDC для экспорта файлов MAP и IDC. Хотя IDR создает сценарий IDA IDC, мы не используем его напрямую, поскольку это ухудшает качество дизассемблирования/декомпиляции IDA Pro. Вместо этого мы используем сценарии idr_idc_to_idapy.py и idr_map_to_idapy.py для извлечения информации из сгенерированных файлов IDC и MAP и используем выходные сценарии для импорта информации об именах.

DanaBot разрешает некоторые из своих функций Windows API с помощью хеша, поэтому мы используем плагин HashDB IDA OALabs (который недавно добавил поддержку алгоритма хеширования DanaBot) для разрешения имен с помощью хеша.

Наконец, мы широко используем функцию щелчка правой кнопкой мыши → Свернуть элемент в IDA Pro, чтобы скрыть оставшийся ненужный код, особенно переименованные ненужные строки и глобальные переменные.

Пример до и после

В качестве общего примера на рис. 14 показан снимок экрана части кода DanaBot до применения сценариев деобфускации. Детали кода не имеют особого значения для этого обсуждения, но фрагмент показывает инициализацию DanaBot его 455-байтовой двоичной структуры.

1695284067727.png



На рис. 15 показан пример того же фрагмента кода после применения сценариев деобфускации.

1695284077707.png




Заключение

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

Переведено специально для XSS.IS
Автор перевода: yashechka
Источник: https://www.zscaler.com/blogs/security-research/technical-analysis-danabot-obfuscation-techniques
 
Сверху Снизу