[하루한줄] Bypassing Image Load Kernel Callbacks

URL

Bypassing Image Load Kernel Callbacks

Target

  • Windows

Explain

프로그램에서 LoadLibrary 함수를 통해 DLL 파일을 로드하면 커널에서 등록한 Callback 함수에 의해 이벤트 로그에 해당 DLL이 로드되었다는 내용가 기록됩니다. LoadLibrary 함수를 분석해보면, 해당 이벤트는 내부 구조체들이 링크되는 과정이나 코드가 실행될 때 발생하는 것이 아니라 메모리에 할당하고 이를 셋업하는 과정에서 NtMapViewOfSection 함수에 의해 발생하는 것을 알 수 있습니다. 실제 LoadLibrary 함수를 똑같이 구현하되 NtMapViewOfSection 함수까지의 과정만 구현하고 실행할 경우, DLL이 로드되었다는 이벤트만 발생할 뿐, 실제로 DLL이 로드되지는 않습니다.

Dylan은 커널의 Callback 함수 호출을 우회하여 이벤트 로그의 발생 없이 DLL을 로드하는 방법과 이를 구현한 DarkLoadLibrary 소스코드를 공개했습니다. 동작 과정은 아래와 같습니다.

  1. 정상적인 PE 포맷을 가지고 있는지 확인
  2. 헤더와 섹션 데이터를 메모리에 복사 후 메모리 권한 설정
  3. (필요하다면) 이미지 베이스 조정
  4. import table과 delayed import table 세팅
  5. TLS callback 실행
  6. exception handler 등록
  7. DllMain(Entry Point) 호출

Dylan은 이 기법을 통해 악성코드가 어떤 DLL을 로드했는지에 대한 로그를 숨길 수 있고 이 기법이 Reflective DLL Injection을 대체할 것으로 예상하고 있다고 밝혔습니다.