http://forensic-proof.com/archives/178



    윈도우 부팅 절차 (Windows Boot Process)



    지금에서야 컴퓨터포렌식이 아닌 모든 디지털기기를 다룬다는 의미의 디지털포렌식이라는 용어를 사용하지만 시작은 컴퓨터 시스템(데스크탑 or 서버 등)이었다. 따라서 디지털포렌식에서 컴퓨터의 기본을 이해하는 것은 매우 중요하다. 흔히 내공이라 불리는 기본 지식과 상식들은 진정 자신의 가치를 대변해주곤 하기 때문이다.

    윈도우 운영체제에서 컴퓨터를 부팅시키기 위해 전원 버튼을 누르고 나면 간단한 하드웨어 체크 후에 윈도우 로그온 화면으로 넘어간다. 흔히들 골뱅이라 불리우는 진행바가 몇번 왔다갔다 한 후 윈도우 운영체제의 쉘인 explorer.exe 가 실행되어 바탕화면이 보이게 된다. 언듯 보기에는 간단해 보이지만 내부적으로는 더 많은 과정을 거치게 되는데 지금부터 그 과정에 대해서 알아보자.

    1. 처음 전원버튼을 누르게 되면 Power Supply는 외부로부터 들어온 전압을 검사하여 현재 시스템에서 사용할 수 있는 전압으로 변환한다. 변환된 전기적 흐름은 CPU로 전달되어 CPU가 가지고 있는 이전의 값들을 지우고 CPU 레지스터인 Program Counter(PC)를 초기화시킨다. 초기화되는 값은 보통 0xF000 값을 가지는데 이 값은 메인보드에 위치한 ROM BIOS의 부트 프로그램(boot program or bootstrap)의 주소 값을 가르킨다. 따라서 이후에는 부트 프로그램에 정의한 작업이 수행된다.
    2. 부트 프로그램은 먼저 CPU 이상 유무를 테스트한 후 POST(Power On Self-Test) 작업을 수행하기 위한 기본적인 테스트를 수행한다. 만약 테스트 결과가 ROM BIOS에 저장된 값과 일치하면 POST 작업을 수행한다.
    3. POST의 첫 번째 단계으로 CPU는 System Bus가 정상적으로 동작하는지 테스트하기 위해 System Bus로 특정 시그널을 보낸다. 테스트가 이상이 없다면 다음 단계로 넘어간다.
    4. 다음 단계로 RTC(Real-Time Clock; or system clock)을 테스트한다. RTC는 시스템의 전기적 신호를 동기화하기 위한 클럭으로 CMOS를 구성하는 장치에 칩 형태로 존재한다. RTC 테스트가 이상이 없다면 다음 단계로 넘어간다.
    5. 다음 단계로 시스템의 비디오 구성요소들(비디오 메모리 등)을 테스트한다. 이 과정이 완료된 후에야 비로소 표준출력을 이용해 부팅과정에서 정의된 출력을 볼 수 있다.
    6. 다음 단계로 RAM을 테스트한다. RAM을 테스트 하는 장면은 컴퓨터 부팅 과정에서 모니터 화면을 유심히 본 사람이라면 누구나 한번 쯤 보았을 것이다. 현재 RAM에는 ROM BIOS와 비디오 BIOS에서 읽어들인 데이터가 존재할 것이다. 따라서 해당 데이터가 정상적인지 테스트를 하게 된다.
    7. 다음 단계로 키보드가 정상적으로 연결되어 있는지 혹은 눌려진 키가 없는지 테스트 한 후 이상이 없으면 다음 과정으로 넘어간다. 부팅 과정에서 키보드의 키가 눌려져 있는 경우 삐익~!@ 하는 연속적인 비프음 소리를 들어본 경험이 있을 것이다. 또한 POST 과정에 키보드에 대한 테스트 과정이 포함되기 때문에 키보드가 연결되지 않은 시스템은 POST 과정을 완료하지 못하고 부팅되지 않는 것을 경험해 봤을 것이다.
    8. 다음 단계로 시스템에 연결된 모든 드라이브(플로피, CD, 하드디스크 등)에 신호를 보내 정상적으로 동작하는지를 테스트한다.
    9. 다음 단계로 앞서 수행한 POST의 결과가 CMOS(RTC/NVRAM)에 저장된 값과 일치하는지 검사한다.
    10. 다음 단계로 SCSI BIOS와 같은 추가적인 BIOS를 RAM에 로드하고 Plug and Play를 실행하여 운영체제 로드를 위한 기본적인 구성을 RAM에 로드한다.
    11. 다음 단계로 부트 프로그램은 운영체제를 로드하기 위해 인식한 드라이브 내에서 첫 번째 섹터를 읽는다. 드라이브의 첫 번째 섹터에는 MBR(Master Boot Record)이 위치한다. MBR 섹터의 마지막 2바이트는 정상적인 MBR을 알려주는 시그니처 “0x55AA” 값을 가진다. MBR의 앞부분 446 바이트의 16비트 부트 코드를 수행하다가 오류가 발생하면 적절한오류메시지를 출력한다.

    다음의 그림은 MBR의 내용을 확인한 것이다. “Invalid partitons table.”,  “Error loading operationg system.”, “Missing operating system” 와 같은 오류메시지를 확인할 수 있다.

     

    1. 다음 단계로 MBR에서 부팅 가능한 파티션을 찾는 작업을 수행한다. MBR의 오프셋(offset) 446~509까지 64바이트가 파티션의 정보를 나타내는데 각 파티션은 16바이트를 사용한다. 따라서 기본적으로 4개의 파티션에 대한 정보 저장이 가능하다. 각 파티션의 첫 번째 바이트는 부팅 가능한 파티션인지를 나타낸다. 값이 0×80을 가지면 부팅 가능하고 0×00이면 부팅 가능한 파티션이 아니다. 만약 파티션이 부팅 가능하다면 해당 파티션의 시작 위치로 이동한다. 이동하게 되면 MBR과 유사한 형태의 첫 번째 섹터가 나온다. 이 섹터를 VBR(Volume Boot Record)라고 한다. 이때 부터는 운영체제에서 정의된 부팅 과정이 수행된다. 앞서 파티션이라고 언급했는데 볼륨 부트 레코드라고 하는 것에 다소 오해가 있을지 모르겠지만 일반적으로 볼륨 당 하나의 운영체제의 부팅이 가능하기 때문에 VBR이라고 한다. 이해가 가지 않는다면 볼륨과 파티션의 관계를 다시 한번 확인해보기 바란다.

    지금부터는 Windows NT/2000/XP 에서의 부팅 과정에 대한 내용이다.

    1. VBR에 클러스터크기, MFT 위치, 전체 섹터 등 해당 볼륨의 추가적인 정보 외에도 부팅에 필요한 시스템 파일의 위치와 실행할 수 있는 코드가 포함되어 있다. 이러한 코드는 NT Loader(NTLDR)에 의해 로드되어 실행된다. 먼저 NTLDR은 부팅 옵션 및 부팅 메뉴가 정의되어 있는 BOOT.INI 파일을 로드한다. 이후 윈도우 이외의 다른 운영체제와 듀얼 부팅을 한다면 BOOTSEC.DOC 파일을 로드한다. 또한 SCSI 드라이브가 장착되어 있다면 해당 드라이브 실행을 위한 NTBOOTDD.SYS 파일을 로드한다.

    1. 이후 NTLDR은 NTDETECT.COM을 로드하여 설치된 하드웨어와 관련 구성 파일들을 찾아 실행하도록 한다.
    2. NTDETECT에 의해 수행된 결과는 NTOSKRNL.EXE(NT OS KERNEL)에 적용된다. 이후 NTOSKRNL.EXE은 커널(Kernel), HAL(Hardware Abstraction Layer), 시스템 레지스트리 정보를 로드한다.
    3. 다음으로 TCP/IP와 관련된 네트워크 드라이버들을 로드하고 로그온 화면을 보여준다. 사용자가 로그인에 성공하면 사용자에 대한 레지스트리 정보를 가져와 사용자 환경을 구성한다.
    4. 로그인 과정에서 Plug and Play에 의해 새로운 장치가 발견된다면 DRIVER.CAB 파일에서 관련 드라이버를 로드하여 해당 장치를 마운트 시킨다. 관련 드라이버가 없다면 드라이버 설정하는 다이얼로그를 보여주게 된다.
    5. 이러한 과정이 지나면 윈도우의 쉘인 explore.exe 가 실행된 화면을 보게 된다.

     

    12단계 까지의 부팅 순서는 동일하지만 12단계 이후부터는 윈도우 운영체제에서도 각 버전에 따라 많은 차이를 보인다.

    Posted by beumbae