
Löst Windows-APIs zur Laufzeit mithilfe von Vectored Exception Handler und gehashten Lookups auf, um Importe zu verbergen und das Reverse Engineering von offensiven Payloads zu verlangsamen.
Inspiriert von der 32-Bit-API-Verschleierung des Dridex-Loaders.
Wir richten einen Ausnahmehandler ein.
AddVectoredExceptionHandler( CALL_FIRST, ApiResolverHandler );
Dieser Ausnahmehandler behandelt nur Ausnahmen, die als EXCEPTION_BREAKPOINT ausgelöst werden. Wenn sie von uns ausgelöst wird, können wir den CONTEXT erfassen. Wir können die übergebenen Argumente abrufen.
RDX und R8 enthalten unseren Funktions- und Modul-Hash. Wir können sie dann dynamisch mit GetProcAddrExH auflösen, wie hier zu sehen:
ExceptionInfo->ContextRecord->Rax = (ULONG_PTR)GetProcAddrExH( ExceptionInfo->ContextRecord->Rdx, ExceptionInfo->ContextRecord->R8 );
RAX wird oft verwendet, um Rückgabewerte zu liefern. Wenn wir zurückkehren und die Adresse aufgelöst wurde, wird sie zurückgegeben.
LazyRet proc
int 3 ; raise an exception
ret ; rax will hold address
LazyRet endp
Wir können diese Adresse dann verwenden.
Das macht das Leben eines Reverse Engineers wahrscheinlich schwerer, was immer gut ist.