본문 바로가기

High Level Technique/Reversing

API Hooking

API Hooking



실행 흐름을 변경하고, 원래 동작하는 기능을 다른 기능으로 바꿔 동작하도록 만드는 방법입니다.


API라는 것은 Windows를 사용함에 있어서, 애플리케이션이 시스템 자원에 직접 접근할 수 있는 방법이 없습니다. 그래서 MS에서 제공하는 Win32 API를 이용합니다.

쉽게 말하자면 API 또한 함수라고 생각하면 되는데, 이미 만들어져 있는 함수라고 생각하면 됩니다.



모든 프로세스에는 기본적으로 kernel32.dll 이 로딩되고, kernel32.dll은 ntdll.dll를 로딩합니다. 예외적으로 smss.exe는 kernel32.dll을 로딩하지 않습니다.




API Hooking의 과정을 살펴보면 아래와 같습니다.




정상적인 호출일 경우 Process에서 CreateFile()을 호출한다면 kernel32.dll에서 CreateFile()을 실행하게 됩니다.

하지만 후킹이 된 경우 CreateFile()을 호출하면 Hook.dll에서 가로채서 Hooking()을 실행하게 되고, kernel32.dll에서 CreateFile()을 호출하게 됩니다.


후킹 목적에 따라서 호출 전, 후에 사용자 코드를 실행시키거나 원래의 함수를 호출하지 않는 등 여러가지 방법으로 사용할 수 있습니다.










TechMaphttp://www.reversecore.com/55



API Hooking을 하는데, 위 TechMap을 보고 상황에 맞게 기법을 골라 적용하면 된다고 합니다. 







Method 방법



static 방식의 API Hooking은 특수한 경우에 사용된다고 합니다.








Location 위치


일반적으로 API Hooking을 하는데 세가지 방법이 있습니다.


IAT (Import Address Table)


Import Address Table에 있는 API Hooking 주소를 후킹 함수 주소로 변경하는 방법입니다. 단순하고, 구현 방법이 쉽습니다. 하지만 IAT에 없는데 프로그램에서 사용되는 API들에 대해서는 후킹을 할 수 없습니다. DLL을 동적으로 로딩해서 사용하는 경우를 말합니다.



Code


프로세스 메모리에 Mapping된 System Library(DLL)에서 API의 실제 주소를 찾아가 코드를 직접 수정해버리는 방법.

가장 널리 사용되는 방법이고 여러가지 방법이 있다.


- 시작 코드를 JMP 명령어로 패치하는 방법

- 함수 일부를 덮어쓰는 방법

- 필요한 부분만 일부 변경하는 방법



EAT (Export Address Table)


Export Address Table에 있는 API의 시작주소를 후킹 함수 주소로 변경하는 방법. Code 방법이 더 간단하고 강력해서 EAT 수정은 잘 사용되지 않는다.










Technique 기법


프로세스 메모리에 들어가 Hooking 함수를 설치하는 기법. Debug와 Injection 기법으로 나뉘며, Injection기법은 Code와 DLL 기법으로 나뉜다.


Debug


대상 프로세스를 디버깅하면서 API Hooking을 하는 방법. 디버깅 되는 프로세스에 모든 권한을 가지고 있기 때문에 메모리에 후킹 함수를 자유롭게 설치할 수 있다.

일반적인 OllyDBG, WinDBG, IDA와 같은 프로그램이 아니라 사용자가 직접 제작한 프로그램.



Injection


프로세스 메모리 영역에 침투하는 기술. 인젝션 대상에 따라 DLL과 Code로 나눌 수 있다. 이 중에 DLL Injection이 가장 많이 사용된다.


DLL Injection 


대상 프로세스에 강제로 사용자가 원하는 DLL 파일을 로딩하게 만드는 기술.


Code Injection


DLL Injection보다 복접한 기술. 주로 악성코드에 많이 사용된다. 탐지가 어렵기 때문.

구현 방법은 까다로운 편인데, DLL Injection 처럼 완전한 형태의 PE Image가 아니라 실행 코드와 데이터만 인젝션된 상태에서 자신이 필요한 API 주소를 직접 구해서 사용해야 하고, 코드 내의 메모리 주소에 접근할 때 잘못된 주소를 액세스하지 않도록 주의 해야 한다.







API

TechMap에 나온 API 외에도 OpenProcess(), WriteProcessMemory(), ReadProcessMemory() 함수들은 다른 프로세스 메모리에 접근하려고 할 때 항상 사용되는 API들 입니다.



'High Level Technique > Reversing' 카테고리의 다른 글

API Hooking - IAT Hooking  (3) 2016.07.25
API Hooking - Debug Technique  (0) 2016.07.19
Code Injection  (0) 2016.07.15
DLL Load Using PE Patch  (0) 2016.07.14
DLL Ejection  (0) 2016.07.08