
벡터 예외 처리기와 해시 기반 조회를 사용해 런타임에 Windows API를 해석하여 임포트를 숨기고 공격용 페이로드의 리버스 엔지니어링을 지연시킵니다.
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 ; raise an exception
ret ; rax will hold address
LazyRet endp
그런 다음 이 주소를 사용할 수 있습니다.
아마도 리버스 엔지니어의 삶을 더 어렵게 만들 것이며, 이는 언제나 좋은 일입니다.