1. 핸들 테이블

- 커널 오브젝트와 핸들 사이에 핸들 테이블이 존재한다. 이로서 핸들을 참조하여 특정 커널 오브젝트를 가리킬 수 있다.


2. 핸들과 핸들 테이블

- 핸들 테이블은 프로세스 별로 독립적이다. 그리고 숫자가 핸들로서 의미를 지니기 위해서는 해당 숫자가 핸들 테이블에 등록되어야 한다. 등록되는 순간부터 핸들이라 할 수 있으며, 이 핸들을 통해서 커널 오브젝트에 접근하는 것이 가능하다.


3. 핸들의 상속

- 핸들은 자식프로세스를 생성하는 과정에서 상속 할 수 있다. 핸들이 자식 프로세스에서 상속된다는 말은 부모 프로세스의 핸들 테이블 정보가 자식 프로세스의 핸들 테이블에 복사된다는 뜻이다.


4. 가짜 핸들(Pseudo 핸들)

- GetCurrentProcess 함수 호출을 통해서 얻은 핸들을 가리켜 가짜 핸들이라 한다. 이는 핸들 테이블에 등록된 핸들값이 아닌, 자기 자신의 프로세스를 가리키기 위한 약속된 상수이기 때문이다. 핸들 테이블에 등록된 핸들을 얻기 위해서는 DuplicateHandle 함수를 사용해야 한다.


5. 파이프

- 이름없는 파이프(Anonymous Pipe) : 주소 정보가 없기 때문에 서로 관계있는(부모 자식 관계, 혹은 부모의 자식들 간의 관계)프로세스 끼리 사용 가능하다. 핸들 값을 통해서 단방향 통신을 한다.


- 이름있는 파이프(named Pipe) : 메일슬롯과 유사하다. 다만 브로드캐스트 방식을 지원하지 않고, 양방향 통신을 지원한다.


1. 프로세스간 통신 기법이 별도로 존재하는 이유

- 프로세스는 개별적으로 독립적인 메모리 공간을 유지한다. 따라서 둘 이상의 프로세스가 데이터를 주고 받기 위해서는 Windows 운영체제에서 제공하는 기능상의 도움을 받아야만 한다.


2. 메일슬록의 특성

- 대표적인 IPC 기법이며, 단 방향 통신과 브로드캐스팅 방식을 지원한다.


3. 커널 오브젝트의 두 가지 상태가 지니는 의미

- 커널 오브젝트는 Signaled 상태와, Non-Signaled 상태 둘 중 하나의 상태에 놓이게 된다. 그리고 이 상태는 나머지 다른 하나의 상태로 변경되는데, Signaled 상태는 프로세스가 종료 된 경우, Non-Signaled 상태는 프로세스가 아직 종료되지 않은 경우이다.


4. WaitForSingleObject, WaitForMultipleObject 함수와 커널 오브젝트의 관계

- WaitForSingleObject 함수는 커널 오브젝트를 감시하는 역할을 한다. 커널 오브젝트가 Non-Signaled 상태에 있는 때에는 함수를 반환하지 않고 블로킹 상태에 있다가 함수가 Signaled 상태가 되면 함수를 빠져 나오는 특성을 지닌다. WaitForMultipleObject 함수는 둘 이상의 커널 오브젝트를 감시할 때 사용하는 함수이다.


5. 종료코드(Exit Code)

- Main 함수의 return문에 의한 반환값은 프로세스의 종료코드로 커널 오브젝트에 저장된다. 이 종료코드를 얻기 위해서는 GetExitCodeProcess 함수를 호출하면 되고, 이 종료코드는 프로세스의 종료 이유를 담는 용도로 사용하는 것이 일반적이다.

일반적인 Windows 메시지 흐름 

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


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


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


2번의 과정에서 메시지 후킹이 일어난다.

- OS와 application 사이에 훅을 설치하고, 훅 함수내에서 메시지를 조작할 수 있다.


소스코드를 보기전에 간단한 원리는 아래와 같다.

- SetWindowsHookEx()를 이용해 훅을 설치하면, 어떤 프로세스에서 해당 메시지가 발생하였을 때, 운영체제가 DLL 파일을 해당 프로세스에 강제로 인젝션하고, Dll 파일에 등록된 hook procedure를 호출한다.



KeyHook.dll(훅 프로시저를 포함한 실제 후킹을 진행하는 dll파일 코드)



HookMain.exe(훅을 설치하는 프로그램 코드)


함수 설명은 -> https://turtleneck.tistory.com/17

+ Recent posts