티스토리 뷰

Window Internal

Window Kernel Hooking

Oth 2017. 7. 19. 11:29


system Call

응용프로그램이 Kernel32.dll 의 API를 호출하면 해당 API는 Ntdll.dll 함수를 호출한다. 그리고 ntdll 은  서비스 시작을 위해 eax에 원하는 서비스 번호 edx에 서비스에 사용할 인자 값이 담긴 포인터를 넘겨준다. XP부터 SYSENTER를 사용해서 호출한다.


SYSTENTER는 SYSENTER_EIP(MSR) 을 참조해 KiFastCallEntry로 진행한 다음 KiSystemService로 간다. 그리고 SYSEXIT 명령어를 통해 사용자 모드로 복귀한다.



SYSENTER HOOKING

XP 이상부터는 KiFastSystem Call에서 SYSENTER 명령을 실행해서 커널 영역으로 들어오는데 이 때 커널 영역으로 들어가는 만큼 esp, cs, ss 값이 바뀌게된다.  바로 커널로 들어오는 것이 아니고 실행될 커널 주소(KiFastCallEntry)를 SYSENTER_EIP(MSR 0x176) 에서 참조하여 KiFastCallEntry로 넘어가게 된다.


1. KiFastSystem Call 에서 SYSENTER 명령을 통해 커널 영역으로 들어온다.( esp, cs, ss 등 변경)

2. 들어가는 위치는 SYSENTER_EIP(MSR 0x176 레지스터) 를 참조해서 해당 레지스터에 저장되어 있는 nt!KiFastCallEntry로 들어간다.

3. 그리고 커널에 들어온 후 KiFastCallEntry에서는 eax의 인덱스 값을 가지고 SSDT 에서 NT 함수르 가져와서 호출한다.



SSDT(System Server Dispatch Table)


시스템 콜 번호 순서 대로 해당 함수의 메모리 주소를 가지고 있다.



이 때 후킹은 이 MSR 0x176 레지스터를 바꿈으로서 이루어진다.


추후 추가...

'Window Internal' 카테고리의 다른 글

APC(Asynchronous Procedure Call)  (0) 2017.07.24
KPCR 와 KPRCB  (0) 2017.07.24
IDT  (0) 2017.07.18
RtlSizeTAdd  (0) 2017.06.29
Non-Paged Pool  (0) 2017.06.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함