
Разрешает Windows API во время выполнения с помощью векторных обработчиков исключений и поиска по хешам, чтобы скрывать импорты и замедлять реверс-инжиниринг атакующих нагрузок.
Вдохновлено обфускацией 32-битного API Dridex Loader.
Мы устанавливаем обработчик исключений.
AddVectoredExceptionHandler( CALL_FIRST, ApiResolverHandler );
Этот обработчик исключений будет обрабатывать только исключения, выбрасываемые как EXCEPTION_BREAKPOINT. Когда оно выбрасывается нами, мы можем захватить CONTEXT. Мы можем получить переданные аргументы.
Регистры RDX и R8 будут содержать хэш нашей функции и модуля. Затем мы можем динамически разрешить их с помощью GetProcAddrExH, как показано ниже
ExceptionInfo->ContextRecord->Rax = (ULONG_PTR)GetProcAddrExH( ExceptionInfo->ContextRecord->Rdx, ExceptionInfo->ContextRecord->R8 );
RAX часто используется для возврата значений. Когда мы возвращаемся, если адрес был разрешён, он будет возвращён.
LazyRet proc
int 3 ; raise an exception
ret ; rax will hold address
LazyRet endp
Затем мы можем использовать этот адрес.
Вероятно, это усложняет жизнь реверс-инженеру, что всегда хорошо.