
Résout les API Windows à l'exécution à l'aide de gestionnaires d'exceptions vectorisés et de recherches par hachage pour masquer les imports et ralentir la rétro-ingénierie des charges utiles offensives.
Inspiré par l'obfuscation d'API 32 bits du chargeur Dridex.
Nous configurons un gestionnaire d'exceptions.
AddVectoredExceptionHandler( CALL_FIRST, ApiResolverHandler );
Ce gestionnaire d'exceptions ne traitera que les exceptions levées en tant que EXCEPTION_BREAKPOINT. Lorsqu'elle est levée par nous, nous sommes capables de capturer le CONTEXT. Nous pouvons obtenir les arguments passés.
RDX et R8 contiendront notre fonction et le hash du module. Nous pouvons ensuite les résoudre dynamiquement avec GetProcAddrExH comme on le voit
ExceptionInfo->ContextRecord->Rax = (ULONG_PTR)GetProcAddrExH( ExceptionInfo->ContextRecord->Rdx, ExceptionInfo->ContextRecord->R8 );
RAX est souvent utilisé pour retourner des valeurs. Lorsque nous revenons, si l'adresse a été résolue, elle sera retournée.
LazyRet proc
int 3 ; lève une exception
ret ; rax contiendra l'adresse
LazyRet endp
Nous pouvons ensuite utiliser cette adresse.
Cela rend probablement la vie d'un ingénieur en rétro-ingénierie plus difficile, ce qui est toujours une bonne chose.