프로그래밍/MFC

메시지 훅킹

이재만박사 2018. 2. 8. 23:01

메시지 기반의 윈도우즈에서는 운영체에와 응용 프로그램, 또는 응용 프로그램 사이나 응용 프로그램 내부의 컨트롤끼리도 많은 메시지들을 주고 받는다


훅(Hook)이란 메시지가 목표 윈도우로 전달되기 전에 메시지를 가로채는 특수한 프로시저이다


오고 가는 메시지를 감시하기 위한 일종의 덫(Trap)인 셈인데 일단 응용 프로그램이 훅 프로시저를 설치하면 메시지가 윈도우로 보내지기 전에 훅 프로시저를 먼저 거친다


서브 클래스 프로시저와 마찬가지로 훅 프로시저에서는 메시지를 단순히 살펴보기만 할 수도 있고 메시지를 변경하거나 아예 없애버릴 수도 있다


훅 프로시저가 어떤 메시지를 받을 것인가는 훅의 타입과 범위에 따라 달라진다


훅 타입은 WH_ 로 시작되는 매크로 상수로 지정하는데 WH_HOUSE, WH_KEYBOARD 등 여러 가지가 있다


이름으로 유추할 수 있듯이 WH_HOUSE 훅은 마우스 메시지를 가로채고 WH_KEYBOARD 훅은 키보드 메시지를 가로챈다 


또한 훅은 메시지를 가로챌 범위에 따라 지역 훅 (Thread Specific)과 시스템 전역 훅(System Wide)으로 나누어진다


지역 훅은 특정 스테르에서 발생하는 메시지들만 전달 받으며 전역 훅은 시스템의 모든 스레드에서 발생하는 메시지를 가로챌 수 있다


응용 프로그램 자신의 메시지만 받고 싶을 때는 지역 훅을 사용하며 시스템에서 발생하는 모든 메시지를 받고자 할 때는 전역 훅을 설치해야 한다


훅 프로시저는  응용 프로그램이 자신의 필요에 따라 언제든지 설치할 수 있기 때문에 하나의 훅 타입에 대해 여러 개의 훅 프로시저가 존재할 수도 있다


그래서 운영체제는 설치된 훅 프로시저들을 훅 체인(Hook Chain) 으로 관리한다

훅 체인이란 훅 프로시저 함수들의 번지를 담고 있는 일종의 함수 포인터 배열이라고 할 수 있다


응용  프로그램이 훅 프로시저를 설치하면 운영체제는 훅 체인의 선두에 등록된 프로시저에게 이 메시지를 전달하고 훅 프로시저는 체인을 따라 다음 훅 프로시저에게 메시지를 연속적으로 전달하며 종국에는 그 메시지를 받을 윈도우에게 전달한다


물론 중간에서 메시지가 변형되거나 사라질 수도 있다


훅 프로시저가 설치되어 있으면 시스템은 메시지가 발생할 때마다 훅 프로시저에게 메시지를 전달한다


훅 체인에 여러 개의 훅 프로시저가 설치되어 있다면 메시지는 훅 체인 내의 모든 훅 프로시저를 거쳐야만 비로소 목표 윈도우로 전달될 수 있다


그래서 훅은 시스템의 전반적인 속도를 눈에 띄게 만든다


짧은 순간에 수백 개의 메시지가 처리되는데 이 메시지들이 훅 프로시저를 한 바퀴 돌아오려면 당연히 시간이 걸릴 수 밖에 없다


훅을 사용하는 디버거나 스파이 등의 툴을 띄워 놓으면 시스템이 느려지는 것을 직접 경험해 본 바 있을 것이다


그래서 훅은 꼭 필요할 때만 설치해야 하며 끝난 후에는 곧바로 제거하는 것이 좋다