
Resolve APIs do Windows em tempo de execução usando manipuladores de exceção vetorizados e buscas com hash para ocultar importações e retardar a engenharia reversa de payloads ofensivos.
Inspirado pela ofuscação de API de 32 bits do Dridex Loader.
Configuramos um manipulador de exceções.
AddVectoredExceptionHandler( CALL_FIRST, ApiResolverHandler );
Este manipulador de exceções só tratará exceções lançadas como EXCEPTION_BREAKPOINT. Quando é lançada por nós, conseguimos capturar o CONTEXT. Podemos obter os argumentos passados.
RDX e R8 conterão o hash da nossa função e do módulo. Podemos então resolvê-los dinamicamente com GetProcAddrExH como visto
ExceptionInfo->ContextRecord->Rax = (ULONG_PTR)GetProcAddrExH( ExceptionInfo->ContextRecord->Rdx, ExceptionInfo->ContextRecord->R8 );
O RAX é frequentemente usado para retornar valores. Quando retornamos, se o endereço foi resolvido, ele será retornado.
LazyRet proc
int 3 ; raise an exception
ret ; rax will hold address
LazyRet endp
Podemos então usar esse endereço.
Provavelmente torna a vida do engenheiro reverso mais difícil, o que é sempre bom.