
Resuelve las APIs de Windows en tiempo de ejecución mediante manejadores de excepciones vectorizados y búsquedas con hash para ocultar las importaciones y ralentizar la ingeniería inversa de payloads ofensivos.
Inspirado por la ofuscación de API de 32 bits del cargador Dridex.
Configuramos un manejador de excepciones.
AddVectoredExceptionHandler( CALL_FIRST, ApiResolverHandler );
Este manejador de excepciones solo manejará las excepciones lanzadas como EXCEPTION_BREAKPOINT. Cuando es lanzada por nosotros, podemos capturar el CONTEXT. Podemos obtener los argumentos pasados.
RDX y R8 contendrán nuestro hash de función y módulo. Entonces podemos resolverlos dinámicamente con GetProcAddrExH como se ve
ExceptionInfo->ContextRecord->Rax = (ULONG_PTR)GetProcAddrExH( ExceptionInfo->ContextRecord->Rdx, ExceptionInfo->ContextRecord->R8 );
RAX se usa a menudo para devolver valores. Cuando retornamos, si la dirección fue resuelta, se devolverá.
LazyRet proc
int 3 ; lanza una excepción
ret ; rax contendrá la dirección
LazyRet endp
Entonces podemos usar esta dirección.
Probablemente hace la vida más difícil a los ingenieros inversos, lo cual siempre es bueno.