Reverse Engineering

[리버싱 핵심원리 study] 29장 API 후킹 : 리버싱의 '꽃'

maple19out 2021. 1. 18. 11:51

1. API 후킹

Win32 API를 후킹 하는 기술을 API 후킹이라고 한다. API(Application Programming Interface)란 사용자 애플리케이션이 시스템 커널에 대한 접근을 요청할 때 사용되는 것으로, Windows에서는 MS에서 Win32 API라는 것을 제공하고 있다. API 후킹을 통해서 Win32 API 호출을 중간에서 가로채 제어권을 얻어낼 수 있는데, 도식화하면 아래와 같은 구조를 갖는다.

 

일반적인 API 호출

 

후킹된 API 호출

위와 같이 CreateFile() API를 후킹 한 경우 호출될 때마다 중간에 있는 hook.dll의 MyCreateFile()이 호출된다.

 

2. 태크 맵

책에서는 아래와 같이 API 후킹에 대한 기술적 범주를 테크 맵으로 나타내고 있다. (32bit 기준)

Method Object Location(where) Technique(how) API
static File (1) IAT

(2) Code

(3) EAT
X X
dynamic Process
Memory

00000000
~
7FFFFFFFF
A) Debug
(Interactive)
DebugActiveProcess
GetThreadContext
SetThreadContext
B) Injection B-1)
Independent
Code
CreateRemoteThread
B-2)
DLL file

Registry(AppInit_DLLs)
BHO (IE only)
SetWindowsHookEx
CreateRemoteThread

각 내용을 간단하게 설명하면 다음과 같다.

 

1) Method Object(what)

후킹에 관한  대분류로, static(작업 대상이 파일)인지 dynamic(작업 대상이 프로세스)인지를 나눈다. static 방식은 dynamic에 비해 잘 쓰이지는 않는다고 한다.

 

2) Location(where)

API 후킹을 위해 공략해야 하는 부분에 대한 분류로, IAT, Code, EAT로 나뉜다. 

IAT : 가장 단순하며, 구현 방법이 간단하지만 IAT에 없는 API들에 대해서는 후킹 할 수 없다.

Code : 프로세스에 매핑된 dll에서 API의 실제 주소를 찾아가 코드를 수정하는 방법(가장 많이 쓰임)

EAT : DLL의 EAT에 기록된 API 시작 주소를 후킹함수 주소로 변경하는 방법 (Code에 비해 잘 사용되지 않음)

 

3) Technique(how)

후킹 함수를 설치하는 구체적인 기법으로 디버그 방법과 인젝션 방법으로 나뉜다.

디버그 : 대상 프로세스를 디버깅하며 후킹하는 방법으로, 제작한 프로그램에서 Debug API를 이용하여 대상 프로세스에 후킹 함수를 설치한다.

인젝션 : 대상 프로세스의 메모리에 침투하는 기술로 DLL 인젝션과 Code injection으로 나뉜다. (이전 실습 내용)

반응형