Тестовая сборка Windows
тестовая сборка Linux
Drltrace — это трассировщик динамических вызовов API для приложений Windows и Linux. Drltrace построен на основе платформы динамического двоичного инструментирования DynamoRIO. Drltrace был первоначально реализован Дереком Брюнингом и распространялся вместе с платформами DynamoRIO и DrMemory. Этот репозиторий содержит автономную версию drltrace с дополнительными скриптами и материалами о том, как использовать ее для анализа вредоносного ПО. Релизную сборку можно скачать здесь.
Использовать drltrace очень просто. Пользователю необходимо указать каталог журнала и имя целевого процесса следующим образом:
drltrace -logdir . -- calc.exe
Вот и все, инструмент внедрит необходимые DLL в целевой процесс, запустит инструментирование и параллельно будет регистрировать информацию обо всех вызовах библиотеки, которые выполняются в целевом процессе:
~~43600~~ msvcrt.dll!__wgetmainargs
arg 0: 0x010d2364
arg 1: 0x010d2368
and return to module id:0, offset:0x193a
~~43600~~ ntdll.dll!EtwEventRegister
arg 0: 0x002ff994
arg 1: 0x010d1490
and return to module id:0, offset:0x157e
~~43600~~ ntdll.dll!EtwEventSetInformation
arg 0: 0x007b4b40
arg 1: 0x00000033
and return to module id:0, offset:0x15a1
~~43600~~ SHELL32.dll!ShellExecuteW
arg 0: <null> (type=<unknown>, size=0x0)
arg 1: <null> (type=wchar_t*, size=0x0)
arg 2: calculator:// (type=wchar_t*, size=0x0)
arg 3: <null> (type=wchar_t*, size=0x0)
arg 4: <null> (type=wchar_t*, size=0x0)
arg 5: 0x1 (type=int, size=0x4)
and return to module id:0, offset:0x167d
Формат вывода прост и может быть легко проанализирован внешним скриптом:
~~[thread id]~~ [dll name]![api call name]
arg [arg #]: [value] (type=[Windows type name], size=[size of arg])
and return to module id:[module unique id], offset:[offset in memory]
Анализ с помощью grep
можно выполнить, если используется аргумент -grepable
; это печатает имена функций и аргументы в одной строке:
~~4824~~ KERNELBASE.dll!CreateFileW {0: C:WindowsFontsstaticcache.dat (type=wchar_t*, size=0x0)} {1: 0x80000000 (type=DWORD, size=0x4)} {2: 0x3 (type=DWORD, size=0x4)} {3: 0x005cde8c (type=<unknown>*, size=0x0)} {4: 0x3 (type=DWORD, size=0x4)} {5: 0x80 (type=DWORD, size=0x4)}
Таблица уникальных идентификаторов модуля выводится в конце файла журнала:
Module Table: version 3, count 70
Columns: id, containing_id, start, end, entry, checksum, timestamp, path
0, 0, 0x010d0000, 0x010da000, 0x010d1b80, 0x0000f752, 0xb5fe3575, C:WindowsSysWOW64calc.exe
1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:UsersMaxDownloadsdrltracedrltracedynamoriolib32releasedynamorio.dll
2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:UsersMaxDownloadsdrltracedrltracebinrelease/drltracelib.dll
3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:WindowsSystem32CRYPTBASE.dll
4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:WindowsSystem32SspiCli.dll
5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:WindowsSystem32GDI32.dll
6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:WindowsSystem32RPCRT4.dll
7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:WindowsSystem32IMM32.DLL
8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:WindowsSystem32advapi32.dll
9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:WindowsSystem32cfgmgr32.dll
10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:WindowsSystem32SHELL32.dll
Drltrace может легко фильтровать межбиблиотечные вызовы и печатать только вызовы API, выполненные из основного модуля (или из кучи) целевого приложения, указав опцию -only_from_app
, которая очень полезна в случае приложений, генерирующих огромные журналы. Для более детального управления опция -filter
позволяет пользователю указать файл конфигурации фильтра, чтобы фильтровать определенные функции из белого списка или игнорировать функции из черного списка (примеры см. в файле filter.config ). Drltrace также имеет несколько полезных внешних скриптов для фильтрации вызовов API для определенной библиотеки и печати только потенциально интересных вызовов API и строк.
Основные модули Drltrace распространяются под BSD.
Некоторые файлы, необходимые для drltrace, распространяются по лицензии LGPL. Более подробную информацию смотрите в исходных файлах.
Анализ вредоносного ПО — непростая задача. Сложные программные упаковщики, такие как Themida и Armadillo, и, конечно же, десятки неназванных упаковщиков, написанных авторами вредоносных программ, а также шифрование кода и данных значительно облегчают (в некоторых случаях делая это совершенно невозможным) статический обратный инжиниринг таких образцов, усложняя жизнь аналитикам вредоносного ПО. В таком случае отслеживание вызовов API может значительно сократить время, необходимое для понимания фактического злонамеренного намерения, и выявить множество технических подробностей о защищенном вредоносном коде.
Хотя традиционная техника перехвата API была успешно реализована в нескольких решениях, этот подход хорошо изучен авторами вредоносных программ и его можно легко обнаружить и/или обойти. Более того, эти инструменты распространяются как отдельные тяжелые приложения с графическим пользовательским интерфейсом (как проприетарные продукты), которые зачастую нелегко интегрировать в существующий рабочий процесс анализа вредоносного ПО.
Если мы посмотрим на мир Linux, то увидим замечательный инструмент под названием ltrace. Используя одну команду bash, мы можем легко получить полную трассировку вызовов API определенного исполняемого файла.
Почему у нас нет такого инструмента (например, ltrace в Linux) для Windows, который также прозрачен для антиисследовательских уловок, используемых современными вредоносными программами?
Оказывается, есть метод, который может помочь нам иметь такой инструмент для Windows и прозрачно отслеживать вызовы API по отношению к исполняемой программе. Этот метод называется динамическим двоичным инструментарием, он же DBI. DBI — это метод анализа поведения двоичного приложения во время выполнения посредством внедрения кода инструментирования.
Однако применение DBI для анализа вредоносного ПО незаслуженно ограничивается распаковкой автоматизации и рядом доказательств концепций трассировки инструкций, базовых блоков и вызовов функций. Насколько нам известно, drltrace — это первый инструмент для отслеживания вызовов API на основе DBI, который можно использовать на практике для анализа вредоносного ПО. В нашей вики мы привели несколько примеров анализа вредоносного ПО, где описали, как drltrace позволяет за несколько минут получить множество внутренних технических подробностей о сложных образцах вредоносных программ, даже не запуская IDA или отладчик.
-logdir [ .] Log directory to print library call data
-only_from_app [ false] Reports only library calls from the app
-follow_children [ true] Trace child processes
-print_ret_addr [ false] Print library call's return address
-num_unknown_args [ 2] Number of unknown libcall args to print
-num_max_args [ 6] Maximum number of arguments to print
-default_config [ true] Use default config file.
-config [ ""] The path to custom config file.
-filter [filter.config] The path of the whitelist/blacklist file.
-ignore_underscore [ false] Ignores library routine names starting with "_".
-help [ false] Print this message.
-version [ false] Print version number.
-verbose [ 1] Change verbosity.
-use_config [ true] Use config file
-grepable [ false] Grepable output
Drltrace поддерживает внешние файлы конфигурации, в которых пользователь может описать, как drltrace должен печатать аргументы для определенных вызовов API.
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
Каждый аргумент функции должен быть разделен |
. Первый аргумент — это тип возвращаемого значения, второй аргумент — это имя самой функции, а остальные — аргументы функции. Токен __out
используется для обозначения выходных аргументов, а ___inout
используется для обозначения аргументов ввода+вывода.
Вы можете найти примеры использования drltrace для анализа сложных вредоносных программ на нашей Wiki-странице.
Чтобы упростить работу с файлами журналов, мы реализовали скрипт api_calls_viz.py
, который можно использовать для создания изображений RGB, где каждый цвет пикселя представляет уникальный вызов API. Например, на рисунке ниже представлен файл журнала вредоносной программы WannaCry.
Большие зеленые области на рисунке представляют собой вызовы API ( wcscmp/wcsicmp
), которые используются для выбора файлов с интересными расширениями (например, docx, xls, py) для их шифрования. Фиолетовые области представляют собой вызовы API ( FindFirstFile/FindNextFile/CryptEncrypt
), которые используются для перечисления и шифрования файлов и папок на диске.
Скрипт также может генерировать HTML-представление сгенерированного изображения RGB, где каждый элемент можно выбрать для отображения имени вызова API.
Необработанный HTML-файл.
Дополнительную информацию см. в каталоге api_calls_viz
.
Подробное руководство вы можете найти на этой странице Wiki.
Windows, Linux (в будущем macOS).
x86, x64 (ARM в списке).
Стандартная библиотека C и C++ (и сценарии обработки журналов, написанные на Python).
Мы решили внедрить трассировщик вызовов API поверх инфраструктуры динамического двоичного инструментирования DynamoRIO. Drltrace просит DynamoRIO выполнить инструментирование вызова LoadLibrary, чтобы иметь возможность обрабатывать новые библиотеки, загружаемые целевым процессом. Когда процесс пытается загрузить новую библиотеку, DynamoRIO перенаправляет поток управления на drltracelib.dll
. В свою очередь, drltrace перечисляет экспортированные функции во вновь загруженной DLL и регистрирует для каждой из них специальный обратный вызов. Таким образом, если какая-либо экспортированная функция будет вызвана вредоносным ПО, обратный вызов drltrace будет выполнен перед этой функцией, и инструмент сможет записать всю необходимую информацию, такую как имя функции и аргументы. Другой обратный вызов может быть зарегистрирован после функции для сохранения результатов выполнения.
Почему не Intel Pin? Мы решили использовать DynamoRIO по следующим причинам:
-syswide_on
в drrun.exe
). Однако в будущем необходимо реализовать в drltrace специальную поддержку для таких ситуаций.Наш трекер проблем содержит более подробную информацию о будущем drltrace.
Максим Шудрак https://github.com/mxmssh
Дерек Брюнинг https://github.com/derekbruening
Джо Теста https://github.com/jtesta