Спасибо за вопрос. Вы правы, что GetProcAddressможет быть триггером в динамическом или эвристическом анализе, но в статическом анализе он легитимен на 100% по нескольким причинам.
Статические сигнатуры строятся на паттернах - уникальных байт-кодах, хэшах участков кода, специфичных последовательностях API. Одиночный вызов GetProcAddress встречается в миллионах легитимных приложений (от драйверов принтеров до игр Steam). Внедрение сигнатуры на него даст миллион ложных срабатываний - ни один вендор этого не сделает
GetProcAddress(“NtCreateThreadEx”) + вызов полученного адреса + отсутствие цифровой подписи + работа из временной директории - да, это повод для алерта. Но в нашем случае GetProcAddress используется для VirtualAlloc, LoadLibrary, GetProcAddress (рекурсивно для самой себя) функций, которые легитимный рантайм Rust или любой инсталлятор вызывает на раз
Спасибо за вопрос. Вы правы, что
GetProcAddressможет быть триггером в динамическом или эвристическом анализе, но в статическом анализе он легитимен на 100% по нескольким причинам.Статические сигнатуры строятся на паттернах - уникальных байт-кодах, хэшах участков кода, специфичных последовательностях API. Одиночный вызов GetProcAddress встречается в миллионах легитимных приложений (от драйверов принтеров до игр Steam). Внедрение сигнатуры на него даст миллион ложных срабатываний - ни один вендор этого не сделает
GetProcAddress(“NtCreateThreadEx”) + вызов полученного адреса + отсутствие цифровой подписи + работа из временной директории - да, это повод для алерта. Но в нашем случае GetProcAddress используется для VirtualAlloc, LoadLibrary, GetProcAddress (рекурсивно для самой себя) функций, которые легитимный рантайм Rust или любой инсталлятор вызывает на раз