windbg 를 이용한 커널 드라이버 디버깅 2. live debugging

40
1 1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr WinDbg 를 를를를 를를 를를를를 를를를 를 를 를 WinDbg 를 를를를 를를 를를를를 를를를 2. Live Debugging KOREA SYSTEM PROGRAMMER 1 st System Kernel Conference 2003.11.8

Upload: winka

Post on 13-Jan-2016

219 views

Category:

Documents


0 download

DESCRIPTION

WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging. KOREA SYSTEM PROGRAMMER 1 st System Kernel Conference 2003.11.8. 목차. Debugger 와 Debuggee Symbol Driver Verifier 소스레벨 디버깅 Deadlock Debugging. Debugger 와 Debuggee. Debugger – WinDbg 를 수행하는 PC(HOST) Debuggee – Driver 를 수행하는 PC(TARGET). - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

1

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

WinDbg 를 이용한 커널 드라이버 디버깅

2. Live Debugging

KOREA SYSTEM PROGRAMMER1st System Kernel Conference

2003.11.8

Page 2: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

2

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

목차목차

Debugger 와 DebuggeeSymbolDriver Verifier소스레벨 디버깅Deadlock Debugging

Page 3: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

3

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Debugger Debugger 와 와 DebuggeeDebuggee

Debugger – WinDbg 를 수행하는 PC(HOST)Debuggee – Driver 를 수행하는 PC(TARGET)

Page 4: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

4

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Debugger Debugger 와 와 DebuggeeDebuggee

디버거와 디버기의 연결 준비시리얼 케이블 ( 널모뎀 ) – 9 pin to 9 pinHOST notebook - USB to Serial cable

HOST – WinDbg• Debugger OS: Windows NT4, 2000, XP, 2003 Server

TARGET – NT OS• Debuggee OS: Windows NT4, 2000, XP, 2003 Server• Debuggee Platform: x86, IA-64, AMD64

Page 5: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

5

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Debugger Debugger 와 와 DebuggeeDebuggee

Step 0. 시리얼 케이블 연결Debugger(HOST) – COM1Debuggee(TARGET) – COM2

Page 6: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

6

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Debugger Debugger 와 와 DebuggeeDebuggee

Step 1. Debuggee 설정과 부팅OS 를 디버그 모드로 부팅해야 한다C:\boot.ini 수정

Hidden, ReadOnly 속성제거

[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)\WINNT[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows XP Pr

ofessional" /fastdetect

Page 7: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

7

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Debugger Debugger 와 와 DebuggeeDebuggee

[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows XP Pr

ofessional" /fastdetectmulti(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows XP Pr

ofessional" /fastdetect /debug /debugport=com2 /baudrate=115200/debug – OS 를 디버그 모드로 설정/debugport – 시리얼포트 지정 ( 디폴트는 com2)/baudrate – 9600, 19200, 38400, 57600, 115200 중 선택

부트메뉴시작할 운영 체제를 선택하십시오 :Windows XP ProfessionalWindows XP Professional [ 디버그 가능 ]

Page 8: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

8

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Debugger Debugger 와 와 DebuggeeDebuggee

Step 2. 디버거 (HOST) PC 에서 WinDbg 실행File 메뉴에서 Kernel Debug … 메뉴 선택

Page 9: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

9

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Debugger Debugger 와 와 DebuggeeDebuggee

Step 3. WinDbg 와 Debuggee 연결WinDbg 는 연결 대기 상태에서1. Debuggee 가 디버그 모드로 부팅하면 WinDbg 와

연결되어 디버그 메시지를 뿌리기 시작2. Debuggee 가 먼저 디버그 모드로 부팅되어

있었다면 Ctrl-Break 로 연결

Page 10: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

10

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Debugger Debugger 와 와 DebuggeeDebuggee

부팅하면서 연결된 화면

Page 11: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

11

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

SymbolSymbol

Symbol 이 없다면…kernel32+0x102A84

Symbol 이 있다면…kernel32!CreateFileAkernel32!CreateFileW…ntdll!NtCreateFilentdll!NtCreateProcess…nt!NtCreateFilent!ZwCreateFile(nt = ntoskrnl.exe)…

Page 12: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

12

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

SymbolSymbol

WinDbg 로 OS 를 디버깅하기 위한 기본요소OS 심볼 파일 ( NT4, 2000, XP, … )

링커가 exe, dll, sys 등과 함께 심볼 생성.dbg files, .pdb filesntoskrnl.exe – ntoskrnl.pdb (checked build)ntoskrnl.exe – ntoskrnl.pdb (free build)ntoskrnl.exe – ntoskrnl.pdb (NT4)ntoskrnl.exe – ntoskrnl.pdb (Win2K, sp1, sp?)ntoskrnl.exe – ntoskrnl.pdb (XP, sp1)

Page 13: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

13

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

SymbolSymbol

심볼에 들어있는 정보함수이름 , 주소 , ( 인자 )( 전역변수 , 지역변수 )( 소스라인 , 파일패스 )

심볼 다운로드http://www.microsoft.com/ddk/debugging/symbols.asp

NT4 sp6, sp6a ~ XP sp1 free buildOS 에 default 로 들어가는 모든 모듈의 심볼 포함Debuggee OS 에 맞춰서 사용

Page 14: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

14

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

SymbolSymbol

WinDbg 에 Debuggee OS 심볼 설정Step 1. C:\ossymbol\2ksp3 에 심볼 저장Step 2. WinDbg Command 에서kd>.sympath c:\ossymbol\2ksp3Symbol search path is: c:\ossymbol\2ksp3

File - Symbol Search Path

Page 15: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

15

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

SymbolSymbol

WebSymbolSymbol Search Path 에 MS 웹심볼 사이트지정Debuggee OS 구분없이 사용 가능모듈 CheckSum 비교하여 일치하는 심볼 다운로드Lazy symbol loading ( download )서버의 공유폴더에 다운로드하여 공유가능

WebSymbol 설정kd>.sympath srv*c:\websymbol*http://msdl.microsoft.com/download/symbolsSymbol search path is: SRV*c:\websymbol*http://msdl.microsoft.com/download/symbols

Page 16: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

16

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

SymbolSymbol

WebSymbol 설정kd> .symfix c:\websymbolSymbol search path is: SRV*c:\websymbol*http://msdl.microsoft.com/download/symbols

File – Symbol Search Path

Page 17: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

17

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

SymbolSymbol

Public symbol 과 Private symbolPublic symbol – MS 가 외부에 공개하는 심볼함수이름 , 주소 표시Private symbol – MS 가 내부에서 사용하는 심볼전역변수 , 지역변수 , 소스라인 , 파일패스까지 표시소스 연동 가능

Page 18: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

18

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

SymbolSymbol

심볼생성WinDbg 로 우리의 모듈을 디버깅하려면 우리 모듈의 심볼파일이 필요

Checked Build ( debug build )drvname.sys, drvname.pdb 생성drvname.pdb 는 private symbol Full 디버그 정보 포함

Free Build ( release build )drvname.sys, drvname.pdb 생성2K, XP DDK 에서는 Free 도 디폴트로 pdb 생성

Page 19: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

19

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

SymbolSymbol

Free build 에서 Private symbol 생성Free build sys(exe) 를 소스레벨 디버깅 가능릴리즈된 모듈에 대해서 소스레벨 디버깅 가능

Compiler Option ( NT4 DDK )-Zi

Linker Option ( NT4 DDK )/DEBUG /DEBUGTYPE=windbg

Build Utility Macro ( NT4 DDK )Set NTDEBUGTYPE=windbgSet USE_PDB=1

Page 20: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

20

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Driver VerifierDriver Verifier

개발검증이란 ?

Page 21: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

21

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Driver VerifierDriver Verifier

드라이버 검증을 위한 도구Driver Verifier ( Windows 2000, XP or later )Bounds Checker for Driver EditionChecked Build OS from MSDNHCT ( Hardware Compatibility Test )

Driver Verifier OptionSpecial Pool – Memory 앞뒤에 Guard 영역 체크Force IRQL checking – IRQL 문제 확인Low resource simulation – 가상 리소스 부족Pool tracking – Memory leak 체크I/O verification – IRP 핸들링 체크

Page 22: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

22

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Driver VerifierDriver Verifier

Driver Verifier 실행실행창에서 verifier.exe ENTER도스창에서 verifier.exe ENTER

Page 23: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

23

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Driver VerifierDriver Verifier

Page 24: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

24

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Driver VerifierDriver Verifier

Page 25: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

25

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Driver VerifierDriver Verifier

Io Verification Example************************************************************************ THIS VALIDATION BUG IS FATAL AND WILL CAUSE THE VERIFIER TO HALT ** WINDOWS (BUGCHECK) WHEN THE MACHINE IS NOT UNDER A KERNEL DEBUGGER! ************************************************************************WDM DRIVER ERROR: [MyDrv.sys @ 0xF9D5C900] An IRP dispatch handler (F9D5C900 ) has r

eturned a status that is inconsistent with the Irp's IoStatus.Status field. ( Irp = B23CEF68 - Irp->IoStatus.Status = 00000000 - returned = 00000102 )

IRP_MJ_DEVICE_CONTROL[ DevObj=00000000, FileObject=80DFFC50, Parameters=00000000 00000000 00220018 000000

00 ]http://www.microsoft.com/hwtest/bc/redir.asp?os=5.1.2600&major=0xc9&minor=0x224&lang

=0x9Break, Ignore, Zap, Remove, Disable all (bizrd)? bBreaking in... (press g<enter> to return to assert menu)nt!DbgBreakPoint:80517a98 cc int 3kd> u 0xF9D5C900MyDrv!MyDrvDeviceControl [d:\project\test\mydrv\mydrv.c @ 238]:f9d5c900 55 push ebp

Page 26: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

26

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Driver VerifierDriver Verifier

NTSTATUS MyDrvDeviceControl(

IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)

{ // LINE 238… switch (ulIoControlCode) { case MYDRV_IOCTL_IOVERIFY: ntStatus = STATUS_TIMEOUT; pIrp -> IoStatus.Status = STATUS_SUCCESS; pIrp -> IoStatus.Information = 0; break;

…}IoCompleteRequest(pIrp, IO_NO_INCREMENT);return ntStatus;

}

Page 27: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

27

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

소스레벨 디버깅소스레벨 디버깅

심볼패스 지정C:\xpddk\src\fastfat\fastfat.pdb 폴더직접지정C:\mysymbols 폴더로 심볼파일들 복사

소스패스 지정.srcpath c:\xpddk\src\fastfat

Page 28: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

28

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

소스레벨 디버깅소스레벨 디버깅 IFS Kit 의 fastfat.sys 를 checked build

Page 29: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

29

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

Hang 과 Deadlock어떤 쓰레드가 ? 어떤 동기화 객체를 ?

Page 30: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

30

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

Hang프로세스 응답없음쓰레드가 대기상태인 경우쓰레드가 무한루프인 경우

Hang example어떤 쓰레드가 어떤 이벤트를 기다림버그에 의해 그 이벤트가 시그널되지 않음

Thread AKeWaitForSingleObject(kEvent)

Thread BKeSetEvent(kEvent)

Page 31: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

31

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

대기중인 쓰레드 찾기 ( MyApp.exe & MyDrv.sys )kd> !process 0 7PROCESS 80ef0030 SessionId: 0 Cid: 07b8 Peb: 7ffdf000 ParentCid: 04a0 DirBase: 020a6000 ObjectTable: e1138520 HandleCount: 328. Image: wuauclt.exe… THREAD 80ef0da8 Cid 7b8.778 Teb: 7ffde000 Win32Thread: e1921100 WAIT: (WrUserR

equest)f2597ccc 804f82e4 80ef0e18 80ef0da8 804f24b2 nt!KiSwapContext+0x2ef2597cd8 804f24b2 000024ff e1921100 00000000 nt!KiSwapThread+0x44 …PROCESS 81189910 SessionId: 0 Cid: 011c Peb: 7ffdf000 ParentCid: 01cc DirBase: 07426000 ObjectTable: e1dde380 HandleCount: 373. Image: msnmsgr.exe

자신의 프로세스를 먼저 살펴보기버그의 95% - 개발중인 자신의 모듈버그의 4% - 자신의 모듈과 다른 모듈 충돌버그의 1% - OS 버그

Page 32: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

32

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

PROCESS 80dddda8 SessionId: 0 Cid: 06cc Peb: 7ffdf000 ParentCid: 01cc DirBase: 0b26c000 ObjectTable: e151e3b0 HandleCount: 56. Image: MyApp.exe… THREAD 80de8610 Cid 6cc.2b0 Teb: 7ffde000 Win32Thread: e1500638 WAIT: (Executive)

KernelMode Non-Alertable…ChildEBP RetAddr Args to Child f23dfb60 804f82e4 80de8680 80de8610 804f24b2 nt!KiSwapContext+0x2ef23dfb6c 804f24b2 00000000 f9d5c4c0 a9580f00 nt!KiSwapThread+0x44f23dfb94 80627f2c 00000000 00000000 00000000 nt!KeWaitForSingleObject+0x1c0f23dfbbc f9d5c9a3 f9d5c4c0 00000000 00000000 nt!VerifierKeWaitForSingleObject+0x54f23dfc10 804e8185 80f56318 a9580f68 8069f524 MyDrv!MyDrvDeviceControl+0xa3 (CONV: st

dcall) [d:\project\test\mydrv\mydrv.c @ 266]f23dfc20 80626d10 80de8820 8069f2f0 a9580f68 nt!IopfCallDriver+0x31

kd> .thread 80de8610 Implicit thread is now 80de8610*** Call Stack 창의 내용이 위와 같이 바뀜

Page 33: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

33

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

대기중인 대상 찾기case MYDRV_IOCTL_EVENT1:

KeWaitForSingleObject( &Event, Executive, KernelMode, FALSE, NULL );

pIrp -> IoStatus.Status = STATUS_SUCCESS; // LINE 266 pIrp -> IoStatus.Information = 0;

break;

case MYDRV_IOCTL_EVENT2:KeSetEvent( &Event, IO_NO_INCREMENT, FALSE );

pIrp -> IoStatus.Status = STATUS_SUCCESS; pIrp -> IoStatus.Information = 0;

break;

Page 34: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

34

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

Deadlock프로세스 응답없음시스템 락킹

Deadlock Example쓰레드 두개가 두 개의 락을 소유 시도

Thread 1Acquire Lock A…Acquire Lock BRelease Lock A

Thread 2Acquire Lock B…Acquire Lock ARelease Lock B

Page 35: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

35

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

대기중인 쓰레드 찾기 ( MyApp.exe & MyDrv.sys )

kd> !process 0 0 MyApp.exePROCESS 81570b90 SessionId: 0 Cid: 01e4 Peb: 7ffdf000 ParentCid: 01e8 DirBase: 0bc9c000 ObjectTable: e20a9d60 HandleCount: 44. Image: MyApp.exe

kd> !process 81570b90 PROCESS 81570b90 SessionId: 0 Cid: 01e4 Peb: 7ffdf000 ParentCid: 01e8 DirBase: 0bc9c000 ObjectTable: e20a9d60 HandleCount: 44. Image: MyApp.exe VadRoot 813898a8 Vads 58 Clone 0 Private 175. Modified 81. Locked 0. ... THREAD 8158c9f8 Cid 1e4.3b0 Teb: 7ffde000 Win32Thread: e1a53660 WAIT: (Exe

cutive) KernelMode Non-Alertable f9fdf480 Mutant - owning thread 81116030 IRP List: 81397b90: (0006,0094) Flags: 00000000 Mdl: 00000000 Not impersonating ...

Page 36: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

36

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

ChildEBP RetAddr f2208bac 804f82e4 nt!KiSwapContext+0x2e (FPO: [EBP 0xf2208be0] [0,0,4])f2208bb8 804f24b2 nt!KiSwapThread+0x44 (FPO: [0,0,2])f2208be0 f9fdf9e4 nt!KeWaitForSingleObject+0x1c0 (FPO: [Non-Fpo])f2208c34 804e8185 MyDrv!MyDrvDeviceControl+0xe4 (FPO: [Non-Fpo]) (CONV: stdcall) [d:

\project\test\mydrv\mydrv.c @ 272]f2208c44 8055887c nt!IopfCallDriver+0x31 (FPO: [0,0,1])f2208c58 805595a7 nt!IopSynchronousServiceTail+0x5e (FPO: [Non-Fpo])f2208d00 80552468 nt!IopXxxControlFile+0x5a5f2208d34 8052a421 nt!NtDeviceIoControlFile+0x28 (FPO: [Non-Fpo])

kd> .thread 8158c9f8Implicit thread is now 8158c9f8*** Call Stack 창의 내용이 위와 같이 바뀜

Page 37: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

37

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

case MYDRV_IOCTL_MUTEX1:KeWaitForSingleObject( &MutexA, Executive, KernelMode, FALSE, NULL );

interval1.QuadPart = -30000000;KeDelayExecutionThread( KernelMode, FALSE, &interval1 );KeWaitForSingleObject( &MutexB, Executive, KernelMode, FALSE, NULL );

KeReleaseMutex( &MutexA, FALSE ); // LINE 272KeReleaseMutex( &MutexB, FALSE );

kd> dd mydrv!MutexBf9fdf480 00080002 00000000 8158ca68 8158ca68f9fdf490 81116040 81116040 81116030 00000100kd> dt KMUTEX f9fdf480 +0x000 Header : _DISPATCHER_HEADER +0x010 MutantListEntry : _LIST_ENTRY [ 0x81116040 - 0x81116040 ] +0x018 OwnerThread : 0x81116030 +0x01c Abandoned : 0 '' +0x01d ApcDisable : 0x1 ''

Page 38: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

38

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

kd> !thread 0x81116030 THREAD 81116030 Cid 428.60c Teb: 7ffde000 Win32Thread: e20f6cb8 WAIT: (Executive)

KernelMode Non-Alertable f9fdf4a0 Mutant - owning thread 8158c9f8IRP List: 81396c10: (0006,0094) Flags: 00000000 Mdl: 00000000...ChildEBP RetAddr Args to Child f26ddbac 804f82e4 811160a0 81116030 804f24b2 nt!KiSwapContext+0x2ef26ddbb8 804f24b2 81116240 817b6bd8 81396c10 nt!KiSwapThread+0x44f26ddbe0 f9fdfa59 00000000 00000000 00000000 nt!KeWaitForSingleObject+0x1c0f26ddc34 804e8185 8120ec98 81396c10 8069f2f0 MyDrv!MyDrvDeviceControl+0x159 (CONV: s

tdcall) [d:\project\test\mydrv\mydrv.c @ 287]f26ddc44 8055887c 81412ac0 81396c80 81396c10 nt!IopfCallDriver+0x31f26ddc58 805595a7 8120ec98 81396c10 81412ac0 nt!IopSynchronousServiceTail+0x5ef26ddd00 80552468 000000a0 00000000 00000000 nt!IopXxxControlFile+0x5a5f26ddd34 8052a421 000000a0 00000000 00000000 nt!NtDeviceIoControlFile+0x28

kd> .thread 81116030 Implicit thread is now 81116030

Page 39: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

39

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Deadlock DebuggingDeadlock Debugging

case MYDRV_IOCTL_MUTEX2:KeWaitForSingleObject( &MutexB, Executive, KernelMode, FALSE, NULL );

interval2.QuadPart = -30000000;KeDelayExecutionThread( KernelMode, FALSE, &interval2 );KeWaitForSingleObject( &MutexA, Executive, KernelMode, FALSE, NULL );

KeReleaseMutex( &MutexB, FALSE ); // LINE 287KeReleaseMutex( &MutexA, FALSE );

kd> dd mydrv!MutexAf9fdf4a0 00080002 00000000 811160a0 811160a0f9fdf4b0 8158ca08 8158ca08 8158c9f8 00000100kd> dt KMUTEX f9fdf4a0 +0x000 Header : _DISPATCHER_HEADER +0x010 MutantListEntry : _LIST_ENTRY [ 0x8158ca08 - 0x8158ca08 ] +0x018 OwnerThread : 0x8158c9f8 +0x01c Abandoned : 0 '' +0x01d ApcDisable : 0x1 ''

Page 40: WinDbg 를 이용한 커널 드라이버 디버깅 2. Live Debugging

40

1st S y s t e m K e r n e l C o n f e r e n c e www.syskon.co.kr

WinDbg 를 이용한 커널 드라이버 디버깅김 성 현

Q & AQ & A