Post

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다. 심볼 매칭 과정은 다음과 같다.

  1. binary의 PE section 중, debug section이 존재하는데, 여기에 .pdb파일의 경로가 기록되어 있다.
  2. 이 경로에 가서 .pdb 파일을 불러와 심볼을 매칭한다.
  3. 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.