일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Neural Network
- BAM
- Bidirectional Associative Memory
- 증강현실
- 고려대학교
- 갤럭시탭S8울트라
- Python
- 나르왈프레오
- 신경망
- 파이썬
- 신경회로망
- 구글 앱 엔진
- 삼성전자 소프트웨어멤버십 SSM
- hopfield network
- 패턴인식
- 동아리
- 패턴 인식
- Friendship
- 삼성소프트웨어멤버십
- 멤버십
- 인공지능
- 가상화
- 물걸레로봇청소기추천
- Google App Engine
- 빅데이터
- SSM
- 삼성
- NarwalFreo
- 물걸레자동세척로봇청소기
- 하이퍼바이저
- Today
- Total
정보공간_1
[6기 대구 허정욱] Detours 3.0 Express #1.API Hooking 본문
[6기 대구 허정욱] Detours 3.0 Express #1.API Hooking
알 수 없는 사용자 2014. 8. 7. 15:44Detours 3.0 Express 32bit version
Detours의 현재 버전은 3.0이고, Express와 Professional로 구분됩니다.
Express 버전은 비상업용, 연구용으로 공개되어 있으나 32bit 운영체제에서만 제공되고,
Professional 버전은 유료 버전이며 64bit도 지원이 됩니다.
만약 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 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란, 마이크로 소프트웨어 배포하는 윈도우의 다목적 디버거 입니다.
유저모드 어플리케이션, 드라이버 및 커널 모드에서 자체 운영체제 디버깅을 할 수 있습니다.
다음 포스트에서는, Detours를 이용한 API Hooking이 아닌 다른 Hooking 방법들에 대해 알아보겠습니다. 감사합니다.
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[6기 수원 조성찬] Arm cortex-M3 기본 개요 (0) | 2014.08.07 |
---|---|
[6기 수원 최웅엽] 궁금한 c++ 문법들 (0) | 2014.08.07 |
[6기 강북 홍진우] 64비트 멀티코어 OS#1 - 개발환경, 운영모드 (0) | 2014.08.07 |
[6기 강남 윤재석] Google I/O 2014 그곳에 내가 있었다. (1) | 2014.08.07 |
[6기 부산 정희록] Beautiful Soup #1 (0) | 2014.08.06 |