Windows 실시간 커널 디버깅 – Windbg

실시간 커널 디버깅을 위해서는 별도의 머신이 필요하다.

이를 물리적으로 구성하는것도 좋지만, 설정 및 관리가 쉽지 않아, 대체로 요즘 많이 사용되는 가상화 머신을 이용하여 구성 하는 경우가 많다.

그럼 먼저 용어에 대해 알아보자.

실시간 커널 디버깅은 운영체제에 문제가 발생하였을 때 문제가 되는 머신(TARGET)을 디버깅 모드로 설정후 COM포트를 이용하여 HOST와 연결, 분석을 실시간으로 진행하는데, 그 머신에 대한 구분을 디버거(debugger)와 디버기(debuggee)를 사용하고 있다. (머신이 아닌 분석을 당하는 주체를 디버기, 분석을 행하는 주체를 디버거라고 생각하기 바란다.)

여기서는 디버깅 당하는 가상머신이 디버기가 되며, 디버깅을 행하는 호스트 머신이 디버거라 할 수 있다.

 

[그림] 디버거와 디비기 연결

 

이러한 가상 환경 구성은 실제 분석가들도 많이 사용한다. 더욱이 최근에 급속히 발전한 가상화 기술은 이를 더욱 편리 하게 하였는데, 여기서도 실시간 커널 디버깅 테스트를 위해 디버거를 호스트 운영체제를 사용하고, 디버기 머신을 가상화로 만든 머신을 이용할 것이다. 가상화 머신으로는 VMware가 많이 사용되나, 유료인 관계로 여기서는 Oracle사의 무료 소프트웨어인 VirtualBox를 사용할 예정이다.

 

[그림]Ocracle사에서 제공하는 무료 가상화 머신 VirtualBox

 

원격 커널 디버깅을 진행하기 위해서 먼저 디버기의 boot.ini를 변경하여 디버깅 모드로 부팅모드를 바꿔야 한다.

부팅 드라이브의 boot.ini를 열어, 부팅 설정을 사전에 설정된 운영체제 선택 리스트 하나를 복사하여 아래와 같이 수정해 주자.

(boot.ini파일은 시스템 파일로 일반 설정으로는 확인되지 않는다. 변경을 위해서는 관리자 권한을 요구 할 수 있다.)

 

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Microsoft Windows XP Professional(vb_com)” /fastdetect /debug /debugport=COM1 /baudrate=115200

[내용] 실시간 커널 디버깅을 위해 boot.ini에 부팅 모드를 추가

 

아래 그림의 색칠한 라인이, 커널 디버깅을 위해 새로 복사하여 생성한 라인이다.

 

[그림] 메모장으로 확인한 boot.ini에 추가된 부팅 모드

 

위와 같이 설정후 디버기를 재시작하면 아래와 같은 부팅항목이 추가된 것을 확인 할 수 있다.

 

[그림]새로 추가된 실시간 디버깅 가능한 부팅 모드

 

이외에도 boot.ini파일에서 사용가능은 옵션은 다양하다. 각 옵션별 의미는 다음과 같다.

 

/3GB 32비트 운영체제에서 사용할 수 있는 옵션으로 유저모드 공간을 기본 2GB에서 3GB로 확장시키는 명령이다. 주요 고용량의 메모리를 사용하는 응용서버에서 사용되며, 이 명령을 사용할 경우 커널 메모리 공간이 축소 되게 된다.

 

/BASEVIDEO 기본 VGA 드라이버를 로드하도록한다. VGA 드라이버 오류시 사용한다..

 

/BAUDRATE= 커널 디버깅 활성화시 시리얼 연결 속도를 지정한다. 예: /BAUDRATE=115200.

 

/BOOTLOG 부팅과 관련된 로그를 저장하도록 한다. 생성위치 %SystemRoot%\Ntbtlog.txt.

 

/BOOTLOGO 부팅시 윈도우 로그화면을 표시하도록 한다. /noguiboot 옵션으로 표시하지 않을 수 도 있다.

 

/BREAK 커널 디버깅 모드에서 hardware abstraction layer (HAL) 초기화 시 시스템을 일시 중지한다. . 만약 /DEBUG와 함께 사용하지 않으면, 0x00000078 (PHASE0_ EXCEPTION). 오류와 함께, BSOD 된다.

 

/BURNMEMORY= 지정한 만큼 운영체제에서 메모리를 사용하지 않는다.

예: /BURNMEMORY=128 윈도우에서 128MB만큼 메모리를 사용하지 않는다.

 

/CHANNEL= /DEBUGPORT=1394 즉 IEEE1394 포트를 이용할 때 사용할 채널을 지정한다. 0-62까지 지정할 수 있으며 기본값은 0이다.

 

/CLKLVL 기본 x86 멀티프로세서 HAL(Halmps.dll)이 level-sensitive 시스템 클럭을 스스로 설정하게 한다.

 

/CMDCONS 복구 콘솔로 부팅하는 경우에 사용

 

/CRASHDEBUG 커널 디버거가 시스템 부트시에 로드하지만, 크래시(Crash)가 일어나지 전에는 커널 디버깅을 비활성화 한다.

 

/DEBUG 커널 모드 디버깅을 활성화 한다.

 

/DEBUGPORT= 커널 디버킹 모드 활성화 시 사용할 포트를 지정한다. COM포트외 IEEE1394포트도 사용가능하다.. 예: /DEBUGPORT=COM2, /DEBUGPORT=1394.

 

/EXECUTE DEP를 비활성화 한다.

 

/FASTDETECT Windows의 기본 부트옵션으로, NTDETECT가 직렬/병렬 시리얼 장치 열거를 하지 않는다. 옵션을 제거하면, NTDETECT가 직렬/병렬 시리얼 장치를 열거하는데, 윈도우 NT 4 부팅에 필요하다.

 

/KERNEL=/HAL= (하드웨어 추상화 계층)HAL과 커널을 직접 정의할 수 있다. 파일명을 통해 지정하는 방식이며, 두가지옵션을 함께 사용하여야 한다.

*예)커널과 HAL 검사

/KERNEL=NTOSCHK.EXE /HAL= HALCHK.DLL

 

/LASTKNOWNGOOD 레지스트리에 마지막으로 부팅에 성공한 구성을 별도로 저장하는데, 해당 내용을 통해 윈도우 시작을 시도하도록 한다.

[그림] 레지스트리에 지정된 마지막 성공한 구성 정보

 

/MAXMEM= 최대 사용할 물리메모리량을 지정한다.

 

/NODEBUG 커널 디버깅 설정을 해제한다.

 

/NOEXECUTE= 데이터 실행 방지를 소프트웨어적으로 가능하도록 사용 가능하며, 4종류의 정책 설정이 가능하다.

OPTIN 기본 설정으로, Windows 시스템 바이너리만 DEP를 통해 보호한다.

OPTOUT 본적으로 DEP는 모든 프로세스에 대해 사용할 수 있도록 설정한다.제어판에서 조절.

ALWAYSON 데이터 실행 방지 기능을 활성화 한다.

ALWAYSOFF 데이터 실행 방지 기능을 비활성화 한다

[그림] 내컴퓨터의 속성에서 DEP를 설정할 수 있다

 

/NOGUIBOOT 부팅중 윈도우 로그를 표시하지 않고 부팅과 관련된 시스템 정보를 표시한다.

 

/NOPAE 강제로 PAE 메모리 옵션을 사용하지 않는다.

 

/NOSERIALMICE=[COMx | COMx,y,z…] 지정된 COM 포트의 직렬 마우스 검출을 하지 않는다 ..

 

/NUMPROC= 사용할 CPU 개수를 지정한다. 예: /NUMPROC=2 2개의 CPU만 사용.

 

/ONECPU 운영체제에게 물리적 CPU 하나만 사용하도록 한다.

 

/PAE PAE옵션을 사용한다.

 

/PCILOCK HAL에 의해 임의로 할당되는 IO/IRQ를 BIOS 설정대로 고정한다.

 

/RDPATH= System Disk Image (SDI) 파일을 지정할 수 있다. Winnt.sif 파일에서 사용하는 기능으로, 윈도우PE에서 주로 사용되는 옵션으로 네트워크 부팅에서도 사용된다. /RDIMAGEOFFSET= 를 추가해 NTLDR의 위치를 지정할 수 있다.

*Winnt.sif 내용

[SetupData]
BootDevice = “ramdisk(0)”
BootPath = “\I386\SYSTEM32\”
OsLoadOptions = “/noguiboot /fastdetect /minint /rdexportascd /rdpath=winpe.iso”

 

/REDIRECT EMS(응급 관리 서비스)를 설정 활성화 하는 옵션으로, 응급 관리 서비스는 부팅정보와 시스템을 관리할 수 있는 명령창을 제공하게 되는데, 해당 서비스를 사용할 COM포트를 지정하게 된다. Redirectbaudrate=를 통해 대역폭을 설정할 수 있다..

 

/SAFEBOOT: 안전모드로 부팅할 수 있다. 안전모드는 다음과 같이 4가지 모드를 지원한다.

Minimal :안전모드

Network :안전모드(네트워크 사용가능)

Minimal(alternateshell) :안전모드(명령 프롬프트 사용)

Disrepair :디렉토리 서비스 복원 모드 사용

 

/SOS 위치는 장치 드라이버를 로드하는 동안 해당 장치 드라이버의 이름을 표시하여 윈도우 로더 화면에서 문제를 일으키는 드라이버를 확인하는 용도로 사용하기 위해서는 /BASEVIDEO와 함께 사용한다.

 

/USERVA= /3GB 옵션과 비슷한 용도로 사용되는데, 유저모드 공간이 2GB이상 필요하지만, 3GB를 사용할 경우 운영체제에 문제가 발생할 때, 2048MB에서3072MB 사이의 값을 직접 할당하여, 운영체제에 필요한 유저공간을 조절할 수 있다.

 

*비스타의 경우 boot.ini를 제공하지 않고, Bcdedit.exe라는 부팅 관리자를 통해서 설정을 변경할 수 있다.

[그림]비스타부터 부팅옵션은 Bcdedit.exe로 설정하여야 한다.

Bcdedit.exe를 이용하여 시리얼 COM1포트로 디버깅 모드를 활성화 한다면 다음과 같이 진행할 수 있다.

bcdedit /debug on

bcdedit /dbgsettings serial debugport:1

[내용]Boot.ini에서 사용가능한 옵션

 

이제 앞서 진행하였던 디버거에 Windbg를 설치하고 심볼경로를 설정하여야 한다.

Windbg 설치 및 심볼 설정 부분은 앞에 자세히 애기하였으니, 앞 부분을 확인해 설정하기 바라며, 커널 디버깅 연결을 위해 먼저 가상 머신인 디버기의 직렬 포트 설정을 아래 그림과 같이 파이프 연결을 만든후, 가상 머신을 실행하자.

 

[그림] 디버거 연결을 위한 Virtual Box 직렬 포트 설정

 

가상 머신 실행 이후 디버거에 Windbg를 실행하고, File에 Kernel Debug연결을 선택한 후 앞서 boot.ini에 설정한 Baudrate값과 가상 머신에 설정한 파이프 값 \\.\pipe\vb_com를 입력한후 Pipe 선택상자를 체크하고 확인을 누르면, 디버기 연결을 대기하게 된다.

 

[그림] 디버거(호스트머신)에서 실행한 Windbg COM포트 연결

 

이후 디버기에서 디버깅 모드로 부팅을 시작하면 디버거의 디비거가 연결이 진행되면서, 커널 디버깅 준비가 완료 되게 된다.

 

[그림] 디버거(호스트머신)에서 실행한 Windbg COM포트 연결 대기 상태

 

만약 Windbg를 이용하지 않고, 명령 프롬프트 기반의 KD.exe를 이용할 경우 아래와 같은 내용을 Batch 파일로 만들어 두면 편리하게 커널 디버깅을 연결할수 있다.

 

SET _NT_SYMBOL_PATH=c:\symbols

SET _NT_ALT_SYMBOL_PATH=c:\symbols

SET _NT_DEBUG_PORT=\\.\pipe\vb_com

SET _NT_DEBUG_BAUD_RATE=115200

SET _NT_LOG_FILE_OPEN=c:\debugger\debug.log

 

c:\debugger\kd.exe -v -n

[내용]kd.exe를 이용한 원격 커널 디버깅 연결

 

이렇게 커널 디버깅이 연결되고 나면, Ctrl+Braek키를 통해 언제든지 디버기의 운영체제를 일시 중지하고 분석을 진행 할 수 있게 된다.(다시 디버기를 실행하기 위해서는 g 명령을 입력하면 된다.) 일시 중지를 하게 되면, 아래와 같은 메시지가 나오면서 일시 중지가 되었음을 디버거 분석자에게 알린다.

 

[그림] 커널 디버깅을 위해 일시 중지시 Windbg에 나타나는 알림 메시지

 

이렇게 커널 디버깅 연결하게 되면 Windbg를 이용하여 실시간 커널 디버깅을 진행할 준비가 완료 된 것이다.

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.