Windbg
1
2
3
4
5
1: kd> x HelloDriver!gTraceFlags
fffff801`908a3020 HelloDriver!gTraceFlags = 0
1: kd> ed HelloDriver!gTraceFlags 0xffffffff
1: kd> x HelloDriver!gTraceFlags
fffff801`908a3020 HelloDriver!gTraceFlags = 0xffffffff
ed
: e는 edit, d는 DWORD. eq
같은 것도 가능하다.
Windbg에 OutputDebugString로 출력되는 디버그 스트링 찍기
커널의 Kd\_DEFAULT_Mask
와 &
연산을 하기 때문에, 기본적으로 아무것도 출력되지 않도록 되어있다. 따라서 이 값을 0xffffffff
로 설정해준다.
주의!!dbgview 켜놓으면 여기서 먼저 가져가서 windbg에 안뜬다!!
1
2
3
0: kd> ed nt!Kd\_DEFAULT\_Mask 0xffffffff
0: kd> dd nt!Kd\_DEFAULT\_Mask L1 // 뒤에 L1 붙이면 1개만 출력
fffff801`9161df68 ffffffff
dd
: Display DWORD
1
2
3
4
5
6
7
8
9
1: kd> bp HelloDriver!DriverEntry
1: kd> bl // breakpoint list
0 e Disable Clear fffff801`908d6000 0001 (0001) HelloDriver!DriverEntry
1: kd> bc 0 // 삭제
1: kd> bu DriverName!DriverFunction // break unresolved symbol.
// 현재 해당 심볼이 안올라온 상태에서, 나중에 해당 심볼이 나타나면 break 걸리도록 설정.
코드에서 break point 넣기
1
2
\_\_asm int3; // x86
\_\_debugbreak(); // x64
디버깅 심볼 추가하기
File - Symbol File Path에 .pdb
파일이 있는 디렉토리 추가. 추가하고 .reload
를 입력 해줘야 반영 된다. Source File Path도 추가하면 소스 코드도 보여준다.
NT Kernel debugging symbol 다운로드 받기
1
2
3
kd> .symfix C:\symbols
kd> .sympath // symbol 경로 확인
kd> .reload
* symbol matching
Windows의 심볼 파일 확장자는 .pdb
다. 심볼 매칭 과정은 다음과 같다.
- binary의 PE section 중, debug section이 존재하는데, 여기에
.pdb
파일의 경로가 기록되어 있다. - 이 경로에 가서
.pdb
파일을 불러와 심볼을 매칭한다. - ASLR이 적용되어 있는 경우라도, 어차피 ImageBase + RVA 식으로 접근하기 때문에 ImageBase만 알고 있다면 symbol matching이 가능하다.
* 원격으로 커널 디버깅 하는 경우, windbg는 호스트에서 실행되기 때문에, .pdb
파일을 호스트 PC에서 찾는다. 그래서 그냥 호스트에서 컴파일하고, 게스트로 넘긴 다음 디버깅하면 알아서 호스트에 있는 .pdb
파일(컴파일 할 때 생성된)을 불러온다.
etc command
1
2
3
4
!process
dt \_eprocess [address]
.hh [command] // help 창 띄워준다
This post is licensed under CC BY 4.0 by the author.