출처 : http://kkamagui.tistory.com/809
지난번에 VMware와 IDA를 이용해서 MBR부터 윈도우 부팅과정을 따라가는 방법에 대한 글을 올렸는데요, Ilho님께서 WinDBG를 이용해서 부팅과정을 따라가는 방법도 있다고 알려주셔서 실험해봤습니다. ^^
일단 디버거가 붙은 시점은 32비트 부트매니져가 시작되는 시점이더라구요. MBR부터 따라가지 못하는 점은 조금 아쉽지만... 강력한 장점은 윈도우 심볼을 로드할 수 있어서 따라가기 편하다는 겁니다. @0@)-b (llho님 감사드려요 ㅠㅠ)
VMware 설정
일단, 부팅과정을 따라가려면 VMware에 시리얼을 추가해야 하는데요, VMware의 왼쪽 편에 있는 "Edit vritual machine settings"를 클릭하여 뜬 "Virtual Machine Settings" 창에서 왼쪽 아래에 있는 "Add"을 누르면 됩니다. 그러면 "Add Hardware Wizard"창이 표시되는데, "Serial Port" 항목을 선택한 뒤"Next"를 누릅니다.
이제 시리얼 포트 타입과 옵션을 설정할 차례인데요, "Serial Port Type"은 "Output to named pipe"로 하고 "Named pipe"의 이름은 "\.\pipe\com_1", "This end is the server", "The other end is a virtual machine", "Connect at power on"로 각각 선택해주시면 됩니다(좀 항목이 많은데 아래 그림을 참고하세요 ^^;;). 그리고 시리얼 포트가 생성되면 마지막으로 "Virtual Machine Settings" 창의 오른쪽 아래에 있는 "Yield CPU on poll"을 클릭해주시면 VMware의 설정은 끝납니다.
<VMware 시리얼 포트 등록 화면 1>
<VMware 시리얼 포트 등록 화면 2>
윈도우 7 설정
다음으로... 윈도우 7에 부트 디버그 옵션을 설정해야 하는데요, cmd.exe를 관리자 권한으로 실행해서 bcdedit.exe로 옵션을 설정해줘야 합니다. cmd.exe를 실행한 다음 아래처럼 입력해주면 됩니다.
주의: bcdedit로 부트 디버그 설정을 하고 나면 재부팅 후 디버그가 붙기 전까지는 부팅 시작이 아주 늦게 시작되더군요(한 1분쯤 기다려야 부팅이 시작되었던듯...). ㅠㅠ 실제로 사용하시는 윈도우에 실험삼아 하셨다가는 큰일이 날수도 있으니 주의하시기 바랍니다. ㅠㅠ
bcdedit /bootdebug {bootmgr} on
bcdedit /bootdebug on
bcdedit /debug {bootmgr} on
bcdedit /debug on
bcdedit /set {bootmgr} debugtype serial
bcdedit /set {bootmgr} baudrate 115200
bcdedit /set {bootmgr} debugport 1
그리고 재부팅을 하면 부팅이 시작되지 않고 디버거가 붙기를 기다립니다. 이제 WinDBG만 설정해주면 디버깅 준비가 모두 끝납니다.
WinDBG 설정
WinDBG는 마이크로소프트에서 제공하는 디버거로 유저 모드 디버깅과 커널 모드 디버깅을 모두 지원합니다. 그리고 윈도우 자체를 디버깅할 때 심볼을 자동으로 로드해주는 강력한 기능이 있기 때문에 윈도우를 분석하는데 정말 좋은 툴이라고 생각합니다. ^^;;;
WinDBG는 마이크로소프트 사의 페이지에서 다운받을 수 있으며, 다운 받은 설치 파일을 실행하면 끝납니다. 설치가 끝나면 이제 옵션을 주어 VMware의 시리얼 포트와 연결되도록 해야 하는데요, 먼저 windbg.exe 파일을 끌어서 바로가기를 만듭니다. 그리고 속성을 클릭해서 아래 화면처럼 대상의 내용을 수정해 줍니다. -k부터 주욱 입력해주시면 됩니다. ^^;;;
C:\WinDDK\7600.16385.1\Debuggers\windbg.exe -k com:port=\\.\pipe\com_1,baud=115200,pipe,reconnect
<WinDBG 설정 화면>
자, 입력까지 끝났으면 이제 바로가기를 클릭하여 windbg를 실행합니다. 그러면 창이 뜨고 아래처럼 "Waiting to reconnect..."라는 메시지가 표시될 텐데요, VMware를 시작하면 디버거가 연결되고 윈도우가 실행됩니다. 이 상태로는 원하는 부트 디버깅을 할 수 없으니 WinDBG 창에서 Control+break
를 눌러서 중단 시킵니다. 그리고 아래로 넘어가서 심볼 경로 설정과 브레이크 포인트 설정을 해줍니다.
Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
Copyright (c) Microsoft Corporation. All rights reserved.
Waiting for pipe \\.\pipe\com_1
Waiting to reconnect...
WinDBG 심볼 설정 및 브레이크 포인트 설정하기
그럼 먼저 심볼을 로드할 수 있게 설정해보겠습니다. 심볼 경로는 "File" -> "Symbol File Path"를 클릭해서 지정해 줄 수 있으며, 아래처럼 입력해주면 웹에서 찾아 알아서 심볼을 다운로드 해줍니다. 굳이 윈도우 버전에 따라서 심볼을 찾느라 고생하지 않아도 된다는 거지요. ^^;;;
srv*c:\symbols.pub*http://msdl.microsoft.com/download/symbols
심볼 경로를 지정해줬으니 이번에는 bootmgr부터 디버깅을 하기 위해 WinDBG의 커맨드 창에서 아래처럼 입력해줍니다.
sxe ibp
sxe ld:bootmgr
다 입력했으면 VMware를 재시작 한 뒤에 WinDBG의 커맨드 창에서 .restart
를 입력해서 재시작합니다. 그리고 잠시 기다리면 VMware와 연결되서 bootmgr부터 디버깅이 가능합니다. ^^)-b
<Bootmgr 디버깅 화면>
그럼 즐거운 디버깅(?)하세요 ;)