뭉근 : 느긋하게 타는 불

윈도우 8이 새로이 출시되면서 윈도우 8의 커널을 분석해야 되는 분들이 있을거라 생각한다. 따라서 이번 포스트에서는 Vmware로 윈도우 8을 동작 중인 가상 머신에 Windbg를 사용하여 리모트 커널 디버깅을 설정하는 방법을 설명한다.

   

소개

윈도우 8이 공개되고 이에 맞는 WDK 8이 공개되었으며 이 WDK 8에 윈도우 8을 디버깅하기 위한 새 버전의 WinDbg 또한 포함되어 있다. 구버전의 WinDbg를 사용할 경우 디버깅 연결은 되지만 윈도우 8 디버깅 방법을 모르기 때문에 명령어 실행 단계에서 에러가 발생한다. 따라서 새 버전(Windbg:6.3.9600.*)의 WinDbg를 설치해야 하며, 나머지 부분은 윈도우 7 때와과 동일하다.

   

WinDbg 설치

WinDbg의 새 버전은 MSDN 공식 사이트에서 다운로드 할 수 있다. 이 사이트는 WinDbg를 새로 설치하기 위해 두 가지 방법을 제공하는데 첫번째로 WDK 8.1을 설치하여 그 중에 포함되어 있는 Windbg를 사용하는 방법과 Standalone형으로 나온 WinDbg를 사용하는 방법이 있다. 전자의 경우 아래 그림에 나와있듯이 Visual Studio 2013이 미리 설치되어 있어야 한다.

   

   

후자인 Standalone 형의 경우 설치만 하면 된다.

   

   

WinDbg를 설치 후 실행하여 반드시 버전을 확인한다.

  • Windbg:6.3.9600.*

   

이전에 설치했던 WinDbg의 경우 버전 호환성을 위해 그대로 남아있는 것 같으므로

반드시 설치 폴더에 들어가서 실행해 보아야 한다.

WDK 8.1 설치 경로는 다음과 같다.

   

  • C:\Program Files (x86)\Windows Kits\8.1\bin\x86
  • C:\Program Files (x86)\Windows Kits\8.1\bin\x64

   

Vmware 세팅

가상 머신을 리모트 디버깅하기 위해 윈도우 7에서 했던 방식과 달라진 점은 없지만 한번 더 짚고 넘어가기로 한다.

윈도우 8을 설치한 가상 머신에서 아래 작업을 순서대로 수행한다.

   

  • 실행(Ctrl +D) - msconfig 실행
  • 부팅 탭에서 고급 옵션 선택
  • 디버그 모드 체크

   

   

위 작업은 윈도우 8.1에서 디버깅을 가능하게 한 것이고 외부에서 디버깅을 위해 접근하려면 COM1 포트를 사용해야 한다는 설정해주는 것이다.

(* 이 작업은 bcdedit을 이용하여 디버깅용 부팅 옵션을 따로 만들 수도 있다.)

   

본래 COM1, COM2 포트 등은 컴퓨터의 본체에 다른 컴퓨터와 연결하기 위하여 존재하는 것이지만 가상 머신의 경우 실제 포트가 존재하지 않으므로 이름있는 파이프를 활용하여 가상머신을 실행 중인 호스트 PC와 연결해준다.

   

  • 윈도우 8 가상 머신 종료
  • Vmware 가상 머신 옵션
  • Hardware 탭에서 Add 버튼 클릭
  • Serial Port를 추가

 

   

뒤에서도 한번 더 말하겠지만 호스트 PC에 프린터가 잡혀있다면 Vmware가 이를 인식하여 가상 머신과 연동하기 위해 COM1 포트를 프린터 포트로 사용한다. 따라서 부팅 옵션에서 COM1 포트를 사용할 것이지 COM2 포트를 사용할 것인지 잘 정해야 한다.

   

  • Next 후 Output to named pipe 선택

   

   

  • 파이프의 이름을 정한다. 여기서는 com_8_64로 하였다.

   

   

Finish를 하면 새로운 포트가 추가되는데 앞서 말했듯이 Printer가 잡혀있다면 Serial Port 2로 생성이 된다. 물론 Printer가 잡혀있지 않다면 Serial Port 1으로 생성이되며, 이후 Windbg를 실행하여 리모트 커널 디버깅을 진행하면 된다. Serial Port 2일 경우 이를 해결하기 위한 방법으로 두 가지가 있는데 첫번째는 Printer 하드웨어를 제거하고 다시 시리얼 포트를 추가하는 방법이며 두번째는 부팅 옵션의 디버깅용 포트를 변경하는 방법이 있다.

   

   

여기선 가상 머신에서 프린터를 사용할 때를 대비하여 부팅 옵션의 디버깅용 포트를 변경하기로 한다.

   

  • 다시 윈도우 8 가상머신을 키고 부팅 옵션에서 COM2 로 설정해준다.

   

   

* 프린터가 Serial Port 1을 사용하고 있다는 내용은 이 블로그를 통해 알게 되었다.

   

이후 가상 머신을 다시 재부팅한다.

   

Windbg 커널 디버거 연결

앞에서 Vmware의 가상 머신이 리모트 디버깅을 받아들 일 수 있도록 하는 설정을 마쳤다. 이제 남은 일은 Windbg를 실행하여 리모트 커널 디버거를 가상 머신과 연결하는 것이다.

   

  • File - Kernel Debug - Com 탭 에서 아래와 같이 설정해준다.

   

   

포트는 아까 이름있는 파이프의 이름을 설정한 걸 사용하면 된다.(\\.\pipe\com_8_64)

   

*다른 블로그에서 볼 수 있는 단축 아이콘의 실행 인자 정보를 변경하여 실행하는 것이 위와 같은 과정이다.

   

OK를 누르면 아래와 같이 창이 뜨는데

   

   

계속 멈춰 있으면 한번 Ctrl + Break 를 눌러보면 연결이 된다.

(이 문제는 윈도우7 디버깅할 때도 있었는데 무슨 문제인가 싶다.)

   

이후 심볼 설정을 해주면 되는데

Windbg 메뉴에서 File - Symbol File Path에 아래와 같이 입력한다.

SRV*d:\websymbol*http://msdl.microsoft.com/download/symbols;

   

   

"d:\websymbol"은 심볼을 넣을 폴더 경로로 디버깅하다가 필요한 심볼 정보가 있으면 마이크로소프트사에서 제공하는 디버깅 데이터 서버를 통해 다운받을 폴더이다. 반드시 사용 전에 폴더를 미리 만들어주어야 한다. Reload 체크 박스를 설정하면 OK를 누르자마자 심볼 정보를 다시 리로드하는 것을 볼 수 있다.

간혹 가다가 한번씩 심볼 정보가 일치하지 않을 때가 있는데 이 때는 심볼 정보를 다시 리로드하는 명령어 .reload를 실행주면 된다.

   

   

이상 Window8 Remote Kernel Debugging on Vmware using WinDbg 글을 마친다.

'디버깅' 카테고리의 다른 글

MS 심볼 구성에 관하여  (0) 2014.12.17
Windows 10 _KPCR and _KPRCB  (0) 2014.11.14
8바이트 변수 초기화 문제  (0) 2014.11.14
Windbg에서 KDBG 찾기  (0) 2014.06.19
_DRIVER_OBJECT.DriverSection 정보  (0) 2013.10.05