본문 바로가기

CAT-Security/미분류

[윈도우 후킹] Message hooking - 1





0x00 후킹의 개념


후킹은 소프트웨어 공학 용어로, 운영 체제나 응용 소프트웨어 등의 각종 컴퓨터 프로그램에서 소프트웨어 구성 요소 간에 

발생 하는 함수 호출, 메세지, 이벤트 등을 중간에 바꾸거나 가로채는 명령, 방법, 기술이나 행위를 말한다. 

이때 이러한 간섭된 함수 호출, 이벤트 또는 메세지 처리하는 코크를 후크라고 한다.

크래킹을 할떄 크래킹 대상 컴퓨터의 메모리 정보, 키보드 입력 정보등을 뺴돌리기 위해서 사용 되기도 한다. 

예를 들어 특정한 API를 하쿵 히가 되면 해당 API의 리턴값을 조작하는 등의 동작을 수행 할 수 있다.(위키백과 펌)


다른 프로세스의 실행 경로를 가로 채는 것을 말 합니다.

대표적인 예로 키로거,매크로, 원격 등이 있습니다. 종류는 구성 요소간에 발생 되는 모든것을 할 수 있습니다.

메세지 후킹, API후킹, 네이티브 API 후킹, 인터럽트 후킹 등이 있으며 여기서 다뤄 볼 것은 메세지 후킹 입니다.



0x01 메세지 훅


Windows 운영체제는 GUI 를 제공하고, 이것은 Event Driven 방식으로 동작 합니다.

키보드/마우스를 이용하여 메뉴 선택, 버튼 선택, 마우스 이동창, 창 크기 변경, 창 위치 이동등의 작업은 모두 이벤트 입니다.

이러한 이벤트가 발생할 떄 OS는 미리 정의된 메세지를 해당 응용 프로그램으로 통보 하며 

여기서 중요 한것은 사용자의 입력은 언제나 한가지 윈도우에게만 반응 한다는 것 입니다.

사용자의 키보드 입력과 마우스 입력이 동시에 두개의 윈도우로 전달되는 일은 없고 응용 프로그램은 해당 메세지를 분석하여 필요한 작업을 진행 합니다


메세지 훅이란 바로 이러한 메세지를 중간에서 엿보는 것 입니다.




다음은 일반적인 경우의 Windows 메세지 흐름에 대한 설명 입니다.


1. 키보드 입력 이벤트가 발생하면 WM_KEYDOWN 메세지가 [OS message queue]에 추가

2. OS는 어느 응용 프로그램에서 이벤트가 발생 했는지 파악 후 [OS message queue]에서 메세지를 꺼내 해당 응용 프로그램의 [application message queue]에 추가

3. 응용 프로그램은 자신의 [application message queue]를 모니터링 하고 있다가 WM_KEYDOWN 메세지가 추가 된 걸 확인하고 해당 event handler를 호출




_이벤트


이벤트라는 것은 O/S에서 처리하는 일련의 반응입니다. 

예를 들면 O/S상의 메모장에서 X 버튼을 누르면 메모장이 닫히게 되는데, X 버튼 이미지 자체에 메모장을 종료하는 기능이 있는게 아니라 

이 구역을 누름으로써 메모장을 종료하는 이벤트를 실행 하게 되는 것 입니다.

바로 이 이벤트를 후킹 하면 X 버튼을 누르면 메모장을 종료 하는 것이 아닌 다른 이벤트가 실행 되게 할 수 있습니다.




0x02 메모리 공간의 분리


WIn16 환경에서는 모든 공간은 한 메모리(같은주소 공간)에 있었습니다.

이러한 시스템에서 가장 큰 단점은 한 프로세스의 오류가 다른 프로세스에게 까지 영향을 미친 다는 것 이였으며 

사용자가 버퍼를 넘어 입력 한 값이 다른 프로세스의 공간 일 수가 있었 던 것 입니다.

이러한 문제점을 해결 하기 위해서 WIn32 환경에서는 모든 프로세스의 주소 공간을 분리 시켰습니다.





쉽게 말하면 모든 프로세스가 독립적인 4GB 메모리 공간을 가진 다는것 입니다. 

즉 실행 프로세스 개수 * 4GB 만큼의 메모리가 있는 것같은 환경을 운영체제가 제공 해 준다는 것 입니다.

이와 같은 메모리 공간의 분리는 운영체제의 경고함에 힘을 실어 줬지만 일견에서는 다른 프로세스를 후킹 하기가 더 어려운 환경이 되었고 

이러한 문제점을 해결 하기 위해 Microsoft에서는 몇가지 방법을 제안 했습니다.

자신들이 제시한 API를 사용 하면 합법적으로 다른 프로세스의 주소 공간으로 초대 해 준 다는 것 입니다.


주의 할점은 다른 프로세스를 후킹하기 위해서는 훅 프로시저는 반드시 DLL 내부에 존재 해야하며, 

그래야만 운영체제가 해당 DLL을 다른 프로세스에서 로드 시켜서 훅 프로시저를 호출 할 수 있기 때문입니다.

그리고 DLL 내부에 있는 훅 프로시저가 호출 되는 쓰레드 컨텍스트는 임의의 쓰레드 라는 점 입니다. 

즉 자신이 훅 함수를 호출 한 프로시저의 쓰레드가 아닌 이벤트가 발생한 쓰레드라는 점 입니다.