본문 바로가기
Application Hacking/메시지 후킹

[ Message Hooking ] Windows Message 처리 방법

by 코뮤(commu) 2020. 3. 21.
728x90
반응형

 

 

이번 포스팅은 Windows에서 발생하는 메시지를 Windows에서 처리하는 방법에 대한 포스팅입니다.

 

이벤트가 발생하면 윈도우는 메시지를 작성한 후 메시지 큐에 저장하는데,

메시지 큐란 무엇일까요?

 

 

 

 

 

 

 

Message Queue?

 

 

메시지 큐를 알아보기 전에, Queue가 무엇인지 알아보겠습니다.

 

Queue란 먼저 집어 넣은 데이터가 먼저 나오는 FIFO 구조로 저장하는 형식을 말합니다.

주로 대칭되는 개념으로 Stack이 있죠. 스택은 나중에 집어넣은 데이터가 먼저 나오는 LIFO 구조로 저장합니다.

 

 

 

메세지 큐란,  메시지를 저장하기 위해 할당된 큐입니다.

 

예를 들어 사용자가 마우스를 움직이는 경우에

마우스 움직임을 의미하는 메시지인 WM_MOUSEMOVE가 메시지 큐에 저장됩니다.

 

사용자가 키보드로 입력하는 경우는 WM_KEYDOWN가 메시지 큐에 저장되고요.

 

 

이해가 가시나요?

 

 

 

 

 

윈도우가 메시지를 메시지 큐에 저장하면,

프로그램은 메시지 큐에서 메시지를 꺼내서 자신에게 보내줄 것을 윈도우에게 요청하게됩니다.

윈도우는 이 요구를 들어주죠.

 

 

생각보다 간단하죠?

 

 

그림을 통해 이해해보겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

기본적인 메시지의 흐름은 메시지가 생성되면 OS Message Queue에 저장되고,

OS는 어떤 Application 프로그램이 이벤트를 발생시켰는지 파악해 

해당 Application의 Application Message Queue에 전해주게 됩니다.

 

Application 프로그램은 자기의 Application Message Queue를 지켜보다가

메시지 큐안에 메시지가 추가되었으면 해당하는 이벤트 handler를 호출합니다.

 

 

 

 

 

그렇다면 이러한 과정들 속에서 Hooking은 어떻게 진행되는 걸까요?

 

 

 

 

 

 

 

 

OS Message Queue에서 생성된 메세지를 Application Message에게 가기전에 Hooking하는 방식입니다.

공격자는 Hook chain을 생성하여 응용프로그램보다 먼저 메시지를 확인합니다.

메시지를 확인하는 것에서 한발 더 나아가 변경, 삭제도 가능합니다.

 

 

메시지 후킹은 OS Message Queue와 Application Message Queue 사이에서 작동하기때문에

exe (실행파일) 에서가 아닌 dll (동적 라이브러리 링크)에서 구현되어야합니다.

 


이 기능은 Windows에서 자체적으로 제공하는 기능으로, SetWindowsHookEx() 함수를 이용합니다.

 

 

 

다음 포스팅은 SetWindowsHookExA() 함수를 설치하고, 메시지 후킹 툴을 제작해보도록 하겠습니다!

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형