Dridex Loader の32ビットAPI難読化に触発されました。
例外ハンドラをセットアップします。
AddVectoredExceptionHandler( CALL_FIRST, ApiResolverHandler );
この例外ハンドラは、EXCEPTION_BREAKPOINTとして投げられた例外のみを処理します。それが私たちによって投げられたとき、CONTEXTをキャプチャできます。渡された引数を取得できます。
RDXとR8は、関数とモジュールのハッシュを保持します。それをGetProcAddrExHで動的に解決できます。次のように使います。
ExceptionInfo->ContextRecord->Rax = (ULONG_PTR)GetProcAddrExH( ExceptionInfo->ContextRecord->Rdx, ExceptionInfo->ContextRecord->R8 );
RAXは値を返すためによく使われます。戻るとき、アドレスが解決されていれば、それが返されます。
LazyRet proc
int 3 ; 例外を発生させる
ret ; rax はアドレスを保持する
LazyRet endp
その後、このアドレスを使用できます。
おそらくリバースエンジニアの生活をより困難にするからです。それは常に良いことです。