Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  시스템 서비스 디스패칭 
작성일시 : 2007. 11. 26. 15:50 | 분류 : Windows Server/Kernel

일단 여기서 말하는 서비스는 절대! Windows 상에서 실행되는 SQL이나 Server 서비스 같은 Services.msc에서 확인 가능한 서비스는 아니다.

과거의 CPU 같은 경우 IDT의 0x2e(46)을 이용하여 실행 결과가   Trap  됐다.  Trap은 실행 스레드를 커널 모드로 전환 하고 아래 그림과 같이 시스템 서비스 디스패처로 들어가는데, 이때 EAX (CPU 레지스터 주로 숫자 연산을 위한 데이터 입력) 는 시스템 서비스를 EBX (종종 주소 값 또는 파라메터로 쓰임)는 파라메터 목록을 가르킨다.

현재의 Pentium 2 이후의  CPU는 빠른 시스템 서비스 디스패치를 위해 'sysenter' 명령어를 이용한다. 이를 지원하기 위해 Windows는 부팅시 명령과 연결된 레지스터에 커널의 시스템 서비스 디스패처 루틴을 저장한다. 즉 IDT를 조회하는 방식이 아닌 해당 명령어가 실행되게 되면 바로 시스템 서비스 디스패처 루틴이 저장된 레지스터의 값이 EAX 레지스터에 전달되고  EDX는 호출자의 메게 변수를 가르킨다. 사용자 서비스로 돌아가기 위해 'sysexit'를 사용한다. (x64는 'syscall' 명령어 사용 스택은 호출자의 매개 변수 저장에 이용하고, 'sysret'를 이용해 사용자 모드로 전환)

사용자 모드에서 NtReadFile 에 대한 시스템 서비스 코드
ntdll!NtReadFile:

77f5bfa8 b8b7000000 mov eax,0xb7
77f5bfad ba0003fe7f mov edx,0x7ffe0300
77f5bfb2 ffd2 call edx
77f5bfb4 c22400 ret 0x24

SharedUserData!SystemCallStub:

7ffe0300 8bd4 mov edx,esp
7ffe0302 0f34 sysenter
7ffe0304 c3 ret
>>  해당 레지스터에 대한 설명 필요 : ESP

64비트 이상 시스템의 시스템 서비스 호출
ntdll!NtReadFile:

00000000'77f9fc60 4c8bd1 mov r10,rcx
00000000'77f9fc63 b8bf000000 mov eax,0xbf
00000000'77f9fc68 0f05 syscall
00000000'77f9fc6a c3 ret

|