메세지 후킹은 키보드나 마우스로 입력할 떄 이를 가로채는 기술을 말한다.
윈도우에서 발생하는 키보드 혹은 마우스 입력은 메시지 형태로 다루어진다.
이를 위해선 User32.dll, GDI32.dll , Kernel32.dll 위 세가지가 필요하다.
<윈도우 3대 핵심 DLL>
위 그림과 같이 User32.dll은 대부분 사용자 입력을 받는 역할을 하고 GDI는 어디엔가 결과를 표현하는 역할을 하며, kernel 은 실행을 위한 쓰레드 관리, 메모리 관리 등을 담당한다.
키보드나 마우스로부터 입력에 대한 신호가 오면 디바이스 드라이버는 프로그래머가 다룰수 있는 API로 프로그래밍 할 수 있도록 메시지로 변환 시켜준다.
프로세스가 다른 프로세스의 영역을 함부로 건드릴 수 없다는 것은 기본적으로 알고 있는 사실일 것이다. 메시지 후킹을 하기 위해서는 Hook프로세스가 다른 프로세스에게 가는 메시지를 가로채야 하는데 이를 위해 DLL형태로 담아야 한다.
이유는 DLL은 공유데이터에 로드되고 같이 읽히기 때문에 다른프로세스영역을 침범하기 때문이다.
메세지를 처리하는 방식에는 두가지가있다.
GetMessage();
PeekMessage();
비슷한 함수이지만, GetMessage함수는 메세지를 가져올 때까지 계속 대기한다. 하지만 PekkMessage함수는 메시지가 없어도 리턴을 해버린다. 가져올 메시지가 없으면 바로 윈도우로 제어를 다시 넘기기 때문에 다른 루틴을 실행할 수 있다.
또한, 메세지를 보낼 때는 다음과 같은 형태를 취하게 된다.
LRESULT SendMessage(
HWND hwnd,
UINT Msg,
WPARAM WParam,
LPARAM lParam
);
SendMessage는 메시지를 보내고 결과를 가져와서 사용해야 할때 이용한다. 결과값을 얻어와야 하기 때문에 메시지를 받은 측에서 리턴할때까지 기다린다.
BOOL PostMessage(
HWND hwnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
메시지 큐에 메시지를 추가해 놓고 바로 리턴함.
만일, 키보드에서 키하나를 누른다면, WM_KEYDOWN 메시지가 발생하고, 이것을 GetMessage가 받으면 시스템은 입력받은 가상 키 정보를 캐릭터 타입으로 변환하여 리턴 하며, TranslateMessage는 메시지큐에 WM_CHAR를 넣는다.따라서 키입력시 발생하는 메시지 순서는,
WM_KEYDOWN
WM_CHAR
WM_KEYUP
이다. 이런 흐름을 바꾸는 기술을 메시지 훅이라고 한다.
메시지 후킹을 하기 위한 윈도우 가장 핵심적인 함수는 SetWindowsHookEx();이다.
SetWindowsHookEx(
int idHook;
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwTreeadID
);
idHook : 훅의 종류를 결정한다.
WH_CALLWNDPROC - SendMessage로 누군가에게 메시지를 보낼때 누군가가 WH_CALLWNDPROC를 걸어놓았는지를 확인한다. 누군가 걸었다면 해당 훅 프로시저를 호출함.
WH_CALLWNDPROCRET - 첫번쨰 옵션과는 반대로 메시지를 보내고 나서 훅을 건 녀석이 있는지 확인하고 있으면, 훅 프로시저를 부른다. WH_CALLWNDPROC는 메시지 값을 조작하기 위해 윈도우로 메시지가 가기 전에 가로채는 일이 많다.
WH_GETMESSAGE - 윈도우에 와 있는 메시지를 GetMessage나 PekkMessage등으로 가져가려고 할 때 사용한다.
WH_KEYBOARD - 입력 포커스가 없어도 키 입력을 가로챔.
WH_JOURNALRECORD
WH_JOURALRECORDPLAYBACK
'System > Windows' 카테고리의 다른 글
DLL (0) | 2012.08.21 |
---|---|
visual studio DLL complie (0) | 2012.08.21 |
CreateProcess (2) | 2012.08.03 |
파일복사 api (0) | 2012.08.02 |
WinAPI 레지스트리 (0) | 2012.07.27 |