1. SetWindowsHookEx()
MS에서는 프로세스간에 주고 받는 메시지를 후킹할 수 있는 함수를 제공해주는 데 그것이 바로 SetWindowsHookEx()
라는 함수이다.
idHook
- 후킹하고자 하는 메시지의 ID(메시지 유형은 msdn에서 참고)
- idHook 파라미터에 지정된 값의 이벤트(메시지)가 발생할 경우 훅 프로시저 동작
lpfn
- 훅 프로시저에 대한 포인터
hmod
- 훅 프로시저를 포함하는 DLL에 대한 핸들
dwThreadId
- 훅 프로시저를 호출하는 스레드 식별자
- 0이면 모든 스레드에서 훅을 호출
SetWindowsHookEx()
를 통해 우리는 특정 후크 프로시저를 후크 체인에 넣을 수 있으며, 특정 이벤트 발생 시 특정 스레드(모든 스레드가 될 수 있음)에서 훅 프로시저를 호출할 수 있게 된다.
2. SetWindowsHookEx DLL Injection
앞서 SetWindowsHookEx()
에 대한 내용을 살펴보면 짐작할 수 있듯이 악성코드가 SetWindowsHookEx()
를 통해 특정 이벤트가 발생하면 악성 DLL을 타겟 스레드(모든 스레드가 될 수 있음)에서 로딩되는 방식이다.
3. 동작 과정
크게 Injector와 악성 DLL로 나뉘는데 차례대로 살펴보자
(참고로, 악성 DLL의 익스포트 함수A는 악의적인 기능을 수행한다.)
① Injector프로세스가 실행되고 LoadLibrary
를 통해 악성 DLL을 자신의 주소 공간에 로드한다.
② GetProcAddress
를 통해 악성 DLL에 포함된 익스포트 함수A의 주소를 가져온다.
③ Injector는 악성 DLL 핸들과 함수A의 주소를 사용해 키보드 이벤트에 훅 프로시저를 등록하는데 이 때, SetWindowsHookEx()
를 사용한다.
④ 결국, 애플리케이션에서 키보드 이벤트가 트리거되면 애플리케이션은 악성dll을 로드하고 함수A를 호출한다.
참고로 악성코드는 발생 가능한 이벤트가 있는 한 다양한 이벤트에 훅을 설정할 수 있으며 가장 중요한 점은 DLL이 타겟 프로세스의 주소 공간으로 로드되고 악의적인 작업이 수행된다는 것이다.
관련 악성코드)
Locky Ransomware
, Trojan Padador
다른 참고자료에서 자세히 설명해주므로 직접 예제 코드로 테스트하는 것은 패스...
4. 참고자료
Hooking 관련)
SetWindowsHookEx DLL Injection관련)
Uploaded by Notion2Tistory v1.1.0