Tools/Windbg

Windbg

sh711 2025. 3. 8. 16:59
Windbg는 gdb 와 같은 동적 분석 도구이다.
지원되는 아키텍처는 x64, ARM 이며 gdb와 달리 윈도우의 실행 파일 PE(Portable Executable) 형식에 맞춰줘 있으며, 추가적으로 윈도우 커널(NT)을 디버깅할 수 있는 강력한 기능이 있다.

 

https://learn.microsoft.com/ko-kr/windows-hardware/drivers/debugger/

 

WinDbg 설치 - Windows drivers

Windows 디버거 및 WinDbg 설치에 대한 개요는 여기에서 시작합니다.

learn.microsoft.com

해당 링크에서 설치가 가능하다.

 

1. 디버거 유형 확인

첫번째로 디버깅할 유형을 정해야 한다.

1.1 커널 모드

운영 체제 및 권한 있는 프로그램은 커널 모드에서 실행된다.

커널 모드의 코드에는 시스템의 모든 부분에 액세스 할 수 있는 권한이 있다는 점에서 사용자 모드와의 차이점을 나타낸다.

따라서, 커널 모드의 코드에서는 사용자 모드 또는 커널 모드에서 실행되는 모든 프로세스에 접근이 가능하다.

 

1.2 사용자 모드

컴퓨터에 설치된 프로그램, 애플리케이션과 같은 하위 시스템은 사용자 모드로 실행된다.

사용자 모드에서 실행되는 프로세스는 자체적으로 가상 주소 공간 내에서 실행되어 시스템의 많은 부분에 직접 액세스할 수 없다. 또한 다른 사용자 모드 프로세스와 격리되어 접근이 불가능하다. 마치 샌드박스의 개념과 비슷하다고 볼 수 있다.

 

2. 실습

컴파일 후 Windbg로 열어보면 다음과 같이 확인된다

 

기본적인 명령어

step out : po (Shift + F11)

step into : t (F11 or F8)

stop over : p (F10)

quit : q

x : [모듈]![함수명] => 모듈의 함수 주소 찾음

u : rip 값 기준 명령어 unassemble

bp : 지정 위치 중단점 설정

bl : 중단점 목록 표시

bc : 중단점 제거 (bc <break_number>)

r : 레지스터 값 표시
* r rax = 0x1234 => rax 값 0x1234로 설정

d : 메모리 내용 표시
* d <address> => address 메모리 내용 출력
* d rax => rax 레지스터 주소 내용 출력

!address : 메모리 섹션 모두 확인 및 권한확인

e : 메모리 변경 => e <address> <변경 값>
* eb : byte 변경
* ed : dword 변경
* eq : qword 변경

k : 현재 스택 트레이스 출력

kb : 호출 스택과 인자들을 포함해서 스택 트레이스 출력

!threads : 시스템에서 실행 중인 모든 쓰레드 나열

~ : 현재 쓰레드를 전환
* ~0 : 첫 번째 쓰레드로 전환

lm : 현재 로드된 모둘 목록 출력

ln <address> : 특정 메모리 주소 어떤 모듈의 어떤 함수인지 확인 가능

dt <structure name> <address> : address를 구조체 형태로 출력

!modules : 로드된 모든 모듈 정보 출력