mir.pe (일반/밝은 화면)
최근 수정 시각 : 2024-11-14 13:20:16

Microsoft Windows/커널

파일:상위 문서 아이콘.svg   상위 문서: Microsoft Windows
파일:Microsoft 로고.svg 파일:Microsoft 로고 화이트.svg
{{{#!wiki style="margin:0 -10px -5px; min-height:calc(1.5em + 5px); word-break:keep-all"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin:-6px -1px -11px"
<colbgcolor=#393939,#737373><colcolor=#fff>제품군
하드​웨어 Surface · Xbox · HoloLens · PixelSense · Zune · Pluton · IVAS
소프트​웨어 Windows · Office · Edge · Media Player · Hyper-V · Defender · Visual Studio Code · Visual Studio · Windows Terminal · Microsoft Store · Xbox App · PowerToys · Internet Explorer · MS-DOS · Windows Movie Maker · Autoruns · Clipchamp
서비스 Microsoft Azure · OneDrive · Microsoft Copilot · Bing · LinkedIn · Microsoft Docs · Skype · MSN · 정품인증 · Xbox Game Pass · Xbox Cloud Gaming · Xbox network
관련 기술 ASF · ASP · Blazor · COM · DCOM · DirectX · 파일 시스템( FAT · NTFS · ReFS) · MFC · .NET( .NET Core · .NET Standard · C# · F# · Visual Basic .NET · Windows Forms · WPF · UWP · .NET MAUI · ASP.NET · ML.NET) · OLE · Q# · Silverlight · Visual Basic · VBA · WASAPI · Windows 커널 · Windows 디자인 · Windows API · Windows Runtime( UWP · WinUI 3) · WMA · WMV · Xamarin · XNA · 하복 엔진 · SAMI · PowerShell · Windows Modern Standby
산하 계열사 및 사업부 GitHub · .NET Foundation · Microsoft Gaming · LinkedIn
관련 인물 빌 게이츠(은퇴) · 폴 앨런(은퇴) · 스티브 발머(퇴사) · 게이브 뉴웰(퇴사) · 마이크 이바라(퇴사)
사티아 나델라 · 필 스펜서 · 브래드 스미스
기타 제니맥스 미디어 인수 · 액티비전 블리자드 인수 · 시작 메뉴 · 빌 게이츠의 굴욕
관련 틀 365 제품군 · 하드웨어 제품군 · Surface 제품군 · Windows 제품군 }}}}}}}}}

파일:Windows 로고 화이트.svg 버전 일람
{{{#!wiki style="margin:0 -10px -5px; min-height: 26px"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin:-6px -1px -11px"
파일:MS-DOS 아이콘.svg
DOS 커널
클라이언트 워크스테이션 서버 {{{#!wiki style="margin:0 -10px -5px; min-height: 26px"
{{{#!folding [ 임베디드/모바일 ]
{{{#!wiki style="margin:-6px -1px -11px"
SKU
임베디드 에디션
파일:Windows CE 아이콘_화이트.png CE 커널
1996 CE 1.0
1997 CE 2.x
Poket PC 2000/2002 (CE 3.0)
2002 Mobile 2003/SE (CE 4.x)
2004 Mobile 5.0/SE/6.x (CE 5.x)
2006 CE 6.0
2011 Embedded Compact 7
Embedded Compact 2013 (CE 8.0)
1999 NT 4.0 Embedded
2000 Powered
2002 XP Embedded( FLP 2006)
2005 Embedded for POS
2009 Embedded Standard/POSReady
2010/2011 Embedded Standard 7/POSReady 7( Thin PC)
2012/2013 Windows Embedded 8/Standard 8(Industry)
2013 Embedded 8.1 Industry
파일:silverlight-f9eea009c90bbdf966eb62abee29092a.png Silverlight 프레임워크
2010 Phone 7
파일:Windows 아이콘 2012_화이트.svg NT 커널
2012 Phone 8
2014 Phone 8.1
파일:Windows 아이콘 2012_화이트.svg One 코어
<rowcolor=#212529,#e0e0e0> 2015 10 IoT
2021 11 IoT
2015 10 Mobile }}}}}}}}}
1985 1.x
1987 2.x
1990 3.x
파일:Windows 95.png
9x 기반
19 95 (4.0)
1996 Nashville (4.1)
19 98( SE 1999) (4.1)
2000 Me (4.9)
파일:Windows 아이콘 1992_화이트.svg
NT 커널
1993 NT 3.1
1994 NT 3.5
1995 NT 3.51
1996 Cairo (NT 4.0)
1996 NT 4.0
파일:Windows 아이콘 2001_화이트.svg
NT 커널
2000 Neptune (NT 5.5) 1999 2000 ( NT 5.0)
2001 XP (NT 5.1)
2005 (x64) (NT 5.2)
2006 Vista (NT 6.0)
2009 7 (NT 6.1)
2012 8( RT) (NT 6.2)
2013 8.1( RT) (NT 6.3)
Server 2003( R2 2005) (NT 5.2)
2007 Home Server (NT 6.0)
Server 2008 (NT 6.0)
2009 ( R2) (NT 6.1)
Home Server 2011 (NT 6.1)
Server 2012 (NT 6.2)
2013 ( R2) (NT 6.3)
파일:Windows 아이콘 2012_화이트.svg
One 코어

(NT 10.0)
2015 10( 버전, X 2021)
2018 ( Polaris OS, Andromeda OS)
2021 11( 버전)
( Factory OS)
Server 2016( Hyper-V)
2017 ( 반기 채널)
2018 Server 2019( Hyper-V)
2021 Server 2022
2023 ( 연간 채널)
Server 2025
파일:Windows_Insider_logo.webp
개발 중
shhh...
2025? vNext 2028? Server vNext
파일:Windows 365 아이콘.svg Windows 365 파일:Windows Insider Program.png Windows Insider Program
}}}}}}}}} ||

1. 개요2. 상세3. 기술적 설명
3.1. 부팅/종료 과정3.2. 부트로더3.3. ntoskrnl.exe
3.3.1. 구성 요소
3.4. ntdll.dll3.5. 커널 오브젝트
3.5.1. 핸들
3.6. 프로세스 / 스레드
3.6.1. 생성 과정3.6.2. PEB (Process Environment Block) / TEB (Thread Environment Block)
3.7. win32k.sys3.8. System Idle Process (유휴 프로세스)3.9. WOW64 (Windows 32-Bit on Windows 64-Bit)3.10. x86-64 에뮬레이터3.11. 커널 패치 보호 (Kernel Patch Protection)3.12. 기본 탑재 드라이버
4. 시스템 프로세스
4.1. smss.exe4.2. 서브시스템
4.2.1. Native4.2.2. csrss.exe
4.3. winlogon.exe4.4. wininit.exe4.5. dwm.exe4.6. services.exe4.7. svchost.exe4.8. lsass.exe4.9. conhost.exe
5. NT 커널 사용 운영체제

1. 개요

마이크로소프트에서 개발한 운영체제 커널.

초창기 윈도우 및 일부 개인용 윈도우는 DOS 커널을 사용하므로 해당 문서 참조, 아래는 현용 NT 커널에 관한 내용만을 서술한다.

현재 안정화 버전은 10.0이고 개발중인 버전은 11.0이다.[1]

제작에 사용된 언어는 C언어이다. 하지만 2000년대 중반부터 드라이버 부분 같은 일부 소스코드는 C++로 제작되었다. 다만 C++은 문서에서 보이듯 태생적인 보안 이슈가 있었다. 그래서 2020년대부터 C++로 작성된 3만6천 라인의 소스코드 부분을 Rust로 재작성하는 중이다. #

2. 상세

파일:Windows NT 커널 구조도.svg
위 사진은 Windows NT 계열 커널의 구조도이며, 혼합형 커널이다.

초창기 윈도우는 MS-DOS 위에서 작동하는 형태라 안정적이지 못했고 도스가 없으면 작동하지 않았다. 그래서 만든 도스에 의존하지 않는 커널을 사용하는 윈도우가 바로 Windows NT이다.

Windows NT는 본래 가정용이 아니라 기업 및 서버용으로 개발됐다. Windows 9x(Windows 95, 98, Me)는 DOS 기반이다. 하지만 DOS 기반 윈도우는 불안정하여 블루스크린 발생 빈도가 높았다.

가정용으로 개발된 Windows XP부터 NT 커널을 사용하기 시작했다. DOS 기반보다 나은 성능과 안정성으로 사용자들에게 큰 인기를 받으면서 Windows 11까지 사용하는 대중적인 커널이 됐다.

새로 설계한 커널이므로 DOS 및 Windows 3.x 프로그램과의 호환성은 없다. Windows 9x용 프로그램은 32비트 코드만 사용한 경우에는 실행이 가능하지만, 16비트 코드를 혼용한 경우에는 정상적인 실행을 보장하지 못한다. 물론 호환성을 보장하기 위해 호환성 모드와 NTVDM(Windows NT Virtual DOS Machine), WoW32(Windows 16-bit on Windows 32-bit) 등이 있었으나 완전하지 않았으며, 그마저도 64비트에서는 AMD64의 특성[2] 때문에 NTVDM와 WoW32는 제거됐다. 64비트만 존재하는 Windows 11부터는 사실상 완전히 사라졌다. 64비트 Windows에 탑재되는 WoW64(Windows 32-bit on Windows 64-bit)는 32비트 앱 실행을 위해서 존재한다.

일반 윈도우와 서버 윈도우, 게이밍 콘솔(엑스박스 시리즈) 윈도우, 모바일 윈도우의 커널은 차이가 없다. 서버 윈도우는 그냥 서버 관리를 위한 기능들이 추가됐을 뿐이고 각각의 다른 윈도우들도 쓸모없는 기능을 끄고 필요한 기능이 추가됐을 뿐이다.

다만 하드웨어 제약이 심한 구형 게이밍 콘솔 2종(초대 엑스박스, 엑스박스 360)은 기존 NT 커널을 크게 축약시켰기 때문에 NT 커널 계열이지만 윈도우 커널이라고는 부를 수 없다고 한다. 이후 나온 엑스박스 원 부터는 이런 제약이 완화돼서 그냥 윈도우 커널이 통째로 들어간다.

3. 기술적 설명

3.1. 부팅/종료 과정

컴퓨터를 키면 BIOS/ UEFI 과정을 거친 후 부팅 드라이브를 찾아 그 드라이브의 MBR/GPT 부트로더를 실행한다.

이후 MBR/GPT 부트로더는 시스템 폴더에 있는 winload.exe를 실행하고 winload.exe는 ntoskrnl.exe 파일을 실행한다. ntoskrnl.exe의 EP(Entry Point)는 KiSystemStartup 함수이다.

실행된 ntoskrnl.exe는 CPU를 초기화하고 HAL(Hardward Abstraction Layer, 하드웨어 추상화 레이어)와 여러 시스템(객체 관리자, I/O 관리자 등)을 초기화하고 윈도우 환경을 구성한다. 이후 사용자 모드에서 smss.exe 프로세스가 첫번째로 실행되고 나머지 부팅 작업을 한 뒤 로그온 화면을 띄운다.

시스템 종료를 하는 경우 커널 모드의 PopGracefulShutdown이 실행되는데, 중요 프로세스 외의 다른 프로세스를 종료시키고 HAL, 모든 핸들 닫기 등의 절차를 거친 뒤 하드웨어 종료 명령어를 실행한다. ATX(규격) 1.0 이상의 컴퓨터 파워부터는 APM이나 ACPI를 지원하여 운영체제의 통제를 받을 수 있으므로[3] 하드웨어 종료 명령어를 받은 컴퓨터는 자동으로 꺼진다.

이를 지원하지 않는 구형 파워(AT 규격)와 구형 NT 커널에서는 단순히 HDD 헤드 파킹만 하고 사용자가 직접 컴퓨터 전원을 내려야 꺼진다.[4]

3.2. 부트로더

윈도우의 부트로더는 NTLDR와 Windows Boot Manager가 있다. NTLDR는 Windows NT 3.1부터 Windows XP까지 사용하고 Windows Vista부터는 Windows Boot Manager를 사용한다.

NTLDR는 루트 디렉터리에 들어가 있으며 boot.ini 파일을 불려와서 부팅 메뉴를 구성한다. 또한 ntdetect.com 파일을 통해 하드웨어 정보를 가져온다. 사용자가 부팅 메뉴에서 부팅할 항목을 고르면 해당 항목에서 설정한 정보를 바탕으로 윈도우를 실행하고 ntdetect.com가 수집한 하드웨어 정보를 커널에 넘겨준다. Windows Boot Manager의 경우 boot.ini 대신 BCD를 사용한다.

Windows XP까지는 부트로더가 어떠한 이유로 꼬이면 NTLDR is missing라는 메시지를 볼 수 있다. Windows Vista부터는 bootmgr is missing 또는 "Windows failed to start." 라는 메시지가 나온다.

NTLDR는 윈도우 설치 드라이브에 존재하지만 Windows Boot Manager는 윈도우 설치 과정에서 별도의 100MB 용량의 FAT32 파티션을 생성하여 Windows Boot Manager를 넣고 부팅 파티션(UEFI의 경우 EFI 파티션)으로 설정한다. 부팅 파티션은 일반적으로 보이지 않는다.

이는 메인보드가 NTFS 부팅을 지원하지 않을 가능성이 있기 때문이다. UEFI에서도 NTFS 부팅 지원은 선택 사항인지라 일부 UEFI 메인보드가 지원하지 않는 경우도 있다. 물론 2010년 후반 이후에 출시되는 메인보드라면 대부분 NTFS 부팅을 지원하므로 신경 쓸 필요가 없으나 그 전의 메인보드인 경우 NTFS 부팅을 지원하고 있는지 확인해야 한다. 그래서 윈도우 설치 USB도 FAT32로 포맷되어 있다.

3.3. ntoskrnl.exe

ntoskrnl.exe은 윈도우의 커널 프로그램으로 윈도우 부팅 전부터 실행된다.[5] 파일 위치는 시스템 폴더에 있다.

커널 프로그램인 만큼 네이티브 API( Windows API)를 전혀 사용하지 않는다. ntoskrnl.exe의 프로세스 이름은 System이다. 커널 모드에서 실행되므로 관리자 권한으로도 종료시킬 수 없다.
파일 이름 멀티 프로세서 지원 PAE 지원
ntoskrnl.exe X X
ntkrnlmp.exe O X
ntkrnlpa.exe X O
ntkrpamp.exe O O
ntoskrnl.exe 외에는 3개의 커널 이미지 파일이 있다. 그게 바로 ntkrnlmp.exe, ntkrnlpa.exe, ntkrpamp.exe으로 멀티 프로세서 사용 여부[6], PAE 지원 여부에 따라 결정된다. ntoskrnl.exe는 멀티 프로세서와 PAE를 전부 지원하지 않는다.

ntoskrnl.exe는 커널 그 자체이므로 이 파일이 손상되거나 없어지면, 말 그대로 윈도우 부팅이 불가능하다. 또한 ntoskrnl.exe에 디지털 서명이 되어 있으며, 윈도우 부팅 과정에서 ntoskrnl.exe를 비롯한 중요 시스템 파일의 디지털 서명을 검증하며 유효하지 않을 경우 윈도우 부팅 관리자는 0xc0000428[7] 오류를 표시한다. 이때는 F8을 눌러서 드라이버 서명 적용 안함을 선택하고 부팅해야 한다.

커널 패닉 블루스크린도 커널에서 발생하며, 관련 커널 함수는 KeBugCheck, KeBugCheckEx이다. 실제로 시스템 충돌이 발생한 경우 이들 함수 중 하나를 호출하여 블루스크린을 띄우게 만든다.[8]

윈도우 XP때 이 파일이 부팅 화면 역할을 맡았다.

3.3.1. 구성 요소

ntoskrnl.exe는 다양한 서비스를 제공하는데 다음과 같다. 함수가 워낙 많다보니 맨 앞에 접두사를 붙여서 구분하고 있다. 아래에 있는 것들이 다는 아니고 더 있다!

3.4. ntdll.dll

Windows API의 모든 함수는 ntoskrnl.exe에서 구현되고 ntdll.dll라는 라이브러리 파일을 통해 사용자 모드에 노출된다. 일반 프로그램들은 사용자 모드에서 실행되므로 커널에 직접적으로 접근할 수 없다. 그래서 ntdll.dll의 시스템 콜로 커널에 요청하는 방법을 사용한다. 파일 생성/삭제 등의 변경, 프로세스 생성, 그래픽 출력, 네트워크 사용 등, 거의 모든 행위는 시스템 콜이 필요하다.

윈도우의 시스템 콜 과정은 시스템 콜 문서 참고.

ntdll.dll의 함수들은 문서화되어 있지 않다.[11] 즉 일반적인 방법으로는 사용할 수 없고 LoadLibrary와 GetProcAddress를 사용해서 ntdll.dll를 로드하고 함수의 주소를 가져와서 실행해야 한다. 아니면 ntdll.lib를 사용해서 ntdll.dll의 함수를 정의하여 사용하는 방법도 있는데, Windows SDK에는 없고 DDK(드라이버 개발 킷)에만 있으므로 DDK가 설치되어 있지 않았다면 설치하거나 인터넷에서 ntdll.lib를 다운로드 받아 사용해야 한다.

3.5. 커널 오브젝트

윈도우에서 만들어지는 모든 객체(프로세스, 스레드, 이벤트, 뮤텍스, 파일, 액세스 토큰 등)를 의미한다.

커널 오브젝트는 객체 관리자(Object Manager)에 의해 메모리에 할당이 되고 필요가 없어질 때 할당 해제되어 사라진다. 대부분의 커널 오브젝트는 더 이상 쓰이지 않으면 소멸되는 임시 객체지만 절대로 소멸되지 않는 객체도 존재한다.[12]

객체가 더 이상 필요가 없어질 때 소멸되는 원리는 참조 횟수라는 것을 이용한다. 즉 객체에 접근할 때마다 참조 횟수가 늘어나고 반대로 더 이상 접근하지 않을 때 참조 횟수가 줄어든다. 이렇게 참조 횟수가 0이 되면 윈도우는 해당 객체를 메모리에서 제거할 수 있게 된다. 사용자 모드에서 객체에 대한 핸들을 생성할 때마다 참조 횟수가 늘어나고 반대로 핸들을 닫으면 참조 횟수가 줄어든다.

개체를 참조하는 커널 함수(ObReferenceObjectByHandle 등)들은 내부적으로 참조 횟수를 증가시키는데 더 이상 객체에 접근할 필요가 없어졌다면 ObDereferenceObject를 호출하여 직접 객체의 참조 횟수를 감소시켜줘야 한다. ObDereferenceObject 함수는 참조 횟수를 감소시키고 더 이상 필요 없어서 삭제해야 하는지 보존 검사를 수행한다.

프로세스의 경우 만들어질 때 커널은 EPROCESS와 KPROCESS 구조체를 메모리에서 할당하고 초기화하는 과정을 거쳐 프로세스의 진입점(주로 main 함수)을 실행하는 주 스레드를 생성한다. 그리고 프로세스가 종료될 때 아직 열려있는 핸들이 남아있다면 메모리에서 사라지지 않는다. 프로세스가 종료되더라도 열려 있는 해당 프로세스에 대한 핸들이 남아있으면 윈도우는 해당 프로세스의 플래그에 삭제 비트를 넣어줄 뿐, 모든 핸들이 닫힐 때까지 객체를 유지한다.

3.5.1. 핸들

프로세스는 커널 오브젝트(프로세스, 스레드, 이벤트 등)에 직접 접근할 수 없다. 대신 핸들(Handle)을 통해 간접적으로 객체에 접근할 수 있다. 이 핸들들을 모아 관리하는 구조체는 핸들 테이블(Handle Table)이라 부른다. 객체마다 핸들 테이블을 가지고 있다. 핸들 테이블에는 핸들 번호와 객체의 실제 주소, 액세스 권한, 참조 횟수 등이 포함되어 있다.

프로세스가 OpenProcess 등으로 객체에 대한 핸들을 생성하고 핸들을 통해 윈도우 객체에 접근하려고 하면 윈도우는 해당 객체의 핸들 테이블을 참조하여 핸들이 있는지, 무슨 권한으로 접근하려는지 등을 체크하여 문제가 없을 경우 프로세스의 요구에 따라 객체를 다루게 된다.

Windows API의 객체를 다루는 함수들은 모두 핸들을 요구하고 있다. 그리고 함수마다 요구하는 권한이 다르다. 예를 들어 객체의 정보를 수정하는 함수(SetProcessInformation 등)들은 수정 권한을 요구하며 반대로 객체의 정보를 쿼리하는 함수(NtQueryProcessInformation 등)는 쿼리 권한이 필요하는 식이다. 윈도우는 핸들을 통해 객체에 접근하려는 권한이 해당 핸들이 가지고 있지 않다면 바로 액세스 거부를 때린다.

핸들을 더 이상 사용하지 않을 때에는 CloseHandle로 직접 핸들을 닫아줘야 한다. 그렇게 하지 않으면 핸들은 프로세스가 종료될 때까지 그대로 남겨지게 된다. 물론 프로세스가 종료되면 윈도우는 해당 프로세스의 열려 있는 핸들을 모두 닫아주긴 하다.

핸들 중에서 '의사 핸들'(Pseudo Handle)이라는 것도 존재한다. GetCurrentProcess이나 GetCurrentThread로 반환받은 핸들이 바로 의사 핸들이다. 의사 핸들은 해당 프로세스에서만 사용할 수 있으며 모든 액세스 권한을 가지고 있다. 의사 핸들은 CloseHandle로 닫을 수 없다.

3.6. 프로세스 / 스레드

프로그램은 코드, 리소스 등이 집합되어 있는 디스크 내에 있는 실행 파일을 말하며, 프로그램이 실행될 때에는 메모리에 할당되고 프로세스가 된다.

프로세스는 최소 하나 이상의 스레드를 두고 있다. 스레드는 프로세스보다 작은 단위로 코드를 실행할 수 있다. 또한 스레드들은 프로세스 내의 자원을 공유한다. 그 대신 스레드들 중 하나라도 예외를 일으키면 프로세스도 함께 종료된다.

윈도우의 스케줄링은 스레드를 최소 단위로 동작한다. 즉 스레드가 실질적인 실행 흐름을 담당한다. 그래서 프로세스는 스레드가 없으면 동작하지 않는다.

3.6.1. 생성 과정

윈도우 프로세스의 생성 과정은 다음과 같다.

1. 사용자가 실행 파일을 클릭하면 PE Loader가 해당 실행 파일을 열고 PE 헤더를 찾는다. PE 헤더에는 타깃 CPU 아키텍처, 진입점, 서브시스템 등, 프로세스 실행에 필요한 정보가 들어가 있다.
2. PE 헤더에서 필요한 정보들을 얻어냈으면 다음 단계로 넘어간다.
3. NtCreateUserProcess 함수를 호출하여 커널 영역에서 프로세스 객체(EPROCESS, KPROCESS[13])를 할당하고 초기화한다.
4. 프로세스가 성공적으로 생성됐으면 NtCreateThread 함수를 호출하여 프로그램의 진입점을 실행하는 기본 스레드를 생성한다. NtCreateThread는 커널 영역에서 스레드 객체(ETHREAD, KTHREAD[14])를 할당하고 초기화한다. 이렇게 만들어진 스레드는 일시정지(Pause) 상태로 생성된다.
5. 프로세스 및 기본 스레드가 생성됐으면 Win32 서브 시스템인 csrss.exe 프로세스에 생성된 프로세스 ID 및 기본 스레드 ID를 전달하여 Win32 서브시스템에서 관리할 수 있도록 만든다.
6. 이후 기본 스레드의 일시정지 상태를 해제하여 실행되도록 만든다. 단, CREATE_SUSPENDED 옵션이 주어졌을 경우 예외로 한다. 이 경우 ResumeThread 함수로 직접 스레드의 일시정지 상태를 해제시켜야 한다.

3.6.2. PEB (Process Environment Block) / TEB (Thread Environment Block)

사용자 메모리에 존재하는 특정 객체의 정보(식별자 등)가 담긴 구조체다. PEB는 프로세스의 정보, TEB는 스레드의 정보가 담겨있는 구조체를 말한다.

일반 프로그램은 사용자 모드에서 실행되므로 커널 메모리에 직접 접근할 수 없다. 이 경우 자신의 프로세스 정보가 커널 영역에 있기 때문에 자신의 프로세스 ID만 가져오려면 시스템 콜 등의 간접적인 방법을 사용해야 한다. 이렇게 되면 오버헤드가 발생하여 성능이 저하될 수 있다.

그래서 이를 해결하주는게 바로 PEB이다. 프로세스 생성 시 커널 메모리에 있는 프로세스의 정보 중 일부를 사용자 메모리로 복사하여 프로세스가 시스템 콜을 사용하지 않고 바로 프로세스의 정보를 가져올 수 있게 해준다.

참고로 이러한 개념은 스레드에도 존재하며 TEB라고 부른다. TEB 구조체의 필드 중에서 PEB의 주소가 존재하며 특정 레지스터[15]에 TEB의 주소가 들어가 있다.

커널 정보가 사용자 메모리의 특정 주소에 존재한다는 점 때문에 특정 방법을 사용하여 커널 정보를 유출시킬 수 있는 취약점이 발생하기도 했다. 그게 바로 CPU 게이트.

3.7. win32k.sys

ntoskrnl.exe에는 GUI이나 메시지 처리 기능이 없다. 이 기능들은 win32k.sys라는 별도의 커널 드라이버에서 제공한다. 이 파일 역시 시스템 폴더에 위치한다.

이 드라이버는 윈도우 부팅 시부터 실행하며 GDI, 윈도우(창), 메시지 처리 등을 관리한다. 역시 win32k.sys의 API도 시스템 콜로 구현되어 있다. 이들 함수는 NtGdi, NtUser 집두사가 붙어있고 gdi32.dll와 user32.dll에서 정의된다. 여기서 이 2개 DLL는 win32u.dll의 함수를 호출하게 되는데 win32u.dll는 win32k.sys의 시스템 콜을 실행하게 된다.

Windows 7까지는 win32k.sys 하나 뿐이었지만 Windows 8부터 4개의 드라이버 파일로 분할됐다. (win32k.sys, win32kbase.sys, win32kfull.sys, win32kns.sys)

3.8. System Idle Process (유휴 프로세스)

작업 관리자 등에서 보면 유독 CPU 점유율을 많이 먹는 'System Idle Process'라는 프로세스를 찾아 볼 수 있다.

이 프로세스는 파일로 존재하지 않으며 커널의 시작 단계에서 생성되는 프로세스이다. 그래서 PID가 0이다. 이 프로세스는 남은 CPU 사용량을 계산하고 있어 CPU 점유율이 높은 것이다. 물론 그렇다고 컴퓨터 성능에는 영향을 미치지 않는다. 만약에 한 프로세스가 CPU 사용량을 많이 차지하고 있으면 반대로 System Idle Process 프로세스의 CPU 점유율이 낮아진다.

그 외에 Windows 10에는 Memory Compression, Interrupts, Registry 프로세스가 있다. Windows 11부터에는 Secure System 프로세스도 생겼는데, 이는 가상 보안 모드(VSM)와 관련되어 있다. 이후 Windows 10도 업데이트로 생겨났다.

3.9. WOW64 (Windows 32-Bit on Windows 64-Bit)

WOW64는 64비트에서 있는 기능으로 32비트 윈도우 실행 파일 및 DLL 파일과 호환할 수 있도록 만들어진 에뮬레이트 기능이다.

64비트 버전에서 시스템 파일들이 있는 System32 폴더 외에 SysWOW64라는 폴더가 있는데 이게 바로 32비트 시스템 파일들이 들어있다.[16] 32비트 프로그램이 System32 폴더에 접근하려고 하면 실제로 SysWOW64 폴더로 접근하게 된다. 따라서 32비트 프로그램이 System32 (64비트) 폴더에 접근하고자 한다면 특정한 선언을 정의해야 한다.

WOW64 기능 관련 파일은 System32 폴더에 있는 wow64.dll, wow64cpu.dll, wow64win.dll이다. 32비트 프로그램이 실행될 때 이 세 파일이 로드되고 32비트 시스템 DLL들과 32비트와 64비트 ntdll.dll이 로딩된다. WOW64는 32비트 프로그램의 Windows API 호출을 가로채서 인자 등을 64비트에 맞게 변경한 뒤 64비트 함수로 호출한다.

따라서 32비트 프로그램은 64비트 프로그램와 동일하게 작동하지만 API 호출 단계가 추가됐기에 따라 성능 하락이 있을수도 있고 32비트의 한계로 최대 2GB의 메모리를 사용할 수 있다.

다만 라이브러리의 경우 DLL의 비트가 프로세스의 비트와 맞아야 한다. 예를 들어 64비트 프로세스에서 32비트 DLL 파일을 사용할 수 없다. 그 반대도 마찬가지로 32비트 프로세스에서 64비트 DLL를 사용할 수 없다. 따라서 64비트만 지원하는 프로그램이 아니면 32비트와 64비트용 DLL를 따로 두어야 한다.

그리고 드라이버는 WOW64가 적용되지 않으므로 반드시 비트에 맞게 로드해야 한다. 즉 32비트 드라이버를 64비트 윈도우에서 사용할 수 없다. 그 반대도 마찬가지다.

3.10. x86-64 에뮬레이터

Windows on ARM에서만 있는 에뮬레이터 기능.

ARM x86/ AMD64와는 구조가 완전히 다르기 때문에 x86/AMD64로 컴파일된 프로그램을 ARM에서 사용할 수 없다. 그래서 이 기능은 x86/AMD64 명령어를 ARM으로 번역시키는 것으로 x86/AMD64 프로그램을 실행할 수 있도록 해준다. 원래는 x86(32비트)만 지원했고 AMD64(64비트)는 특허 문제로 지원되지 않았으나, 이후 해결되어 Windows 11부터 x64 에뮬레이팅(ARM64EC)도 지원한다.

이 기능으로 Windows on ARM에서 x86/AMD64 프로그램을 사용할 수 있지만, 명령어만 가로채서 바꿔치는 WOW64와 달리 기계어 단위로 에뮬레이트하는 방식이라 성능이 떨어진다.

3.11. 커널 패치 보호 (Kernel Patch Protection)

Windows XP Professional x64 Edition와 이를 기반으로 한 Windows Server 2003 x64[17]부터 적용된 보안 기능이다. 비공식적으로는 패치가드(PatchGuard)라고 부른다.

KPP는 커널 모드에서 동작하는 드라이버가 커널의 주요 부분을 수정하면 이를 감지하고 블루스크린을 일으킨다. 오류 코드는 CRITICAL_STRUCTURE_CORRUPTION(0x00000109)이다. KPP가 검사하는 대표적인 항목들은 다음과 같다.

위와 같이 KPP는 많은 검사를 수행한다. 즉 커널의 내부 코드는 전부 KPP의 보호에 들어간다고 보면 된다. 물론 드라이버도 커널 모드에서 작동하므로 KPP를 무력화시킬수도 있다. 하지만 마이크로소프트는 보안 패치를 통해 KPP 무력화나 우회 수단을 지속적으로 막는 중이다. 실제로 디어셈블리를 해보면 KPP의 기능이 매우 복잡하게 설계되어 있는 것을 볼 수 있다. 이는 KPP 분석을 어렵게 만드는 요인으로 작용하고 있다.

32비트 Windows에는 KPP가 없어서 드라이버가 커널의 내부 코드를 패치할 수 있었다. 하지만 Windows 11부터는 64비트만 지원되기에 사실상 KPP를 비활성화시킬 수 있는 방법은 사라졌다.

KPP로 인해 윈도우 64비트에서는 몇몇 기능을 사용할 수 없게 됐다. 대표적으로는 시스템 콜 후킹으로 안티 바이러스 제작사들은 시스템 콜 테이블을 수정하는 방법으로 실시간 감시 기능을 구현했었는데 KPP로 인해 불가능해졌다. 대신 마이크로소프트 DDK 문서에서 제공하는 콜백 API를 이용하여 실시간 감시를 구현하고 있다. (ObRegisterCallbacks)[18]

3.12. 기본 탑재 드라이버

윈도우는 다른 운영체제와 마찬가지로 사용자가 직접 설치하는 서드파티 드라이버 외에는 기본적으로 탑재되어 있는 드라이버가 있으며 그 수가 많다. BIOS, UEFI 드라이버부터 USB, 시리얼 포트 등의 데이터 입출력 단자 드라이버, NTFS, FAT32 등의 파일 시스템 드라이버, TCP/IP, 소켓, TLS 등의 네트워크 드라이버, 그래픽 드라이버나 마우스, 키보드, 사운드카드 등의 휴먼 인터페이스 드라이버 등이 있다.

4. 시스템 프로세스

4.1. smss.exe

smss.exe는 세션 관리자 하위 시스템(Session Manager Subsystem)으로 윈도우 시작 과정에서 제일 먼저 실행되는 프로그램이다.

초기 실행때부터 환경 변수를 생성하고 사용자 환경 및 GDI 기능을 담당하는 win32k.sys 드라이버를 로드하며 csrss.exe 등 다른 하위 시스템도 실행시킨다. 그리고 마지막으로 로그온 프로그램(LogonUI.exe)을 실행하여 윈도우 로그인 창을 띄우게 만든다.

4.2. 서브시스템

서브시스템은 프로세스의 운영체제 API 호출을 관장하는 프로그램을 말한다. 사용자 모드에서 실행하면서 프로세스가 시스템 함수를 호출하면 서브시스템이 이를 커널에 요청( 시스템 콜)하여 커널 모드에서 처리하도록 한 뒤 결과를 받아 해당 프로그램에 전달한다.

또한 서브시스템은 프로세스와 통신할 때 빠른 정보 송신을 위해 IPC 대신 LPC(Local Inter-Process Communication, 로컬 컴퓨터 프로세스간 통신)를 이용한다. LPC는 Windows API에서 문서화되지 않는 요소이며, 오직 커널에서만 사용할 수 있다.

Windows NT 시절에는 Win32 외에는 POSIX, OS/2 서브시스템도 있었으나[19] Windows XP부터 가정용으로 변모되면서 Win32 외의 서브시스템은 전부 사라졌다. 그래도 Windows Server 2003 R2부터 POSIX에 준하는 서브시스템(SUA, Subsystem for UNIX-based Applications)이 탑재됐으나 리눅스와의 호환성이 부족한데다 기본적으로 켜져있지 않는다.[20] 하지만 이마저도 Windows Server 2012 R2부터 탑재되지 않게되면서 윈도우의 서브시스템은 Win32만 남았었다.

Windows 10부터 리눅스 서브시스템으로 우분투를 탑재했다. 다만 기본적으로 탑재되지 않고 Microsoft Store에서 직접 설치해야 한다. 윈도우 11부터 리눅스 서브시스템에 안드로이드 운영체제가 추가됐다.

4.2.1. Native

특수한 서브시스템으로 윈도우 부팅 때 처음으로 먼저 진입하는 부분이기도 하다. ntoskrnl.exe, csrss.exe, smss.exe, autochk.exe, 각종 드라이버 등이 Native 프로그램이다. Native 프로그램은 오직 ntdll.dll의 함수만(드라이버의 경우 ntoskrnl.exe의 함수나 기타 타 드라이버의 함수)을 사용하여 동작하도록 되어 있다.

Native 프로그램의 진입점은 NtProcessStartup이며, 프로그램의 기본 힙이 없으므로 직접 힙 객체를 생성하여 사용해야 한다. 먼저 RtlCreateHeap로 힙 객체를 생성한 후 RtlAllocateHeap 함수를 사용하여 메모리를 동적 할당한다. 이후 메모리가 더 이상 사용할 필요가 없다면 RtlFreeHeap 함수로 동적 할당된 메모리를 해제해야 하고 프로그램을 종료하겠다고 하면 RtlDestroyHeap 함수로 힙 객체를 제거해야 한다. 또한 NtProcessStartup 진입점은 VOID 유형이므로 프로그램이 끝날 때 NtProcessTerminate 함수를 호출하여 자기 자신을 종료시켜야 한다. 화면에 글자를 출력하려면 NtDisplayString 함수를 사용한다. #

ntdll.dll의 함수만 사용할 수 있으므로 표준 C언어 함수는 지원하지 않는다. 즉 printf, gets, strcpy, memcpy 같은 C언어 함수는 사용할 수 없는데, 사용하려면 직접 구현해야 한다.

윈도우 부팅 후에는 Win32 모드로 진입하기에 Native 프로그램을 실행할 수 없다. 실행하려고 하면 Win32 모드에서 실행할 수 없다는 메시지가 뜬다.

4.2.2. csrss.exe

Win32 서브시스템을 말하면 이 프로그램을 의미한다. Win32 프로세스와 LPC 통신하며 시스템 콜을 수행하며 Win32 프로세스 및 스레드 생성 및 삭제 등도 수행한다.

Windows Vista부터 csrss.exe는 두개로 실행된다.

csrss.exe는 실행 시부터 크리티컬 프로세스로 지정되기 때문에 강제로 종료시키면 블루스크린이 발생한다. 다만 '일시 정지'시키는 경우는 블루스크린이 발생하지 않은데 모든 csrss.exe를 일시정지시키면 커서만 움직이고 아무것도 못한다(...) 시작 메뉴도 열 수도 없는 등 완전히 기능이 마비되므로 강제 재부팅 외에는 방법이 없다.

4.3. winlogon.exe

사용자의 로그온/로그오프 관련 기능을 관장하는 프로세스이다.

Windows Vista 전에는 강제로 종료될 경우 블루스크린이 발생하지만 Vista부터는 종료되더라도 블루스크린이 발생하지 않고 대신 강제로 로그오프가 된다. 그 외에도 lsass.exe와 services.exe 프로세스를 실행하는 기능도 있었는데 VIsta부터는 이 기능은 wininit.exe로 넘어갔다.

4.4. wininit.exe

Windows Vista부터 존재하는 프로세스, winlogon.exe와 동시에 실행된다.

먼저 처음 실행될 때 lsass.exe와 services.exe 프로세스를 실행한다. 강제 종료될 경우 블루스크린이 발생한다.

4.5. dwm.exe

Windows Vista부터 존재하는 프로세스, dwm는 데스크톱 창 관리자(Desktop Window Manager)의 약자로 화면 렌더링, 디자인, 그래픽 효과 등, GPU 관련 기능을 담당한다. 그러다보니 메모리를 많이 먹는 편, dwm.exe는 svchost.exe 프로세스에 의해 실행된다.[21]

DirectX를 사용하여 프로그램들의 그래픽 처리를 GPU 내에서 실행하도록 함으로써 CPU의 사용량을 줄여주고 빠른 화면 갱신 속도를 보여준다. 하지만 GPU의 성능이 형편없으면 병목 현상이 발생해서 오히려 느려질 수도 있다.[22]

Windows 7까지는 강제 종료하면 Basic 테마(Windows Vista 기본, Windows 7 Basic K)로 바뀌었지만 Windows 8부터는 강제 종료가 불가능하게 바뀌었다. 작업 관리자에서 강제 종료해도 다시 실행되며, 강제 종료를 반복하다보면 블루스크린도 뜬다. 서드 파티 프로그램을 사용하여 다시 실행되지 못하게 막아버리면 Basic 테마로 나오지만, 작업 표시줄이나 시작 메뉴, 파일 탐색기 등이 깨져서 나오고 Universal Windows Platform 앱은 아예 실행이 되지 않는다.

4.6. services.exe

백그라운드에서 실행되는 드라이버와 서비스들을 관리하는 프로세스로 Service Control Manager라고 부른다. 윈도우 부팅 중에 실행된다.

서비스 데이터베이스을 관리하며 서비스 프로세스와 상호작용하여 시작, 정지, 일시정지 설정 또는 해제, 삭제 등을 수행한다. CreateService 등의 서비스 관련 함수들은 내부적으로 services.exe 프로세스에 요청하고 결과 값을 받는 식으로 동작한다. 서비스 핸들(SC_HANDLE)도 관리하며 그래서 서비스 핸들을 닫으려면 CloseHandle 함수가 아닌 CloseServiceHandle 함수를 사용해야 한다.

서비스는 드라이버 서비스와 일반 서비스로 나누어진다. 드라이버 서비스는 말 그대로 커널 모드에서 동작하는 소프트웨어로 커널 드라이버, 파일 시스템 드라이버가 이에 해당된다. 반면 일반 서비스는 svchost.exe 등의 백그라운드 프로세스를 실행하는 서비스로 사용자 모드에서 동작한다. 참고로 드라이버 서비스가 실행하려는 드라이버 파일에 유효한 디지털 서명이 있어야 동작한다.[23]

서비스 계정이라는게 있어서 서비스를 실행하는 계정을 설정할 수 있다. (단 드라이버 서비스는 서비스 계정이 필요하지 않다.) 기본적으로 사용할 수 있는 서비스 계정으로는 LOCAL SYSTEM, LOCAL SERVICE, NETWORK SERVICE이 있으며 대부분 서비스는 LOCAL SYSTEM 계정으로 실행된다. LOCAL SYSTEM 계정은 가장 강력한 권한을 보유하고 있으며 그 권한이 Administrator 그룹에 속한 계정보다 훨씬 높다.

드라이버 서비스의 경우 ntdll.dll의 함수들 중 하나인 NtLoadDriver를 호출하여 드라이버를 커널에 로드한다. 드라이버 서비스를 정지시킬 때는 NtUnloadDriver 함수를 사용하여 드라이버를 커널에서 해제시킨다.

4.7. svchost.exe

Win32 서비스들을 처리하는 프로그램으로 별도의 실행파일로 분리되지 않는 기능은 svchost.exe가 맡는다. 그러다보니 그 수가 많다. 모든 svchost.exe 프로세스들은 services.exe에 의해 관리된다.

자세한 내용은 해당 문서를 참조.

4.8. lsass.exe

lsass는 로컬 보안 인증 하위 시스템(Local Security Authority Subsystem Service)의 약자로 윈도우의 사용자 인증 기능을 수행하는 프로세스이다. 컴퓨터에 접속하려는 사용자를 인증하고 관리한다. 윈도우 부팅 중에 실행된다.

로그온된 사용자 계정의 정보를 다루는 프로세스다보니 lsass.exe의 메모리를 덤프해서 컴퓨터에 로그온 중인 계정의 정보를 빼내는 해킹 기법도 있다. 물론 MS도 이를 알고 있기에 일반적으로 방법으로 lsass.exe의 메모리를 덤프할 수 없으며 덤프하더라도 덤프된 메모리 파일을 백신이 악성 코드로 판단하여 바로 삭제해버린다. 진단명은 대개 lsassDump가 들어가 있다.

4.9. conhost.exe

일반적인 콘솔 프로그램은 자체적으로 창을 가지고 있지 않는다. 그 대신 conhost.exe에게 I/O 통신 방식으로 화면 출력을 위임하여 창을 표시하는 구조로 되어 있다. 기본적으로 콘솔 프로그램에서만 실행된다. 창 프로그램이라면 창이 표시되지 않더라도 conhost.exe가 같이 실행되지 않는다.

conhost.exe는 자식 프로세스로써 부모 프로그램(콘솔 프로그램)에 붙여있기 때문에 conhost.exe를 종료하면 그 부모 프로세스도 함께 종료하게 된다.

Windows 7부터 존재하며, Windows Vista까지는 csrss.exe가 담당한다. Windows XP Windows Vista에서 CLI 창이 Windows 고전 테마[24]로 나오는 것도 이 때문이다.

Windows 11부터는 Windows Terminal을 대신 사용하지만 설정 → 시스템 → 개발자용 → 콘솔에서 기존의 Windows 콘솔 호스트(conhost.exe)도 선택할 수 있다. Windows 10에서는 Microsoft Store에서 설치해서 사용할 수 있다.

5. NT 커널 사용 운영체제


[1] 그래서 윈도우 11도 커널은 NT 10.0이다. [2] NTVDM와 WoW32는 가상 8086를 사용하는데 AMD64의 롱 모드(64비트 모드)에서는 사용할 수 없다. [3] 최신규격 파워와 최신 버전 NT 커널로 갈수록 운영체제가 파워서플라이에 대한 권한이 강해진다. ATX 2.5 규격, NT 10.0 이상부터는 운영체제가 파워를 저전력 모드로 제어할 수도 있다. [4] 이때 등장하는 문구가 " 이제 컴퓨터를 끄셔도 좋습니다.(It's now safe to turn off your computer.)" [5] 부트로더가 winload.exe를 실행하고 winload.exe는 ntoskrnl.exe를 로드한다. [6] 멀티코어가 아닌 CPU 2개 이상을 사용하는 것이 멀티 프로세서다. 보통 가정용에서는 사용하지 않으며 서버에서 대량의 데이터 처리를 위해 사용한다. [7] 파일에 대한 디지털 서명 검증할 수 없음 [8] 그렇기때문에 SYSTEM권한을 취득하여 ntoskrnl.exe을 강제 일시중지시키면 블루스크린이 뜨지않고 화면이 멈춰버리며, 자동 재부팅도 되지않는다. [9] 즉 커널 모드 드라이버는 I/O 관리자에 의해 로드되고 언로드된다. [10] 참고로 Zw는 ntdll.dll (유저 모드)에서도 존재하지만 호출하면 Nt 함수로 호출된다. [11] ntdll.dll 함수들은 Windows.h에도 없다! [12] 객체를 만들 때 플래그에 OBJ_PERMANENT가 있을 경우 그 객체는 만들어질 때 참조 횟수가 1인 영구 객체가 된다. ZwMakeTemporaryObject 함수를 사용하여 영구 객체를 임시 객체로 바꿀 수 있다. [13] PCB (Process Control Block) [14] TCB (Thread Control Block) [15] 아키텍처마다 레지스터 구조가 다르다. x86의 경우 FS 레지스터에 x64(AMD64)의 경우 GS 레지스터에 TEB의 주소가 들어가 있다. [16] System32는 오랫동안 쓰인 폴더다보니 무작정 바꿨다가 호환성 문제가 일어날 수 있다. [17] 사실 Windows XP 64비트 에디션은 Windows Server 2003 x64의 커널을 갖다 썼다. 그래서 커널 버전이 Windows Server 2003와 동일하게 나온 이유도 이것 때문이다. [18] 이러한 이유로 64비트 Windows 사용자가 적었던 2000년대까지는 64비트 Windows를 지원하지 않는 백신 프로그램들이 많았다. [19] Windows NT 4.0에서 확인해보면 POSIX 서브 시스템인 psxss.exe와 OS/2 서브시스템인 os2.exe(OS/2 클라이언트), os2srv.exe(OS/2 서버)를 시스템 폴더에서 찾을 수 있다. [20] Windows Vista와 7도 얼티밋 에디션 또는 엔터프라이즈 에디션일 경우 제어판에서 SUA를 활성화할 수 있다. [21] Windows 7까지만 해당하며, Windows 8부터는 winlogon.exe에 의존한다. [22] 특히 인텔 HD 그래픽스 이전 시절의 인텔 GMA 내장그래픽들이 그랬다. 그래서 생긴 별명이 그래픽 감속기, 바탕 화면 표시기(…)이다. [23] 여기에 더해 마이크로소프트의 WHQL 인증까지 받아야 한다. [24] Windows Aero가 켜져있는 경우 제목 표시줄에만 Aero 테마가 적용되어 나온다. 스크롤 막대나 버튼, 대화 상자(제목 표시줄에 오른쪽 클릭 → 속성으로 들어가면 볼 수 있음) 등에는 고전 테마로 나온다. [2000] Windows 2000도 NT 5.0이라 포함된다 [26] 1.X, 2.X, 3.X는 MS-DOS 커널에 의존하고 있으며 Windows 95부터 MS-DOS를 부트로더 및 16비트 프로그램 호환성 계층으로 활용한다. [27] Windows Phone 이전 시리즈인 Windows Mobile는 Windows CE 커널을 사용하며 Windows Phone 7는 기존 CE 커널에 Windows Embedded Compact 7의 일부 요소를 혼합한 커널을 사용한다.