reversing/WinDbg

디버거 연결하기

코끼리_땃쥐 2023. 2. 20. 14:28
반응형

WinDbg에 notepad.exe를 연결하는 방법은 세가지가 있습니다.

  • WinDbg에서 notepad.exe를 실행하면서 연결하는 방법
  • 이미 notepad.exe가 실행된 상태에서 WinDbg를 나중에 연결하는 방법
  • notepad.exe가 먼저 실행된 상태에서 어떤 문제가 발생했을 때 자동으로 WinDbg가 연결되는 방법

 

WinDbg에서 notepad.exe 실행하기(디버거에서 디버기 실행하기)

프로그램의 시작점인 main(또는 WinMain) 함수부터 디버깅을 하려고 할 때 사용한다.

이 기능을 사용하면 notepad.exe가 실제로 실행되기 전부터 디버거가 붙어서 실행된다.

비주얼 스튜디오에서 코드를 작성하고 F5키를 눌러서 실행하면서 디버깅하는 것과 비슷하다.

File-> Open Executable을 선택한다.

자신의 프로그램이 명령 인자를 받는다면 Open Executable 대화상자 하단에 보이는 Arguments에 명령 인자를 입력하고 열기를 클릭한다.

열기를 클릭하면 프로세스 초기화가 끝나고 main함수에 진입하기전에 한 번 멈춘다.

여기서  g 키를 누르고나 F5 키를 누르면 main() 함수로 진입하면서 프로그램이 실행된다. main() 함수부터 디버깅을 하려면 이 시점에 main() 함수에 브레이크 포인트를 걸어주고 g 명령을 수행해야 한다.

 

실행중인 notepad.exe에 WinDbg 붙이기 (디버거를 디버기에 붙이기)

이미 실행 중인 응용프로그램(Application)을 디버깅하려고 할 때는 붙이기(Attach) 기능을 사용한다.

붙이기는 WinDbg로 실행시키지 않은 응용프로그램에 나중에 끼어들어 디버깅할수 있는 매우 유용한 기능이다.

주로 특별한 조건으로 실행된 상태의 응용프로그램을 디버깅해야 할 때나 서비스 프로세스(Service Process)를 디버깅해야 할 때 사용한다.

특별한 조건으로 실행된 상태의 응용프로그램이란, 다른 응용프로그램에 의해서 실행돼야 하는 종류나 명령 인자(Argument)를 동적으로 생성하는 종류의 응용프로그램으로, 고정된 인자를 주기 어려운 경우를 말한다. 이런 응용프로그램은 WindDbg로 실행하면서 수동으로 인자를 주기 어려우므로 먼저 실행시킨 후 디버거를 붙이는 방법을 사용해야 한다. 서비스 프로세스는 시작 방법이 일반적인 응용프로그램과 달라서 WinDbg로 실행시키면서 디버깅할 수 없다. 이런 경우 서비스 고유의 방법으로 시작한다음에 WindDbg를 붙이기해 디버깅 할 수 있다.

WinDbg의 File 메뉴에서 Attach to a Process를 선택한다.

현재 실행 중인 프로세스 목록이 보이므로 notepad.exe를 선택하고  OK를 클릭한다. 이때부터 WinDbg가 디버거로 붙어서 디버깅을 할 수 있다. 주의할 점은 WinDbg를 종료하면 실행 중이던 notepad.exe가 함께 종료된다는 사실이다. 기본적으로 디버깅을 하려고 디버거를 붙이는 것은 자유롭게 가능하지만 디버거를 떼어내는 것은 자유롭지 못하다는 의미다.

 

실행 중이던 응용프로그램이 종료되지 않게 하려면 아랫 부분의 Noninvasive옵션을 사용한다. 단, Noninvasive 옵션을 체크하면 WinDbg가 notepad.exe에 붙기는 하지만 프로세스를 멈추거나 동작을 바꾸거나 하는 제어는 할 수 없다. 단지 프로세스 내부의 어떤 정보다 특정 메모리를 확인할 수만 있을 뿐이다. 이런 제약을 가지므로 WinDbg를 종료해도 프로세스는 계속 실행된다.

 

※ 윈도우 XP 이후부터는 Noninvasive 모드를 사용하지 않아도 qd(Quit and Detach) 명령을 이용해 프로세스를 종료하지 않고 디버거를 프로세스로부터 떼어낼 수 있다. 디버깅에 제약도 없으면서 WinDbg를 종료해도 프로세스는 종료되지 않는 것이다. 아무 생각 없이 WinDbg를 종료해 버리면 프로세스가 함께 종료되지만 qd명령을 먼저 사용하면 WinDbg가 프로세스에서 분리(Detach)되므로 이후에 WinDbg만 깔끔하게 종료 할 수 있다.

 

동작 중인 notepad.exe를 중단시키고 디버거에 제어를 준다. 멈춰진 화면은 'WinDbg에서 notepad.exe 실행하기' 화면과 비슷하지만 사실 여기서는 main() 함수는 이미 수행돼 지나가 버린 상태고, 어떤 코드를 수행하다가 중지된 것인지 알 수 없는 상황이다. 따라서 앞으로 수행될 것으로 예상되는 함수에 브레이크 포인트를 걸면서 디버깅을 시작해야하는데, 심볼을 먼저 맞춰줘야 추가 작업을 진행할 수 있다.

 

notepad.exe 실행 중 문제가 발생했을 때 자동으로 WinDbg 실행하기

이 방법은 자신이 직접 WinDbg와 notepad.exe를 연결하는 방법은 아니다. notepad.exe에 어떤 문제가 발생했을 때 항상 WinDbg를 자동으로 실행해서 디버깅을 진행하려고 할 때 사용하는 방법이다. 사실 notepad.exe는 하나의 예일 뿐으로 이 방법과 직접적인 관계는 없다. 즉, notepad.exe에 문제가 발생해서 WinDbg가 실행되는 것이므로 어떤 프로세스라도 문제가 발생하면 자동으로 WinDbg가 실행된다.

이 기능은 레지스트리에 존재하는 AeDebug 키를 이용한다. 이기능을 설정하려면 관리자 권한으로 실행한 명령 프롬프트에서 WinDbg를 실행하면서 다음과 같이 -I 옵션을 사용한다.

C:\User\User>windbg -I

그러면 HKEY-LOCAL-MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 레지스트리에 WinDbg가 등록돼 어떤 프로세스에 문제가 발생했을때 자동으로 실행된다.

 

이 방법은 주로 불특정하고 오랜 기다림 끝에 오류가 발생하는 종류의 문제를 해결하려고 할 때 사용한다. 일주일에 한 번 오류가 발생하는 빈도를 가진 프로그램을 디버깅 하려고 매일 아침 WinDbg를 붙여놓을 수는 없지 않겠는가 ? 오류가 발생한 순간 WinDbg가 자동으로 붙여지게 설정해 놓으면 여유 있게 디버깅의 순간을 기다릴 수 있을 것이다.

 

※ 사실 윈도우 XP 까지는 AeDebug에 기본값으로 Dr.Watson이 설정돼 있다. 따라서 어떤 프로세스에 문제가 발생 했을 때 Dr.Watson이 자동으로 붙여져 덤프 파일을 생성해준다. 이 덤프 파일을 WinDbg로 열어서 디버깅을 진행할 수도 있으므로 AeDebug를 WinDbg로 변경할 때는 필요성을 면밀하게 검토한 후에 변경하기 바란다. 윈도우 비스타 이후 버전에서는 기본적으로 Dr.Watson도 사용하지 않고 AeDebug도 사용하지 않는다 하지만 앞서 설명한 대로 WinDbg를 AeDebug에 설정하면 오류가 발생했을때 WinDbg가 실행되게 할 수 있다.

반응형