
Risolve le API di Windows in fase di esecuzione utilizzando gestori di eccezioni vettoriali e ricerche tramite hash per nascondere le importazioni e rallentare il reverse engineering di payload offensivi.
Ispirato da offuscamento API a 32 bit di Dridex Loader.
Configuriamo un gestore di eccezioni.
AddVectoredExceptionHandler( CALL_FIRST, ApiResolverHandler );
Questo gestore di eccezioni gestirà solo eccezioni generate come EXCEPTION_BREAKPOINT. Quando viene generata da noi, siamo in grado di catturare il CONTEXT. Possiamo ottenere gli argomenti passati.
RDX e R8 conterranno i nostri hash di funzione e modulo. Possiamo quindi risolverli dinamicamente con GetProcAddrExH come mostrato
ExceptionInfo->ContextRecord->Rax = (ULONG_PTR)GetProcAddrExH( ExceptionInfo->ContextRecord->Rdx, ExceptionInfo->ContextRecord->R8 );
RAX viene spesso utilizzato per restituire valori. Quando ritorniamo, se l'indirizzo è stato risolto, verrà restituito.
LazyRet proc
int 3 ; raise an exception
ret ; rax will hold address
LazyRet endp
Possiamo quindi usare questo indirizzo.
Probabilmente rende la vita di un reverse engineer più difficile, il che è sempre un bene.