1. 훅(Hook)
영어로 Hook, 우리말로는 갈고리, 낚시바늘 정도의 뜻을 가지고 있는데, 원하는 것을 낚아 채고 싶을 때 사용하는 도구이다. 이 갈고리나는 뜻이 확장되어서 정보를 엿보거나 가로채는 경우에도 훅이라는 말을 쓴다.
중간에 오고가는 정보를 엿보거나 가로채기 위해 초소를 설치하는 일을 훅(hook)을 건다(설치한다)라고 하고, 실제로 정보를 엿보고 조작하는 행위를 후킹(Hooking)한다.
컴퓨터 분야에서도 후킹이 광범위하게 사용되고 있다. 그 중에서 가장 기본적인 메시지 훅(Massage Hook)에 대해 설명한다.
2. 메시지 훅
Windows 운영체제는 GUI를 제공하고, 이는 Event Driven 방식으로 동작한다. 키보드/마우스를 이용하여 메뉴 선택, 버튼 선택, 마우스 이동, 창 크기 변경, 창 위치 이동 등의 작업은 모두 이벤트(Event)이다. 이런 이벤트가 발생할 때 OS는 미리 정의된 메시지를 해당 응용프로그램으로 통보한다. 응용 프로그램은 해당 메시지를 분석하여 필요한 작업을 진행한다. 즉 키보드를 입력할 때에도 OS로부터 응용프로그램으로 메시지가 이동한다. 메시지훅이란 바로 이런 메시지를 중간에서 엿보는 것을 말한다. 아래의 그림을 보자
다음은 일반적인 경우의 Windows 메시지 흐름에 대한 설명이다.
- 키보드 입력 이벤트가 발생하면 WM_KEYDOWN 메시지가 [OS message queue]에 추가 된다.
- OS는 어느 응용 프로그램에서 이벤트가 발생했는지 파악해서 [OS message queue]에서 메시지를 꺼내어 해당 응용프로그램의[application message queue]에 추가한다.
- 응용프로그램(ex 메모장)은 자신의 [application message queue]를 모니터링하고 있다가 WM_KEYDOWN 메시지가 추가된 걸 확인하고 해당 event handler를 호출한다.
그림에서와 같이 키보드 메시지 훅이 설치되었다면, OS 메시지 큐와 응용 프로그램 메시지 큐 사이에 설치된 훅 체인(Hook Chain)에 있는 키보드 메시지 훅들이 응용프로그램보다 먼저 해당 메시지를 볼 수 있다. 키보드 메시지 훅 함수 내에서는 메시지를 단순히 엿보는 기능뿐만 아니라 메시지 자체의 변경도 간으하며 또한 메시지를 가로채서 아래로 내려보내지 않게 할 수도 있다.
같은 키보드 메시지 훅이라도 여러개를 동시에 설치할 수 있다. 이러한 훅은 설치 순서대로 호출되기 때문에 이를 훅체인이라고 한다.
이러한 메시지 훅 기능은 Windows 운영체제에서 제공하는 기본 기능이며 대표적인 프로그램으로 MS Visual Studio에서 제공되는 SPY++가 있다. SPY++는 막강한 후킹 프로그램으로서 운영체제에서 오고가는 모든 메시지를 볼 수 있다.
3. SetWindowsHookEX()
메시지 훅은 SetWindowsHookEX() API를 사용해서 간단히 구현할 수 있다. .SetWindowsHook() API 정의는 아래와 같다.
HHOOK SetWindowsHookEx( |
hook procedure는 운영체제가 호출해주는 콜백 함수이다. 메시지 훅을 걸 때 hook procedure는 DLL 내부에 존재해야 하며 그 DLL의 인스턴스 핸들이 바로 hMod이다.
dwThreadid 파라미터에 0을 주고 호출하면 글로벌 훅(global hook)이 설치되며 실행중인(그리고 향후 실행될)모든 프로세스에 영향을 미친다.
이렇게 SetWidowsHookEX()를 이용해서 훅을 설치해 놓으면, 어떤 프로세스에서 해당 메시지가 발생햇을 때 운영체제가 해당 DLL 파일을 해당 프로세스에 강제로 인젝션(Injection)하고 등록된 hook Procedure을 호출한다.
'리버스 엔지니어링' 카테고리의 다른 글
HookMain.exe 디버깅 (0) | 2018.05.28 |
---|---|
키보드 메시지 후킹 실습 (0) | 2018.05.26 |
UPack PE헤더 상세 분석 -2 (0) | 2018.05.15 |
UPack PE헤더 상세 분석 -1 (0) | 2018.05.15 |
실행파일에서 .reloc 섹션 제거하기 (0) | 2018.05.15 |