[리버싱 핵심원리 study] 29장 API 후킹 : 리버싱의 '꽃'
1. API 후킹
Win32 API를 후킹 하는 기술을 API 후킹이라고 한다. API(Application Programming Interface)란 사용자 애플리케이션이 시스템 커널에 대한 접근을 요청할 때 사용되는 것으로, Windows에서는 MS에서 Win32 API라는 것을 제공하고 있다. API 후킹을 통해서 Win32 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으로 나뉜다. (이전 실습 내용)