정보공간_1

[6기 대구 허정욱] Detours 3.0 Express #1.API Hooking 본문

IT 놀이터/Elite Member Tech & Talk

[6기 대구 허정욱] Detours 3.0 Express #1.API Hooking

알 수 없는 사용자 2014. 8. 7. 15:44

Detours 3.0 Express 32bit version

Detours의 현재 버전은 3.0이고, Express와 Professional로 구분됩니다.

Express 버전은 비상업용, 연구용으로 공개되어 있으나 32bit 운영체제에서만 제공되고,

Professional 버전은 유료 버전이며 64bit도 지원이 됩니다.

Detours 다운로드

만약 64bit hooking 라이브러리를 쓰고싶은데, 무료 버전을 이용하실려면 easyhook 을 쓰시면 될 거 같습니다.

easyhook 라이브러리는 C++로 작성되어 있으며, dll 링크 방식을  사용합니다.

easyhook OpenSource 다운로드 및 커뮤니티

Detours는 위에서 말씀드렸다시피, 후킹 라이브러리입니다.


API(Application Programming Interface) Hooking

후킹은 "함수 호출을 가로챈 다음 변형하거나 호출을 제어하고, 특정 프로그램이나 운영체제의 기능을 변형시키는 기술"을 의미합니다.
 (함수 호출 가로채다 : "객체지향 언어에서 상속을 하면 함수를 재정의할 수 있다" 라는 의미와 같습니다.)

후킹은 크게 메시지 후킹과 API(함수) 후킹으로 구분됩니다.
API(함수)후킹은 기본적으로 바이너리 실행 코드의 일부분을 가로채는 것이므로, '코드 후킹'이라고도 말할 수 있습니다. 
메시지 후킹은 메시지가 도착하는 시점만 확인할 수 있을뿐, 메시지 자체를 무효화시키지 않습니다. 물론, 키보드 훅 등 사용해 원래 창에서의 메시지 전달을 막을 수 있습니다. 

아래와 같이, 어떠한 특정 함수를 호출하기 위한 소스코드가 존재할 때, 특정함수를 호출하기 전에 'Detour Function'을 이용하여 특정함수를 후킹하고, 개발자가 원하는 함수로 바꿔치기하거나 호출을 막을 수 있습니다.

[함수 호출 방식]

Detours를 쓰지 않으면, 원하는 실제 함수로부터 원하는 값을 바로 호출 받습니다. Detours 후킹을 쓰면, 실제함수가 호출 되기 전과 후에 모두 후킹하여 내가 원하는 시점에 실제함수를 사용하거나 사용 안 할 수 있습니다. 그러므로 더욱 강력한 함수 제어가 가능해집니다.

[API 후킹]

위와 같이, main 문에서는 함수 targetFunction을 호출하려고 합니다. 하지만, 개발자는 그 함수가 호출하기 전에 함수 hookingFunction을 호출하고 싶어합니다. 이렇게 지정함수인 hookingFunction이 호출되도록 하면 특정 함수의 기능을 추가 또는 제한을 할 수 있습니다.

[출처 : Microsoft Research Detours (http://research.microsoft.com/apps/pubs/default.aspx?id=68568) ]

위와 같이, 어셈블리코드로 보면, Trampoline Function(후킹 후 실행 될 사용자 함수)에서 jmp 코드가 발생하여, 기존에 실행되어야 하는 TargetFunction을 호출한 것처럼 보이면서 Trampoline Function이 실행되도록 합니다.


이러한 기법을 'API 후킹' 또는 '함수 후킹'이라고 부릅니다. 함수후킹은 가로채는 함수의 원본 함수로 호출 여부를 결정할 수 있습니다. 아래와 같이 정리할 수 있습니다.

- API 호출 전/후에 사용자의 함수 또는 코드를 실행시킬 수 있습니다.

- API 에 넘어온 파라미터 또는 리턴 값을 조작할 수 있습니다.

- API 호출 자체를 취소하거나 흐름을 변경할 수 있습니다.


Detours Advantage

Detours 라이브러리는, 현존하는 API 후킹 중 가장 뛰어난 라이브러리 입니다.

가장 심플한 후킹부터 시작해서, 최고레벨 고급후킹 기술을 보여주는 샘플을 함께 제공 받습니다.

VC++ 개발자에게는 델파이 매드훅라이브러리 부럽지 않은 완벽한 후킹 라이브러리입니다.

이 라이브러리의 응용방법은 무궁무진하며, 심지어 해커들의 책이나 rookit 책에서 조차 인용되고 있습니다.

Detours Hooking을 이용하는 경우는 매우 많습니다. 예를 들면, Project로 함수에서 사용하는 Buff에 대한 로그를 확인해야 되는 경우 사용할 수 있고, 또 Project의 흐름을 파악하기 위해, 반복되는 루틴에 대한 리턴 값을 확인하거나 제어해야 할 경우 사용할 수 있습니다. Code Injection을 하기에는 시간 투자가 많고 소스 코드가 많이 길어질 것입니다. 그래서 빠른 작업시간과 효율적인 개발에 대한 Output을 얻기 위해, Detours 라이브러리를 사용합니다.


Detours Hooking Environment

Detours API Hooking을 하기위한 환경설정을 하겠습니다.

1. Detours 라이브러리 빌드를 합니다. 

Detours를 홈페이지를 통해 다운을 받으면

C:\Program Files (x86)\Microsoft Research\Detours Express 3.0 경로가 생기게 됩니다.

자신이 쓰는 visual studio에서 제공하는 네이티브 도구 명령 프롬프트에서 Detours Express 3.0를 빌드 해야합니다.

저는 visual studio 2012를 사용하므로 2012 네이티브 도구 명령 프롬프트에서 빌드하였습니다.

[네이티브 도구 명령 프롬프트에서 빌드하는 화면]

위 사진과 같이, Detours Express 3.0이 있는 폴더로 이동한 후, nmake all을 입력하시면 자동으로 빌드가 됩니다.

빌드가 다 되면, 아래와 같이 폴더 안에 bin, include, lib가 생성이 됩니다. 아래에서 include, lib는 프로젝트 생성하고 환경설정 시, 필요한 파일들이 존재합니다. 그것은 2번에서 설명하겠습니다.

[nmake 빌드 후 생기는 파일]

2. 프로젝트를 생성합니다. 그리고 프로젝트 속성에 들어갑니다.

[visual studio 프로젝트 생성]

3.  속성 -> C/C++ Additional Include Directories (C/C++ -> 일반 -> 추가 포함 디렉터리)

C:\Program Files (x86)\Microsoft Research\Detours Express 3.0\include 를 등록합니다.

4. 속성 -> Linker Additional Library Directories (링커 -> 일반 -> 추가 라이브러리 디렉터리)

C:\Program Files (x86)\Microsoft Research\Detours Express 3.0\lib.X86 를 등록합니다.

5. 속성 -> Linker Additional Dependencies (링커 -> 입력 -> 추가종속성)

detours.lib 를 쓰고 확인을 누릅니다.


C:\Program Files (x86)\Microsoft Research\Detours Express 3.0\samples 에서 쉽게 Code를 보며, 수정하실 수가 있습니다.


Detours API Hooking Test

환경 설정을 다 하신 후, 간단한 함수 후킹 예제를 보면서 이해를 높이겠습니다.

[API Hooking Test]

DetoursTransactionBegion() : 후킹 또는 후킹 해제하기 위한 준비를 하는 함수입니다.

DetoursUpdateThread() : 현재 프로세스의 스레드 핸들을 얻어옵니다.

AttachDetours()  : 함수 AttachDetours 안에는 후킹할 함수의 목록을 넣을 수 있습니다.

DetoursAttach() : Detours 후킹이 실행되는 함수입니다.


아래의 사진과 같이, 타겟 함수가 호출 되어야 하는 상황에서, 후킹 함수가 호출 되는 것을 볼 수 있습니다.


[타겟 함수가 아닌 사용자 정의 함수가 호출되는 결과 화면]




Detours with Windbg

Detours Hooking 기법을 이해하는 가장 좋은 방법은 어셈블리어를 보고 이해하는 것입니다.

Windbg 다운로드 

WinDbg란, 마이크로 소프트웨어 배포하는 윈도우의 다목적 디버거 입니다.

유저모드 어플리케이션, 드라이버 및 커널 모드에서 자체 운영체제 디버깅을 할 수 있습니다.


다음 포스트에서는, Detours를 이용한 API Hooking이 아닌 다른 Hooking 방법들에 대해 알아보겠습니다. 감사합니다.