이것저것 공부하던중에 또 샛길로 빠지는 바람에 여기까지 오게되었습니다.
후킹이라는 말은 예전에 들어봤지만 사실상 간단한 개념만 알고 있었지 제대로 된 부분은 잘 몰랐습니다. 그래서 이번기회에 그나마 여러 글들을 읽고 제가 받아들인 부분을 정리차 한번 써보겠습니다.
일단 간단하게 후킹이라는 말이 무엇을 뜻하는지 알아보겠습니다.
그러니 다시 말하자면 어떤 일을 행하려 할때 원래 수행되던 일이 있지만, 그 부분을 가로채서 새로운 일을 하도록 만드는 일이 바로 "후킹(Hooking)" 이라고 할 수 있겠습니다.
이렇게 설명을 듣다보니 뇌리에 스치는 부분이 있을지 모르겠습니다. 바로 이 후킹이라는 부분을 악용한다면?? 이란생각 말입니다. 물론 그런 부분들로 문제가 야기되고 있으니 우리는 악용하면 안되겠죠?ㅎ
이 후킹에도 2가지 정도 종류로 나눌 수 있습니다.
1. 메시지 후킹(Message Hooking)
2. API 후킹(API Hooking)
처음 말한 메시지 후킹은 Windows의 구동방식을 알면 좀더 쉽게 이해할 수 있습니다.
윈도우는 메시지 구동(Message Driven)방식으로 실행되고 있습니다. 이게 무슨 말이냐 하면 우리가 하는 모든 작업은 메시지를 발생되게 되어있습니다. ex) WM_MOUSEMOVE, WM_KEYDOWN
위와 같이 마우스를 움직일 때, 키를 누를 때 처럼 하나하나의 이벤트의 중심이되어서 윈도우는 실행되게 되어있습니다. 이런 메시들이 발생 되면 메시지 큐(Message Queue)라는 공간에 차곡차곡 쌓이게 되고 앞에서 부터 처리 함수로 보내지게 되는데 그 때, 또는 메시지 큐에 들어오려는 시점에서 중간에 가로채서 특정 작업을 할 수 있겠금 바꾸게 되면 그게 바로 메시지 후킹이라는 방법이 되겠습니다. ex)Enter키를 눌렀는데 ESC효과가 나온다
그렇다면 이제 설명 드릴 API 후킹은 무엇인가 하면 API호출이 일어날 때 그 호출을 가로채는 것입니다.
API호출을 하면 그 해당하는 호출 루틴으로 가지 않고 자신의 지정한 작업을 행하게 하는것입니다.
그럼 이제 본론인 User-Mode와 Kernel-Mode의 API Hooking기법들 소개하겠습니다.
User-Mode Hooking
- IAT(Import Address Table) Hooking: IAT 에 적혀있는 API 의 주소를 자신의 함수주소로 바꾸고 자신의 함수 끝에 다시 원래 API 주소로 돌려주는 방식. 가장 일반적으로 바이러스에서 사용하는 기법.
- InlineFunction Hooking (Detour Hooking): 사용할 API 의 첫 5바이트를 자신의 함수주소로 Jmp 하는코드로 바꾸고 자신의 코드에서 다시 원래 API 의 바뀐 코드를 수정해주고 API 시작위치로 돌려주는 방식. IAT 후킹보다지능적이여서 찾아내기가 쉽지 않다. 요새 많이 등장한다.
Kernel-Mode Hooking (루트킷)
- SSDT(SystemService Descriptor Table Modification): SSDT 가 가리키는 주소를 후킹 함수의 주소로 바꾸고그 함수 호출후 다시 원래 커널 API 의 주소로 돌려주는 기법. 50% 이상의 루트킷이 사용하는 기법. 이런 기법은 프로세스,파일의 은폐에 많이 사용됨.
- DKOM(Direct Kernel Object Modification): 커널Object 를 직접 조작해서 실행되는 프로세스, 스레드, 서비스, 포트, 드라이버 및 핸들의 Entry 를실행리스트(PsActiveProcessHead, PsActiveModuleHead....)에서 감추는 기법.
- SYSENTER:유저모드에서 시스템 호출로 넘어갈때 INT 2E(for Windows 2000)/ SYSENTER 를 사용하게 되는데 호출후시스템 서비스의 핸들러는 IA32_SYSENTER_EIP 라는 레지스터리에 저장된다. 커널 드라이버를 설치하여 해당 값을수정하여 루트킷을 호출하고 다시 원래 값으로 돌려주는 기법.
- Filter Device Drivers: 시큐리티 제품의 하단에 filter device driver 로 등록하는 기법이다. 부트 타임에 로드됨으로써 다른 어떤 안티바이러스 제품보다 먼저 실행된다.
- RuntimeDetour Patching: 커널 메모리를 직접 조작함으로써 그 메모리의 포인터가 루트킷을 가르키게 함으로써 커널 함수들을후킹하는 기법. 예를 들면 Exception 을 일으키고 Exception Handle 을 컨트롤하는 IDT 레지스터를 자신을가리키는 주소로 써줌으로써 후킹목적을 달성한다.
- IRP table Modification: 디바이스드라이버가 네트웍 패킷을 처리하거나 파일을 쓸때 사용하는 I/O Request Packets을 제어하는 DispatchRoutine 은 DEVICE_OBJECT 구조체에 저장된다. 바이러스에서 사용하는 루트킷은IoGetDeviceObjectPointer 란 API를 사용하여 DEVICE_OBJECT 구조체에서 DRIVER_OBJECT의 위치를 선정해줄수 있다. 즉 다른 Original Driver Call 이 일어나기 전에 자신의 루트킷을 먼저 실행하여Call 결과를 조작한다.