WINDOWS OS 부팅 과정

OS/Windows 2019. 10. 20. 17:56

* The Rootkit ARSENAL 서적의 내용 중 한 부분을 정리함.

 

 

 

Booting

 일반적으로 부팅은 Boot Manager 메모리 상에 로드되고 실행 되면서 시작된다. 좀 더 자세히 하면 메인보드에 설치되어 있는 펌웨어 타입에 따라 Boot Manager 의 실행까지 조금 차이가 있다. 다음은 펌웨어가 BIOS  EFI 타입 일 경우 어떻게 부팅과정이 달라지는지 설명한다.

 

 

 

1-1.  BIOS(Basic Input/Output System) 의 경우

 

1. POST (Power On Self Test)

 

 펌웨어가 BIOS 일 경우, 가장먼저 POST 동작을 수행한다. POST 는 현재 장착된 하드웨어를 점검하며 전반적인 Device 들의 상태를 확인한다. POST 의 좀더 자세한 설명은 링크를 참고한다.

 

용어설명

Wikipedia

 

 

2. MBR boot code

 

 다음으로 BIOS 는 부팅 섹터를 찾기 위해 부팅 가능한 디바이스 목록을 검색한다. 부팅 가능한 장치가 하드 드스크라면 이 장치의 부트 섹터를 MBR(Master Boot Record) 라고 부른다. (만약, 부팅 가능한 장치가 CD, Floppy 디스켓 등과 같이 하드 디스크가 아니라면 BIOS 는 장치의 VBR 을 메모리에 로드하여 실행시킨다.)

 

 MBR 은 기본적으로 MBR Boot code  파티션 테이블을 가지고 있다. MBR Boot code 가 실행되면서 파티션 테이블 중 활성화 파티션( = active partition, bootable partition, system volume) 즉, 부팅 가능한 파티션을 찾아 메모리에 로드한다. 이 부팅가능한 파티션을 VBR(Volume Boot Record) 이라고 한다.

 

 

3. VBR boot code, Boot Manager

 

 VBR 에도 VBR boot code 가 존재하며, VBR boot code 는 자신의 파티션에서 16bit  boot manager program (%SystemDrive%\bootmgr 위치에 존재을 찾는다. 이 16bit 의 bootmgr 은 32bit bootmgr 코드 앞에 붙어 있어, 사실상 두개의 실행파일이 연결되어 있다. 64bit Windows 의 경우, bootmgr 에 64bit 명령어가 포함된다.

 

 16bit 의 boot manager 는 Real Mode 에서 동작하며 데이터 구조체 초기화, Protected Mode 로의 전환 을 수행한 뒤 Protected mode 에서 동작하는 boot manager program(32bit) 을 메모리에 로드 시킨다.

 

 

- BIOS 부팅, 동작 흐름

 

 펌웨어가 BIOS 일 경우 수행하는 동작 흐름은 아래와 같다.

 

BIOS 에서 Bootmgr 까지

 

 

 

1-2.  EFI(Extensible Firmware Interface) 의 경우

 

1. POST (Power On Self Test)

 

 펌웨어가 EFI 일 경우 역시 가장 먼저 POST 동작을 수행한다. 

 

 

2. Boot code, Boot Manager(bootmgfw.efi)

 

 EFI 방식에서의 Boot code 는 MBR 이나 VBR 에 존재하지 않고, 펌웨어 안에 존재한다. 펌웨어 안에 존재하는 Boot code 는 %SystemDrive%\EFI\Microsoft\Boot\Bootmgfw.eif 에 존재하는 EFI 실행 프로그램을 구동시킨다.

 

 

- EFI 부팅, 동작 흐름

 

 펌웨어가 EFI 일 경우 수행하는 동작 흐름은 아래와 같다.

 

EFI 에서 Bootmgfw 까지

 

 

 

2.  Boot Manager (부팅 관리자)

 

 EFI 방식이나 BIOS 방식 둘다 최종적으로 Boot Manager(bootmgr) 를 메모리에 로드하여 실행시킨다. Boot Manager 는 BCD(Boot Configuration Data) 설정 데이터를 읽어 시스템을 시작한다(BCD 는 레지스트리 하이브 파일로 존재). 최종적으로 Windows Boot Loader  winload.exe 를 로드하고 실행한다.

 

 

- BCD(Boot Configuration Data)

 

 BCD 하이브 데이터는 "HKLM\BCD00000000" 레지스트리 경로에 존재한다. 일반적으로 BCD 파일을 조작하기 위해 bcdeidt.exe 를 사용한다. 또한 BCD 는 다음과 같은 최소한 2개 이상의 요소를 포함하고 있다.

 

      • 하나의 Windows Boot Manager Object
      • 하나 이상의 Windows Boot Loader Object

 

- Boot Manager Object

 

 BCD 가 포함하고 있는 Boot Manager Object 는 문자 셋 기반의 BOOT MANAGER 화면의 모든 설정 값을 가진다. 예를 들면, OS 의 개수, 부팅 도구 메뉴, 기본 타입 아웃 값 등이 이에 해당한다. 

 

 Boot Manager Object 는 {9DEA862C-5CDD-4E70-ACC1-F32B344D4795} 레지스트리에 정의 되어 있으며, bcdedit.exe 실행 시 {bootmgr} 이라는 이름으로 볼 수 있다.

 

 

- Boot Loader Object

 

 Boot Loader Object 는 OS 별로 가지고 있는 부팅 설정 값을 나타낸다. 만약, 현재 PC 가 한개의 Boot Loader Object 를 가지고 있다면, Boot Manager 화면은 표시되지 않는다.

 

bcdedit.exe 실행시 보여지는 Boot Manager Object 와 Boot Loader Object 값

 

 

 

3.  Windows Boot Loader (윈도우즈 부트 로더)

 

 구동 시킬 운영체제가 선택 된 후 Boot Manager 는 선택된 운영체제의 Boot Loader Object 가 가리키고 있는 위치의 Windows Boot Loader 를 로드하고 실행 시킨다. (winload.exe 를 말하며 일반적으로 %SystemRoot%\System32 경로에 존재)

 

 

- Winload.exe

 

 이전 버전의 Windows 에서는 NTLDR(NT Loader) 이 winload.exe 와 같은 역할을 수행했다. 아래에서 winload.exe 가 로드 되고 난 뒤 수행하는 동작들에 대해 알아본다.

 

 

1. SYSTEM 레지스트리 로딩

 

HKLM\SYSTEM 레지스트리를 로딩한다. SYSTEM 레지스트리 하이브 파일은 %SystemRoot%\System32\config 경로에 존재한다.

 

 

2. Self 무결성 검사

 

 winload.exe 는 현재 로드 되어 있는 자신의 이미지에 대한 무결성 검증을 수행한다. 현재 로딩 되어 있는 winload.exe 의 서명과 카테고리 파일 nt5.cat 에 존재하는 서명을 비교하여 무결성 검증을 수행한다. 

 

 이 무결성 검사에 실패하면, winload.exe 는 종료(HALT) 된다. 예외적으로, kernel-mode 디버깅 중일 때는 경고 메시지만 출력한다.

 

 

3. ntoskrnl.exe, hal.dll 로드

 

 무결성 검사가 끝난 winload.exe 는 ntoskrnl.exe  hal.dll 을 메모리에 로드한다. 이때, 커널 디버깅 기능이 활성화 되어 있다면 아래와 같은 kernel-mode 드라이버도 같이 로드한다. 

 

      • kdcom.dll (null modem cable)
      • kd1374.dll (IEEE1394 cable)
      • kdusb.dll (USB 2.0 Debug cable)

 

 

 ntoskrnl.exe 는 자신이 import 하고 있는 DLL 에 대해 무결성 검사(nt5.cat 과 비교)를 마친뒤 문제가 없다면, 아래의 순서와 같이 DLL 을 로드한다.

 

1.  pshed.dll

2.  bootvid.dll

3.  clfs.sys

4.  ci.dll

 

 

4. Boot Class Service 로드

 

 winload.exe 는 HKLM\SYSTEM\CurrentControlSet\Services 에 존재하는 모든 값을 조회하여 boot class 카테고리에 해당하는 서비스 드라이버를 로드한다. 레지스트리 하위 키 중 Start 값이 0x00000000(SERVICES_BOOT_START) 인지 참조하여 boot class 드라이버인지 확인 할 수 있다.

 

  

 만약 무결성 검사 옵션이 활성화 되어 있다면, winload.exe 는 nt5.cat 파일과 로드 되는 드라이버들의 서명을 비교한다. 도중에 무결성 검사가 실패하면, winload.exe 는 종료(HALT) 된다. 예외적으로, kernel-mode 디버깅 중일 때는 경고 메시지만 출력하지만, 아래의 목록에 존재하는 파일에 대한 무결성 검증이 실패하면 kernel-mode 디버깅 중일 때에도 winload.exe 는 종료된다.

 

      • bootvid.dll
      • ci.dll
      • clfs.sys
      • hal.dll
      • kdcom.dll
      • kd1394.sys
      • kdusb.dll
      • ntoskrnel.exe
      • pshed.dll
      • winload.exe
      • ksecdd.sys
      • spldr.sys
      • tpm.sys

 

 

5. Protected Mode 전환 준비 및 ntoskrnl.exe 실행

 

최종적으로 winload.exe 는 protected mode 의 페이징을 활성화하고, boot log 를 저장 한 뒤, ntoskrnl.exe 로 실행을 넘겨 준다.

(!! "bcdedit.exe /set BOOTLOG TRUE" 옵션을 설정하여 생성되는 Ntbtlog.txt 를 통해 로드 되는 이미지들에 대한 자세한 로그를 확인 할 수도 있다.)

 

 

- winload.exe 동작 흐름 정리

 

winload.exe 에서 수행하는 동작 흐름을 간략하게 도식화 하면 다음과 같다.

 

 

 

 

4.  ntoskrnl.exe 실행 (Executive 동작)

 

ntoskrnl.exe 는 실제로 광범위한 동작을 수행하며, 각종 초기화와 설정을 시작한다. 예를 들어, 메모리 관리자가 페이지 테이블을 생성하고, 인터럽트 컨트롤러를 설정하며, SSDT 가 생성되는 등의 동작이 수행된다. 아래에서는 ntoskrnl.exe 가 수행하는 몇가지 동작에 대해서만 기술한다.

 

 

- System Class Service 로드

 

winload.exe 에서 수행한 것과 같이 HKLM\SYSTEM\CurrentControlSet\Services 에서 Start 키 값이 0x00000001(SERVICE_SYSTEM_START) 인 것과 Type 키 값이 0x00000001(SERVICE_KERNEL_DRIVER) 또는 0x00000002(SERVICE_FILE_SYSTEM_DRIVER) 인 것에 대해서 서비스를 로드 한다. 로드하는 드라이버에 대해서 무결성 검증이 실패하면, 드라이버는 로드 되지 않는다.

 

 

- smss.exe 로드 및 실행

 

smss.exe 를 초기화 하고 실행한다.

 

 

 

5.  smss.exe 실행

 

 

 

 

6-1.  wininit.exe 실행

 

 

 

 

6-2.  winlogon.exe 실행

 

 

 

 

 

 

 

 

 

 


Last update ::

- 2017.04.17

- 2018.03.19 (이전 글 수정 및 내용 추가)

 

Keywords ::

- Windows

- Booting

- EFI

- BIOS

- boot manager

- bootmgr

- winload.exe

- ntoskrnl.exe

- 윈도우 부팅 과정

 

References ::

- The Rootkit ASRNEL

- http://cappleblog.co.kr

 

'OS > Windows' 카테고리의 다른 글

NTLM(NT LAN Manager) 인증 프로토콜  (1) 2019.10.20
블로그 이미지

Elfmfl

,