본문 바로가기
WebBook/윈도우 구조

시스템 프로세스(Windows Startup Process) - 서브시스템(Subsystem)

by 올엠 2022. 2. 21.
반응형

시스템 프로세스(시스템 지원 프로세스라고도 함)는 윈도우 시작 프로세스임과 동시에 사용자가 시스템을 사용하는 데 필요한 핵심 부분을 담당하는 프로세스들을 뜻한다. 이는 커널과 연결되는 서브시스템(Subsystem)을 구동하거나, 관리하는 역할을 한다.
한마디로 운영체제를 사용하는 사용자를 위해 유저 모드에서 동작하는 중요한 프로세스라 할 수 있다. 따라서 이는 윈도우 구조를 이해하기 위해 반드시 알아두어야 할 프로세스들이라 할 수 있다. 이 프로세스들은 Process explorer에서 아래와 같이 확인할 수 있다.

 

Process explorer 에서 확인한 시스템 프로세스

위 그림에 표시한 프로세스들이 우리가 4장에서 배울 주요 시스템 프로세스인 Smss.exe, Csrss.exe, Winlogon.exe, Lsass.exe, Services.exe 이며 이외 몇가지 프로세스에 대해서도 이번 기회를 통해 살펴보도록 하자. 그럼 시작하기 전에 먼저 윈도우에서 사용하는 서브시스템이 무엇인지부터 알아보자.

서브시스템(Subsystem)

응용프로그램은 운영체제의 보안과 호환성을 위해 직접 커널의 시스템 자원을 호출하지 않고, 서브시스템을 통해 호출하게 된다. 그리고 서브시스템은 역할별로 크게 환경 서브시스템, 서브시스템 DLL로 나눌수 있다.
먼저 환경 서브시스템(Environment subsystem)부터 알아보자. 환경 서브시스템은 응용프로그램 구동 환경을 제공하고 관리하는 서브시스템이라 할 수 있다. 여기에는 윈도우 환경을 지원하는 윈도우 서브시스템(Window subsystem)인 Csrss.exe와, (Csrss.exe에 대해서는 잠시 후에 다룬다).
UNIX용 프로그램의 실행 환경을 지원하는 POSIX 서브시스템(Portable operating system interface base on UNIX)가 있다. POSIX 서브시스템은 Psxss.exe을 통한 UNIX용도로 개발된 응용프로그램을 윈도우에서 구동할 수 있도록 호환성을 지원하는 서브시스템이다.

개발용도에 따라 이용하는 서브시스템이 달라진다

그리고 실제 응용프로그램의 커널의 시스템 자원 호출을 도와주는 Kernel32.dll, Advapi32.dll, User32.dll, Gdi32.dll이 있는데, 이를 서브시스템 DLL(시스템 DLL라고도 함)이라고 부른다. 이 구조는 https://allmnet.tistory.com/entry/WebBook-%EC%9C%88%EB%8F%84%EC%9A%B0-%EA%B5%AC%EC%A1%B0-MBR%EC%97%90%EC%84%9C-%EB%A1%9C%EA%B7%B8%EC%98%A8%EA%B9%8C%EC%A7%80윈도우 아키텍처 그림을 다시 보면 이해에 도움이 될 것이다.

환경 서브시스템은 응용프로그램 환경과 관리부분만 담당하고, 실제적인 응용프로그램의 요청은 서브시스템 DLL에서 사용할 수 있는 인터페이스(API)를 노출하여 해당 서브시스템을 통해 커널의 시스템 자원을 호출 구조이다.

조금 더 자세히 살펴보면 윈도우 응용프로그램인 실행 파일은 PE Header 구조의 Option Header 정보를 가지고 있는데 이를 통해 이용하는 서브시스템 유형을 구분 한다(PE 파일에 대해서는 추후 다루겠다).

실행 파일의 서브시스템 정보를 확인할 수 있는 Dependency Walker에서는 아래와 같이 Explorer.exe Cmd.exe가 서로 다른 서브시스템으로 지정되어 있는 것을 확인할 수 있다(앞서 말한 서브시스템 종류로 구분하지 않고 실행 유형으로 구분하게 된다).

Dependency Walker 로 확인한 어플리케이션 정보

위와 같이 PE파일의 구분에 의해 아래 그림와 같이 동작하는 실행자가 바뀌게 되며, 실행자는 자신에게 맞는 서브시스템을 골라서 실행하게 된다.

서브시스템 유형에 따라 변경되는 실행 환경

위 그림을 보면 사용자가 파일을 실행하면 운영체제는 프로세스를 실행하기 위해 CreateProcess 함수를 호출하여 파일 이미지를 로드를 진행하게 되는데 이때 파일 구조(PE Header)를 확인하여 어떤 형식의 파일인지 확인하는 절차를 진행하게 된다.
위 그림을 보면 여러 실행자 중 적절한 실행자를 선택하도록 되어 있으며, 서브시스템 코드에 선택하여 메모리에 실행 프로세스 개체(스레드를 담아 작업을 수행 할 수 있는 개체들의 집합)를 만들게 된다. .bat, .cmd 와 같은 실행 파일은 확장자만으로 구분하여 실행되지만, 동일한 .exe, .com 확장자를 가지는 실행 파일의 경우 PE Header 구조의 Option Header 정보를 참조하여 실행자를 선택하게 되는 것이다. 그 후 EPROCESS Block, KPROCESS Block, PEB 등을 생성하고 초기화를 진행하게 된다.

그리고 메인 스레드, 스택과 컨텍스트를 만들고 프로세스와 스레드 생성을 담당하는 Csrss에게 새로운 프로세스 생성에 대한 정보(Process, Thread, Handle)가 전달되게 되며, 이후 일련의 프로세스 실행 작업이 이루어지게 된다. 이 프로세스 생성에 대해서는 Csrss.exe와 관련이 있으므로 Csrss.exe에서 다시 한번 다루도록 하겠다. 그럼 PE Header에서 제공하는 서브시스템 코드는 어떻게 될까? 해당 코드는 Winnt.h에 정의되어 있으며 아래와 같다.

#define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
#define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesnt require a subsystem.
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem.
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem.
#define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem.
#define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image runs in the Posix character subsystem.
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // image is a native Win9x driver.
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Image runs in the Windows CE subsystem.

이 동작 유무를 확인하기 위해 간단한 실습을 진행해보자.

노트패드를 PEview를 통해 IMAGE_OPTIONAL_HEADER 하위의 Subsystem 코드의 위치를 확인한후 아래 그림과 같이 Hview를 이용해 서브시스템 코드 유형을 네이티브 어플리케이션(Native Application)으로 변경하면, 아래와 같은 오류가 발생하게 된다(예제에서는 0x0000013C로 확인되었다).

Hview 를 이용하여 서브시스템 코드 변경
서브시스템 코드가 변경된 노트패드의 실행 오류

앞으로도 서브시스템이라는 용어가 자주 나오게 될 것이다. 여기에 큰 의미를 부여하는 것보다, 응용프로그램의 실행을 지원하는 환경정도로 이해하기를 바라며. 이제부터는 시스템 프로세스에 대해 진행하도록 하겠다.

 

 

반응형