X2r0Ar
API Hooking 본문
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 |