X2r0Ar

API Hooking 본문

Project./Security

API Hooking

D2v 2017. 2. 2. 14:51

API Hooking


후킹?


입력정보를 가로채거나, 본래의 기능을 인의적으로 다른 기능으로 바꿔 동작되게 만드는 방법입니다.


API?


API(Application Programming Interface)는 응용 프로그램이 직접적인 접근을 막아 놓은 시스템 자원을 이용하고 싶을 때 커널에 요청 할 수 있도록 MS에서 제공하는것을 API라고 합니다.


모든 프로세스는 기본적으로 kernel32.dll이 로딩이 되고, kernel.32dll이 ntdll.dll을 로딩합니다.(예외적으로 smss.exe는 kernel32.dll이 로딩이 되지 않습니다.)



<smss.exe에서 로딩되는 dll>


<DEPENDS.DLL에서 로딩되는 dll>


해당 자료에 대한 자세한 내용 [참조하기]


notepad.exe 에서 특정 txt파일을 열때 msvcrt!fopen() API를 호출 합니다.


-msvcrt!fopen()

 kernel32!CreateFileW()

ntdll!ZwCreateFile()

ntdll!KiFastSystemCall()

SYSENTER

-> 커널 모드 진입


API Hooking?


API Hooking의 이점


- API 호출 전/후에 사용자의 Hook Code를 실행 시킬수 있습니다.


- API에 넘어온 파라미터 혹은 API 함수의 리턴 값을 엿보거나 조작할 수 있습니다.


- API 호출을 취소시키거나 해커(후킹한 사람)의 코드로 실행 흐름을 변경시킬 수 있습니다.



<정상 API 호출 과정>


<후킹 상태의 API 호출 과정>


Tech Map?



Method(후킹 방식)?


Static


- 파일 대상

- 프로그램 실행 전 후킹

- 최초 한번만 후킹

- 특수한 상황에서 사용

- Unhook 불가 

Dynamic


- 메모리 대상

- 프로그램 실행 후 후킹

- 실행될 때마다 후킹

- 일반적인 후킹

- 프로그램 실행 중 Unhook 가능


Location(위치)?


- IAT(Import Address Table) : IAT에 있는 API 주소를 후킹 함수 주소로 변경하는 방법


* 구현 방법이 쉬움

* DLL을 동적 로딩하는 방법에선 사용이 불가능


- Code : 프로세스 메모리에 매핑된 dll에서 API의 실제 주소를 찾아가 코드를 직접 수정하는 방법(가장 많이 사용)


* 함수의 시작 5Byte 코드를 JMP 명령어로 패치하는 방법

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

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


- EAT : DLL의 EAT에 기록된 API의 시작 주소를 변경하는 방법(Code 방법이 더 간단하고 강력하여 잘 사용 안함)


Teachnique(기법)?


◆ Debug : 대상 프로세스를 디버깅 하면서 API Hooking 하는 방법, Debugee 프로세스의 모든 권하을 가지고 있기 때문에 메모리에 후킹 함수 설치가 자유롭습니다.(일반적인 OllyDbg, IDA Pro 등 사용이 아님)


◆ Injection : 해당 프로세스의 메모리 영역에 침투하는 방법, DLL 인젝션과 Code 인젝션으로 나눌수 있습니다.


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


- Code Injection : DLL Injection 보다 복잡한 기술, 탐지가 어렵습니다.


API?


Tech Map에 작성된 API 말고도 OpenProcess(), WriteProcessMemory(), ReadProcessMemory() 모두 다른 프로세스 메모리에 접근하려고 할 때 사용되는 API 입니다.


참고 자료 : 리버싱 핵심원리

한국데이터진흥원


'Project. > Security' 카테고리의 다른 글

멜론 모바일 스트리밍 취약점  (0) 2017.05.01
API Hooking - Debug  (0) 2017.02.03
Comments