태그 보관물: Rootkit

하이브리드 후킹

루트킷에 보면 하이브리드 후킹에 대한 설명이 나와있습니다.
간단히 말해서 DLL Injection 없이 커널모드 에서 유저모드의 IAT(Import Address Table)을 바로 후킹하는 것입니다.

이 후킹 방식의 주요 포인트는 PsSetLoadImageNotifyRoutine() 함수를 이용하여 바이너리 이미지가 메모리로 로드되는 시점을 알 수 있다는 것과 KUSER_SHARED_DATA 영역이라 불리는 커널모드와 유저모드에서 동일한 물리 메모리 주소를 가리키는 영역을 이용한다는 것입니다.

NOTE :  PsSetLoadImageNotifyRoutine 으로 등록한 콜백함수가 호출되는 시점이 이미지들이 로딩되는 프로세스와 같은 Process Context 인 점이 중요 합니다.

NOTE : 커널모드에서의 KUSER_SHARED_DATA : 0xFFDF0000 + 4K
           유저모드에서의 KUSER_SHARED_DATA : 0x7FFE0000 + 4K


하지만 책에 있는 샘플을 그대로 동작시켰을때 정상적으로 후킹되지 않음을 알 수 있습니다.
이는 PsSetLoadImageNotifyRoutine 콜백 함수로 특정 DLL 이 로드 되었다고 알려진 시점에 바로 후킹에 들어갔기 때문입니다. 즉, DLL 이 로드 되었다고 해도 해당 DLL의 익스포트 함수를 어플리케이션의 IAT(PE Format 에서 OriginalFirstThunk 가 아닌 FirstThunk)에 적용하기 전 시점일수(거의 대부분) 있기 때문입니다.

요지는 루트킷 책의 샘플을 이용하여 하이브리드 후킹을 했을때 후킹이 안된 경우는 위 문제 때문일 것이라는… ^^; (이미 아시는 내용이시라면 Pass ~~ )

디버깅한 내용들을 스크린 샷으로 찍어서 설명 드렸으면 더 좋았을 텐데.. 귀차니즘으로 ^^;
아래는 하이브리드 후킹에 대해서 그림으로 간단히 요약해 본 것입니다.
(그림에 대한 설명은 루트킷 책을 참고하세요)

그림을 클릭하시면 크게 보실 수 있습니다

KUSER_SHARED_DATA

그림을 클릭하시면 크게 보실 수 있습니다

하이브리드 후킹

역시 말로 설명하는 것보다 글이나 그림은 어렵군요. ^^;

※ 지나가는 소리 : 루트킷 책 원서와 번역본 모두 PsSetImageLoadNotifyRoutine 함수라고 나와있네요. 오타이며, 정확한 함수명은 PsSetLoadImageNotifyRoutine 입니다. ^^;