Windows boot process, MBR
- MBR 앞쪽 440Byte에는 bootstrapping program이 들어있고, OS-specific하다. ( Windows MBR laoder, LILO, GRUB... )
- MBR의 446~509( 64Byte )Byte에 Partition Table이 들어있고, bootstrapping program과 달리 표준화되어있다.
각 파티션은 16Byte를 사용하므로 기본적으로 4개의 파티션에 대한 정보를 나타낼 수 있다.
각 파티션 정보의 첫 번째 바이트는 해당 파티션이 부팅 가능한 파티션인지 나타낸다. ( 0x80이면 부팅 가능 0x00이면 불가능 )
드라이브 1
드라이브 1의 MBR code
드라이브 2
드라이브 2의 MBR code
파티션 테이블이 잘못되면 출력되는 Invalid Partition Table과 Missing Operating System 문자열을 확인할 수 있다.
드라이브 마다 MBR에 저장되는 code, error string 등이 다른것을 알 수 있다.
Windows boot process
BSP가 모든 BIOS, kernel initialization code를 수행한다.
나머지 프로세서들은 application processors (AP)라고 부르며 kernel에 의해 활성화 될 때 까지 halt상태다.
- 전기적 신호를 보내 PC를 초기화한다.
초기화 값은 보통 0xFFFFFFF0 ( Reset vector )로 이 곳에 BIOS entry point로 jmp하는 instruction이 있다.
그래서 BIOS code로 jmp하게 된다. - CPU는 BIOS code를 실행한다. 먼저 POST를 진행한다.
POST에서는 시스템 버스나 클럭 동기화, 그래픽 카드, 램 등을 테스트 및 초기화한다.
여기서 그래픽 카드가 제대로 동작하면 모니터에 이것저것 출력되기 시작한다.
POST가 끝나고 4로 넘어가기 전에 하드웨어에 따라 SCSI BIOS 등 추가적인 BIOS를 램에 적재하는 경우도 있다. - BIOS는 OS를 부팅하기 위해 boot device를 찾고, 운영체제 로드를 위한 기본적인 구성을 램에 적재한다.
- 운영체제를 로드하기 위해 드라이브의 첫 번째 섹터(MBR)를 읽는다.
MBR의 내용을 0x7c00에 적재하고 이 주소로 jmp해서 MBR의 앞 440Byte에 있던 코드를 실행한다.
별 다른 검사루틴 없이 실행하기 때문에 MBR 감염시 위험하다. - MBR code에 따라 Partition Table에서 부팅 가능한 파티션을 찾는다.
부팅하다 파티션 테이블이 잘못되면, Invalid Partition Table 또는 Missing Operating System과 같은 문구가 나타난다.
이 문구는 BIOS에 있는게 아니라 MBR에서 확인할 수 있다. 그래서 MBR에 따라 다른 문구가 나타난다. - 부팅 가능한 파티션을 발견하면 해당 파티션의 첫 번째 섹터(VBR)로 이동한다.
VBR(boot sector)은 파티션의 첫번째 섹터로 클러스터 크기, MFT 위치, 전체 섹터 등 해당 볼륨의 정보와
부팅에 필요한 시스템파일의 위치와 실행할 수 있는 코드가 포함되어 있다.
- VBR code에 따라 진행한다.
VBR의 첫번째 2Byte는 jmp instruction이다. (EB 52) VBR 내부의 code로 jmp한다.
Windows Vista 이전 OS boot process
- NT loader( ntldr )을 실행한다. Boot.ini도 읽는다.
- OS를 로드한다.
Windows Vista 이후 OS boot process
Windows Boot manager ( bootmgr )을 실행한다. BCD도 읽는다.
bootmgr은 boot menu를 보여주고, system-specific boot loader를 로드한 다음 boot parameter를 boot loader( winload.exe )에게 넘긴다.
winload는 parameter와 함께 boot process 흐름을 넘겨받아 OS를 로드한다.
Vista 부터는 BCD ( Boot Configuration Data )라는 새로운 부트로더 아키텍쳐를 사용한다. BCD는 firmware-independent boot configuration and storage system이다. BCDEdit ( BCDEdit.exe ) 라는 툴을 이용해 디버깅, 테스트, 트러블슈팅에 따른 부트옵션을 구성할 수 있다.
* 당연히 BCDEdit을 사용해 BCD를 수정할 때는 관리자권한이 필요하다. BCDEdit을 사용해서 부트옵션을 수정하는 것은 강력한 만큼 잘못 설정했을 경우 부팅이 안될 수 있다. 가벼운 설정은 msconfig를 사용하는게 좋다.
기존의 NT Loader는 다음의 3개 항목으로 대체됐다.
Windows Boot Manager ( Bootmgr.exe )
Windows operation system loader ( Winload.exe )
Windows resum loader ( Winresum.exe )
GRUB이나 LILO는 windows와 다르게 동작하므로 참고한다.
참고
http://forensic-proof.com/archives/178?ckattempt=1
https://msdn.microsoft.com/en-us/library/windows/hardware/ff542273(v=vs.85).aspx
http://social.technet.microsoft.com/wiki/contents/articles/11341.the-windows-7-boot-process-sbsl.aspx - OS load phase에 대한 상세
http://thestarman.pcministry.com/ - 어셈블리를 볼 수 있다
http://duartes.org/gustavo/blog/post/how-computers-boot-up/
'OS > Windows' 카테고리의 다른 글
[Windows] 공유 폴더 설정 (0) | 2016.11.01 |
---|---|
Windows Authentication [ SAM ] (0) | 2016.10.14 |
RDP를 활용한 Shadowing & Remote control (0) | 2016.09.30 |
DLL, DLL mapping과 API 주소 결정 방식 (0) | 2016.09.03 |
[Windows] Command & Conf file Path (0) | 2016.08.15 |