미친해커

[Reversing] 리버싱의 꽃 후킹이란? 본문

Reversing/Hooking

[Reversing] 리버싱의 꽃 후킹이란?

미친해커 2022. 1. 18. 02:00
반응형

이제부터 본격적으로 프로그래밍뿐만 아니라 해킹과 관련된 글도 포스팅하려고 한다. 모든 내용은 필자가 공부한 내용을 바탕으로 서술되며 내가 해킹을 배우고 싶어하는 친구들에게 가장 알려주고 싶은 기술을 API Hooking이다. 나는 후킹을 책으로 배우지 않고 실제 실습 또는 해외 포럼과 악성코드 분석 등을 통해 배웠기 때문에 정통 후킹 방식과는 차이가 있을 수 있음을 미리 알린다.

What is the hooking?

특정 함수가 호출되었을 때 함수의 제어권을 가로채는 행위를 뜻한다.

 

즉 특정 함수가 호출되었을 때 함수 호출, 메시지, 이벤트 또는 반환 값, 인자 등을 조작할 수 있다. 그리고 이를 가능캐 해주는 기술이 후킹이다. 우리는 이것을 API Hooking 이라고 부른다.

Types of hooking

API Hooking은 User Mode와 Kernel Mode 두가지로 나뉜다.

User Mode Hooking

IAT(Import Address Table) Hooking : IAT에 적혀있는 API의 주소를 조작하여 후킹하는 기법

Trampoline Code Hooking : 후킹할 API의 상위 5바이트를 jmp 어셈블리로 패치하여 후킹하는 기법

Kernel Mode Hooking


SSDT(System Service Descriptor Table) Hooking : SSDT가 가리키는 주소를 조작하여 후킹하는 기법

DKOM(Direct Kernel Object Modification) : Kernel Object를 조작하여 프로세스, 스레드, 서비스 등 핸들의 Entry를 숨기는 기법

외 추후 서술

위에 서술된 기법들을 하나하나 실습해보고 원리와 방법 그리고 코드를 포스팅할 예정이다. 여기서 아직 후킹이 무엇인지 감을 잡지 못한 사람이 있을 것이다. 다음 그림은 정상적인 API 호출과정이다.

프로세스가 kernel32.dll에 있는 API 함수를 호출한다. kernel32.dll 은 해당 함수를 실행하고 반환 값을 프로세스에게 돌려준다. 다음은 특정 함수가 후킹되었을 때의 API 호출과정이다.

프로세스가 kernel32.dll에 후킹된 API 함수를 호출하게 되면 그 함수에 대한 제어권을 Hook 함수(코드)가 가로챈다. 그렇다면 프로세스가 kernel32.dll에 후킹된 API 함수를 호출할 때 마다 Hook 함수(코드)를 먼저 호출하게 된다. 이때 Hook 함수(코드)에서 인자 값, 반환 값 등을 조작할 수 있다. 이것이 API Hooking의 기본 개념이다. 

반응형
Comments