
Используйте правила YARA на трассировках Time Travel Debugging
Используйте правила YARA для трассировок Time Travel Debugging
Простой бинарный файл, запускающий calc.exe, упакованный с помощью UPX.
yara-ttd находит строку calc.exe в памяти модуля при создании потока.
calc.exeИспытуемый бинарный файл расшифровывает шеллкод и запускает его в новом потоке.
yara-ttd находит строку calc.exe в куче при перехвате функции ntdll!NtCreateThreadEx.
YARA — мощный инструмент сопоставления с образцом для бинарных файлов.
YARA — это инструмент, предназначенный (но не ограничивающийся этим) для помощи исследователям вредоносных программ в идентификации и классификации образцов вредоносных программ. С помощью YARA вы можете создавать описания семейств вредоносных программ (или всего, что хотите описать) на основе текстовых или бинарных шаблонов.
Благодаря YARA мы можем экономить много времени, автоматически классифицируя образцы вредоносных программ в конвейере перед их анализом.
К сожалению, большинство образцов вредоносных программ защищены различными видами упаковщиков. Классическая схема runtime-упаковщика, такая как UPX или VMProtect, заключается в самораспаковке и запуске обфусцированного, а иногда и зашифрованного кода. Поэтому YARA не может работать с упакованными бинарными файлами, поскольку не найдёт совпадений в упакованном коде.
Time Travel Debugging — или TTD — это функция встроенного отладчика Windows WinDbg.
Time Travel Debugging — это инструмент, который позволяет записать трассировку выполнения процесса, а затем воспроизвести её в дальнейшем как в прямом, так и в обратном направлении. Time Travel Debugging (TTD) упрощает отладку, позволяя «перематывать» сеанс отладчика назад, вместо того чтобы воспроизводить проблему до тех пор, пока вы не найдёте ошибку.
Для анализа вредоносных программ TTD — мощный инструмент, поскольку он позволяет записывать трассировку вредоносной программы в песочнице. Благодаря этому мы можем безопасно воспроизводить и передавать записанный файл за пределами песочницы для анализа вредоносной программы.
Кроме того, TTD не является отладчиком, поэтому его не обнаружат классические антиотладочные приёмы, такие как PEB.BeingDebugged.
Для более глубокого анализа TTD с точки зрения безопасности ознакомьтесь с этой статьёй: Deep dive into the TTD ecosystem
Конечно, TTD — это проприетарное программное обеспечение, и эта работа не могла бы появиться без ttd-bindings, разработанных commial.
Идея yara-ttd заключается в использовании файлов трассировки, записанных TTD, вместе с самим yara для борьбы с упаковщиками.
Поскольку yara не может сканировать сам упакованный бинарный файл, yara-ttd предлагает способ анализа файла трассировки, содержащего всю информацию о работе программы, включая процесс распаковки.
С помощью yara-ttd вы можете выбрать набор позиций в файле трассировки, в которых хотите сканировать память своими правилами yara.
Таким образом, вы можете перехватывать упакованный бинарный файл в любом месте с помощью своих правил yara!
yara-ttd предоставляет несколько стратегий сканирования памяти, например при загрузке модулей или при выделении виртуальной памяти, куда часто сохраняется код вредоносной программы после распаковки.
Пока что yara-ttd поддерживает только Windows, поскольку ему необходимо взаимодействовать с TTD API.
Сначала соберите проект:
mkdir build
cd build
cmake ..
cmake --build .
Затем поместите файлы TTDReplay.dll и TTDReplayCPU.dll в ту же директорию, где находится исполняемый файл.
Эти DLL-файлы можно найти в %LocalAppData%\Microsoft\WindowsApps\Microsoft.WinDbg_X\TTD
Сначала вам нужно записать трассировку (файл .run) вашей программы.
Подробную справку о том, как записать трассировку TTD, смотрите в этом руководстве.
Затем просто выполните:
.\yara-ttd path\to\rule path\to\trace\file
Существует три режима сканирования памяти:
Режим можно выбрать с помощью -m:
.\yara-ttd -m 1 path\to\rule path\to\trace\file
Как и в официальном CLI yara, вы можете использовать флаг -s для вывода подробностей о совпадениях, например адреса памяти и точного подправила, которое совпало.
Поскольку TTD не сохраняет структуру памяти, yara-ttd перед сканированием вычисляет структуру адресов кучи для каждой временной позиции.
Он создаст файл кэша с расширением .tmp в том же каталоге, где находится файл трассировки, для хранения структуры кучи.
Если вы хотите повторно запустить yara-ttd на трассировке и загрузить структуру кучи из созданного файла кэша, просто выполните:
.\yara-ttd -m 1 --cache=path\to\cache\file path\to\rule path\to\trace\file
С помощью TTD мы можем получить доступ ко всему диапазону памяти процесса, который соответствует минимальному и максимальному адресу, возвращаемому GetSystemInfo. Тем не менее, в большинстве случаев этот диапазон слишком велик, чтобы сканировать его без какой-либо оптимизации.
По умолчанию сканируются следующие временные позиции:
С помощью флагов -t и -f вы можете выбрать другие позиции или вызовы функций для сканирования:
.\yara-ttd -m 1 -t 3C1:A -t 5FF:22 -f ntdll!FreeVirtualMemory -f ntdll!NtCreateThreadEx path\to\rule path\to\trace\file
Флаг -t ожидает позиции TTD в формате major:minor (обе части в шестнадцатеричном виде, без 0x).
Флаг -f ожидает строку в формате module_name!function_name.
Вы также можете добавить все функции, которые хотите перехватывать, в файл:
> cat .\functions.txt
ntdll!FreeVirtualMemory
ntdll!NtCreateThreadEx
> .\yara-ttd -m 1 -F functions.txt path\to\rule path\to\trace\file
Если у вас есть несколько файлов для сканирования с помощью yara-ttd, вы также можете сканировать целую директорию.
yara-ttd проигнорирует все следующие расширения в папке:
.tmp (файлы кэша, созданные yara-ttd).idx (индексные файлы, созданные ttd).err (файлы ошибок, созданные ttd).out (файлы журналов, созданные ttd)В следующем примере yara-ttd просканирует только файлы trace01.run и trace02.run.
> dir .\traces
trace01.run
trace01.out
trace01.idx
trace02.run
trace01.run.err
trace01.tmp
> .\yara-ttd path\to\rule .\traces
В качестве альтернативы вы можете указать все трассировки, которые хотите сканировать, в файле и использовать флаг --scan-list или -l. При этом будут сканироваться файлы из списка, по одному на строку:
> cat .\scan_me.txt
.\traces\trace01.run
.\traces\trace02.run
> .\yara-ttd -l path\to\rule .\scan_me.txt
При сканировании нескольких файлов
yara-ttdвыполняет сканирование последовательно, а не одновременно с многопоточностью, как исходный CLIyara.