Tag Archive for 'Inside Windows'

System Service Dispatching

Windows SubSystem( kernel32.dll , ntdll.dll)의 API을 호출하게 되면 결과적으로는 Windows의 System Service Routine 를 호출하게되는경우가 많습니다. 이러한 과정에서 User Level의 Function Call을 Kernel Level로 전환하는 과정이 필요하게 됩니다. 이러한 과정을 위해서 Windows 및 x86, x64 Family에서는 System Service Dispatcher를 제공합니다.

System Service Dispatching

  • Pentium II 이전의 x86
     Pentium II 이전의 x86 시스템에서는 int 0×2e을 통해서 해당 Service를 Trap하는 방법을 사용합니다.  Trap은 실행 Thread를 kernel Mode로 전환하고 EAX와 EBX를 통해서 Service Table의 Index와 Parameter를 전달하는 방식으로 System Service Dispatching을 수행합니다.
  • Pentium II 이후의 x86
     
    Pentium II 이후의 x86 에서는 sysenter와 sysexit 를 통해서 System Service Dispatching을 수행 되도록 합니다. EAX에는 Service Table의 Index를 EDX에는 Parameter의 Pointer 넣어 줌으로 System Service Routine를 수행합니다. 이러한 작업이 가능하도록 Windows는 부팅시에 해당명령과 연결된 Register에 SSDT의 포인터를 저장하는 작업을 하고 있습니다.  sysenter instruction이 실행되는 시점에서 System은 MSRs( Model-Specific Registers )로 부터 Kernel 진입후 사용하게될 CS, EIP 정보를 Setting 하고 Kernel 진입시 사용하게 될 SS ESP 값을 가져와 Kernel Level로 진입하게 됩니다.
  • K6 이후 AMD  Process
     AMD의 Process는 Pentinum II 이후 모델과 거의 비슷한 방법으로 System Service Dispatching을 이루어 냅니다. sysenter 와 비슷한 syscall instruction을 사용하며 EDX 대신 스택을 이용한 Parameter 전달을 합니다.
  • x64 
     x64의 경우 AMD와 같은 방식으로 System Service Dispatching이 이루어 지며 x64의 Calling convention과 같은 방식으로 Parameter를 전달하도록합니다.

KiSystemService

 KiSystemService Routine은 System Service Dispatching이 이루어진 후 실제로 Service Routine를 호출해주는 부분입니다. KiSystemService는 User Level로 부터 전달된 Parameter를 Kernel Level 스택으로 옮기고 각각 Index에 해당하는 Service Routine를 호출해 주는 역할을 합니다. 이러한 과정은 Interrupt를 Disable후 이루어지게 되고 이러한 이유에서 안전하게  System Service Routine이  호출될 수 있도록 합니다.

x64 Architecture에 대한 이야기

x64 Architecture는 x86후속 Architecture 라는 사실은 누구나 하실겁니다. 롱 모드와 레거시 모드를 지원함으로서 하위 호환성도 지니고 있지요. (참고 : 64bit 롱 모드에 대한 이야기  ) 롱 모드를 지원하면서 새로운 많은 변화가 있었는데 가장 유심히 봐야할 부분은 아마도 Instruction과 Register 부분일 것입니다.
Continue reading ‘x64 Architecture에 대한 이야기’

Hooking에 관한 이야기

 최근에 유행했던 Virut 같은 File바이러스를 보면 실제로 Function의 Prolog를 변조하여  자신의 코드를 실행하는 것을 확인할 수 있습니다. 이러한 방법을 악용하는 것은 나쁘지만 이를 이용한 Hook Library를 만들면 꽤나 유용하게 사용할 수 있지요.
Continue reading ‘Hooking에 관한 이야기’

64bit 롱 모드에 대한 이야기

AMD 64 프로세서를 크게 2가지로 나누면 레거시 모드와 롱 모드로 나눌 수 있습니다. 레거시 모드는 기존 32bit과 동일하며 64bit을 사용하기 위해서는 롱 모드로 전환을 해야합니다. 롱 모드라는 녀석은 기존 레거시 모드에 비해 처리 bit수 말고도 많은 변화가 있었습니다.
Continue reading ‘64bit 롱 모드에 대한 이야기’