Динамическое разрешение API - это концепция программирования, при которой определение того, какие функции или методы следует вызывать в программном приложении, происходит во время выполнения программы, а не на этапе компиляции. В традиционном программировании интерфейсы прикладного программирования (API) обычно разрешаются статически, то есть компилятор определяет и связывает конкретные функции или методы во время компиляции. В отличие от этого, динамическое разрешение API позволяет гибко выбирать и вызывать функции или методы на основе условий, которые оцениваются во время выполнения программы. Такой подход полезен в сценариях, где точные детали реализации или версии API неизвестны или могут динамически меняться в процессе выполнения программы.
Обфусцированные файлы или данные: Динамическое разрешение API
Злоумышленники обычно используют функции Native API, предоставляемые операционной системой, для выполнения различных задач, связанных с процессами, файлами и другими системными артефактами. Однако существует риск, что эти вызовы API могут оставлять статические артефакты, например строки в файлах полезной нагрузки. Аналитики вредоносного ПО могут использовать эти артефакты и другие структуры, такие как таблица адресов импорта (IAT), чтобы выяснить, какие функции выполняются вредоносным ПО.
Чтобы устранить этот риск, злоумышленники прибегают к динамическому разрешению API. Техника динамического разрешения API позволяет злоумышленникам обфусцировать API-функции, вызываемые их вредоносным ПО, чтобы скрыть основные функциональные возможности и характеристики вредоносного ПО до момента выполнения.
Один из распространенных подходов предполагает использование хэшей имен API-функций. Эти хэши или другие идентификаторы выступают в качестве криптографических представлений имен функций и используются вредоносным ПО для ручного воспроизведения процесса связывания и загрузки с помощью таких функций, как GetProcAddress() и LoadLibrary(). Однако злоумышленники не останавливаются на хэшах; они могут дополнительно обфусцировать эти идентификаторы с помощью шифрования или других приемов манипулирования строками. Этот дополнительный слой обфускации требует различных форм деобфускации или декодирования во время выполнения вредоносной программы, что усложняет процесс анализа.
Бэкдор LobShot использует этот распространенный метод динамического разрешения API. Вредоносная программа использует приведенные ниже функции для разрешения имен API-интерфейсов Windows, необходимых во время выполнения программы, а не помещает их импорт в программу заранее.
1 2 3 4 5 6 7 8 9 10 11 | api_advapi_32 = LoadLibraryA(library_advapi32); v1 = api_advapi_32; if ( !api_advapi_32 ) return 0; api_RegOpenKeyExA = GetProcAddress(api_advapi_32, api_RegOpenKeyExA_0); if ( !api_RegOpenKeyExA ) return 0; api_RegSetValueA = GetProcAddress(v1, api_RegSetValueA_0); if ( !api_RegSetValueA ) return 0; api_SystemFunction036_0 = GetProcAddress(v1, api_SystemFunction036); |
LockBit 3.0 используется очень сложный метод динамического разрешения API. Вредоносная программа восстанавливает таблицу адресов импорта (IAT) в три этапа. На первом этапе вредоносная программа идентифицирует DLL в системной памяти с помощью хэшей строк. На втором этапе LockBit 3.0 извлекает адрес API, разбирая список InLoadOrderModuleList и сравнивая хэш имени API. На третьем, заключительном, этапе вымогатель произвольно выбирает один из пяти доступных шлейфов для восстановления IAT. Каждая заглушка извлекает подлинный адрес API с помощью операции кругового сдвига и XOR, используя жестко закодированный ключ.