웬디의 기묘한 이야기

글 작성자: WENDYS
반응형

윈도우 개발 기법 중 하나가 후킹이라는 기법이 있습니다. 생각보다 간단하게 제어를 할 수 있다는 장점이 있습니다.

거기다가 해당 기법은 MSDN에서 제공되는 공식적인 기술이기 때문에 MSDN 문서도 존재합니다.

https://docs.microsoft.com/en-us/windows/win32/winmsg/hooks

 

Hooks - Windows applications

Hooks In this article --> A hook is a point in the system message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain types of messages before they reach the target window proced

docs.microsoft.com

Windows Message Hooking?

후킹이 뭐냐 하면 내가 만든 프로그램을 시스템 또는 다른 프로그램에 SPY로 심어두는 것을 말합니다.

예를 들어 마우스 메시지를 후킹 한다고 했을 때 마우스의 클릭이벤트 메시지가 발생한 경우 SPY를 통해 먼저 알아채고 시스템으로 전달하는 것입니다.

이때 만약 Left Click Message를 Right Click Message로 다른 정보를 전달한다던지 아예 클릭을 안 했다고 시스템에 전달을 하는 등의 행위를 할 수 있도록 하는 기법 이 바로 후킹입니다.

마우스 메시지뿐만 아니라 키보드 메시지 후킹을 하여 키로그를 작성한다던지, 기타 메시지를 모두 후킹 하여 처리를 할 수도 있습니다.

 

WIndows Message Hooking 활용 범위

개발자라면 많이들 사용하는 SPY++ 프로그램 등이 해당 기법을 이용하여 개발되어있습니다.

그리고 제가 만들어 사용중인 마우스 제스처 프로그램이 있습니다. 이부분은 추후 차근차근 설명 드리며 함께 만들어보겠습니다.

 

주의사항

위의 그림에서 보면 알 수 있듯이 OS의 Message Queue와 Application Message Queue 사이에서 행위를 하기 때문에 EXE에서 구현하는 형태가 아닌 DLL에서 후킹이 구현되어야 합니다.

즉, DLL을 일반적으로 DLL을 로드해야 하기에 EXE, DLL 모두 필요하게 됩니다.

 

SetWindowsHookExA

HHOOK SetWindowsHookExA( // Hooking 설치

    __in int idHook, // HOOK TYPE

    __in HOOKPROC lpfn, // HOOK PROCEDURE

    __in HINSTANCE hmod, // DLL INSTANCE HANDLE

    __in DWORD dwThreadId

    );

 

BOOL UnhookWindowsHookEx( // Hooking 해제

    __in HHOOK hhk

    );

 

EXE에서는 DLL을 LOAD하기만 하고 실제 DLL에서 SetWindowsHookExA API를 호출하여 후킹을 설치하게 됩니다.

만약 작업이 끝났다면 UnhookWindowsHookEx를 이용하여 반드시 언훅을 하도록 합니다.

 

https://docs.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-setwindowshookexa

 

SetWindowsHookExA function (winuser.h)

Installs an application-defined hook procedure into a hook chain.

docs.microsoft.com

앞으로 후킹을 이용하여 함께 프로그램을 만들어보겠습니다.

기대해주세요!

반응형