나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2024-07-21 23:40:06

후킹


1. 개요2. 방식

1. 개요

Hooking

API의 호출 흐름을 중간에 가로채는 것을 말한다.

Kernel32.dll의 TerminateProcess API를 예시로 들면 정상적인 호출 흐름일 경우 Kernel32.dll의 TerminateProcess -> ntdll.dll의 NtTerminateProcess를 거쳐 시스템 콜을 실행하지만 TerminateProcess API를 후킹할 경우에는 Kernel32.dll의 TerminateProcess -> 후킹 함수 순서로 바뀌게 된다. 이후 후킹 함수에서 일정 처리 후 원래의 API를 호출한다.

주로 다른 프로세스의 API 호출을 가로채는 것이 목적이므로 후킹 DLL 파일을 대상 프로세스에 로드시키는 프로세스 인젝션도 함께 사용한다.

2. 방식

후킹 방식으로는 IAT, EAT, Code 이렇게 세가지 방식이 존재한다. 어떤 방식을 이용해서 후킹하느냐에 따라 난이도가 달라진다.

만약 후킹 함수에서 원래 함수를 호출하려면 후킹 전 원래 함수의 주소를 구해야 한다. 단 Code Patch의 경우 패치 전 코드를 미리 저장해놓았다가 원래 함수를 호출해야할 상황이 되면 이를 이용하여 일시적으로 수정한 코드를 원래 코드로 되돌리고(언후킹) 원래 함수를 호출한 다음 다시 후킹하는 방식을 사용해야 한다.
[1] 예를 들어 32비트에서 후킹하는 방식을 64비트에서 그대로 사용하면 API 호출 시 오류가 발생하여 프로그램이 그대로 꺼진다.