Windows/DeviceDriver 2021. 4. 20. 01:29

2. 윈도우 디버거 환경을 준비하자


WinDBG

  • MS Windows의 다용도 디버거이다.

  • 유저 모드 애플리케이션 뿐만 아니라 장치 드라이버나 커널 모드에서 운영체제 자체를 디버깅할 수도 있다.

  • GUI가 있으며 VS 디버거보다 강력하다.

  • 덤프 파일을 통해 디버깅할 수 있다.

고려 사항

  • 타겟 컴퓨터(가상 머신)의 부트 설정을 변경해야 한다.

    • 디버깅이 가능하도록 부트설정을 변경한다.

      • 가상 머신의 실행 창에서 msconfig 입력 후, 부팅 탭에서 고급 옵션에 들어간다.

      • 전역 디버그 설정에서 디버그 포트를 COM1, 전송 속도를 115200으로 맞추고 확인을 누른다.

      • 종료하지 않고 TESTSIGNING 모드 설정을 진행한다.

    • TESTSIGNING 모드 설정

      • 윈도우에서 드라이버가 작동하려면 MS로부터 인증을 받아야 하는데, 테스트 환경으로 부팅하면 이러한 인증 절차가 생략된다.

      • CMD를 관리자 권한으로 실행 후, 아래 명령어를 입력한다.

        bcdedit /set testsigning on
      • 완료되면 가상 머신을 종료한다.

  • 호스트 컴퓨터에서도 설정해야 하는게 두 가지 있다.

    • 디버깅할 타겟 컴퓨터와 연결할 방법을 결정한다. (가상 시리얼 포트)

      • VirtualBox 가상 머신의 설정에서 직렬 포트 탭에 들어간다.

        • 직렬 포트 사용에 체크하고, 포트 번호를 위에서 설정한 포트 번호와 맞춰준다.

        • 포트 모드를 Host Pipe로 설정하고, Connect to existing pipe/socket을 체크 해제한다.

        • 아래의 Path/Address에 다음과 같이 입력한다.

          \\.\pipe\com1

      • WinDbg(x64)에서 포트를 설정해야 한다.

        • File - Kernel Debug (Ctrl + K) 클릭 후 COM 탭으로 이동한다.

        • Pipe와 Reconnect에 체크하고 포트를 아래와 같이 작성한다.

    • 타겟 컴퓨터의 운영체제 심볼을 자동으로 받도록 설정한다.

      • C:\sym\websym 폴더를 생성한다.

      • WinDbg의 File - Symbol File Path를 클릭하고 아래 내용을 작성한다.

        C:\sym;
      • 우측의 Help를 클릭하여 Search 탭에 web symbol을 검색한다.

        • Microsoft public symbol server를 클릭하면 다음과 같이 나온다.

          The Microsoft symbol server makes Windows debugger symbols publicly available.
          
          You can refer directly to the public symbol server in your symbol path in the following manner:
          
          set _NT_SYMBOL_PATH=srv*DownstreamStore*https://msdl.microsoft.com/download/symbols
        • srv 이하 내용을 복사하여 아까의 세미콜론 뒤에 붙여넣고, DownstreamStore을 지우고 C:\sym\websym을 작성한다.

          C:\sym;srv*C:\sym\websym*https://msdl.microsoft.com/download/symbols
      • 설정을 저장하기 위해 File - SaveWorkspace를 클릭한다.

실습

  • 위의 과정을 모두 마치고나서 가상 머신을 작동시키면, WinDbg에서 커맨드 창이 열리고 다음과 같이 뜨는 것을 볼 수 있다.

    Microsoft (R) Windows Debugger Version 10.0.19041.685 AMD64
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    Opened \\.\pipe\com1
    Waiting to reconnect...
    Connected to Windows 10 19041 x64 target at (Sun Apr 18 21:01:11.597 2021 (UTC + 9:00)), ptr64 TRUE
    Kernel Debugger connection established.
    
    ************* Path validation summary **************
    Response                         Time (ms)     Location
    OK                                             C:\sym
    Deferred                                       srv*C:\sym\websym*https://msdl.microsoft.com/download/symbols
    Symbol search path is: C:\sym;srv*C:\sym\websym*https://msdl.microsoft.com/download/symbols
    Executable search path is: 
    Windows 10 Kernel Version 19041 MP (1 procs) Free x64
    Built by: 19041.1.amd64fre.vb_release.191206-1406
    Machine Name:
    Kernel base = 0xfffff801`37800000 PsLoadedModuleList = 0xfffff801`3842a3b0
    System Uptime: 0 days 0:00:00.000
    KDTARGET: Refreshing KD connection
    Capacity:25500, FullChargedCapacity:50000, Voltage:10000, Rate:0
  • 메뉴 탭의 Break를 클릭하면, 가상 머신을 멈출 수 있고 커맨드 창에 다음 내용이 출력된다.

    Break instruction exception - code 80000003 (first chance)
    *******************************************************************************
    *                                                                             *
    *   You are seeing this message because you pressed either                    *
    *       CTRL+C (if you run console kernel debugger) or,                       *
    *       CTRL+BREAK (if you run GUI kernel debugger),                          *
    *   on your debugger machine's keyboard.                                      *
    *                                                                             *
    *                   THIS IS NOT A BUG OR A SYSTEM CRASH                       *
    *                                                                             *
    * If you did not intend to break into the debugger, press the "g" key, then   *
    * press the "Enter" key now.  This message might immediately reappear.  If it *
    * does, press "g" and "Enter" again.                                          *
    *                                                                             *
    *******************************************************************************
    nt!DbgBreakPointWithStatus:
    fffff801`37bfd0b0 cc              int     3
    • 다시 Go 버튼을 누를 때까지 가상 머신이 멈춘 상태로 유지된다.