2010년 9월 15일 수요일

10 WinDbg 간단 사용법 - kkamagui의 프로그래밍 작업실

들어가기 전에...


•이 글은 kkamagui에 의해 작성된 글입니다.

•마음껏 인용하시거나 사용하셔도 됩니다. 단 출처(http://kkamagui.tistory.com, http://kkamagui.springnote.com)는 밝혀 주십시오.

•기타 사항은 kkakkunghehe at daum.net 이나 http://kkamagui.tistory.com으로 보내주시면 반영하겠습니다.





웹 심볼(Web Symbol) 얻기

SRV*D:\Symbol\WebSymbol*http://msdl.microsoft.com/download/symbols 를 Symbol Path에 넣으면 웹 심볼을 사용할 수 있다.







로드된 모듈 리스트 보기

lm 명령을 이용하면 된다.



•lm k : Kernel Mode 모듈 표시

•lm u : User Mode 모듈 표시

•lm m : 패턴을 검사하여 해당하는 것만 보여줌





lkd> lm

start end module name

00c80000 00c90000 NateOnHook40u (export symbols) C:\Program Files\NATEON\BIN\NateOnHook40u.dll

00cb0000 00cb9000 MgHookDll C (export symbols) C:\Program Files\LG Software\On Screen Display\MgHookDll.dll

01000000 0106a000 windbg (pdb symbols) D:\Symbol\WebSymbol\windbg.pdb\D6EF677AA54441279479F0307F05A8941\windbg.pdb

016a0000 01784000 ext (export symbols) C:\Program Files\Debugging Tools for Windows\winext\ext.dll

01790000 017c1000 kext (pdb symbols) D:\Symbol\WebSymbol\kext.pdb\6B643FC4E9F94FF4ABA4CEF1FD6F89D61\kext.pdb







모듈의 심볼(Symbol) 검사

x 모듈!패턴 을 입력하면 된다.



lkd> x nt!Ke*

804f8c02 nt!KeQuerySystemTime =

804f8c9e nt!KeEnableInterrupts =

80500e38 nt!KeSwitchKernelStack =

804fad32 nt!KeReadStateProcess =

804f9188 nt!KeReleaseInterruptSpinLock =







데이터 타입(Date Type) 표시

dt 데이터 타입 을 입력하면 된다.



lkd> dt _EPROCESS

+0x000 Pcb : _KPROCESS

+0x06c ProcessLock : _EX_PUSH_LOCK

+0x070 CreateTime : _LARGE_INTEGER

+0x078 ExitTime : _LARGE_INTEGER

+0x080 RundownProtect : _EX_RUNDOWN_REF

+0x084 UniqueProcessId : Ptr32 Void

+0x088 ActiveProcessLinks : _LIST_ENTRY

+0x090 QuotaUsage : [3] Uint4B

+0x09c QuotaPeak : [3] Uint4B

+0x0a8 CommitCharge : Uint4B











메모리 덤프(Memory Dump)

d* 명령들을 이용하면 된다.



•db : Byte 형식 + Ascii 로 표시

•dd : 데이터를 4Byte 형식으로 표시





lkd> db 8053db18

8053db18 8b ff 55 8b ec 8b 45 08-8b 4d 0c 8b 55 14 89 48 ..U...E..M..U..H

8053db28 0c 8b 4d 10 89 48 10 03-ca 89 48 14 8b 4d 18 83 ..M..H....H..M..

8053db38 c1 fe 89 48 18 8b 4d 1c-89 48 20 66 8b 4d 20 66 ...H..M..H f.M f











디스어셈블리(Disassembly)

u 주소 를 이용하면 된다. 특정 함수를 디스어셈블리 하고 싶으면 uf 주소 를 하면 된다.



•u 주소 : 주소에서 일부분만 디스어셈블리

•u 주소1 주소2 : 주소1에서 주소 2까지 디스어셈블리





lkd> u 8053db18 or uf nt!NtOpenProcess

nt!KeInitializeProfile:

8053db18 8bff mov edi,edi

8053db1a 55 push ebp

8053db1b 8bec mov ebp,esp

8053db1d 8b4508 mov eax,[ebp+0x8]

8053db20 8b4d0c mov ecx,[ebp+0xc]







메모리 영역 속성 보기(VA Dump)

!vadump 명령을 사용하면 된다. 만약 특정 메모리의 속성을 보고 싶다면 !vprot 주소 명령을 사용하면 된다.



0:000> !vadump

BaseAddress: 00000000

RegionSize: 00010000

State: 00010000 MEM_FREE

Protect: 00000001 PAGE_NOACCESS



BaseAddress: 00010000

RegionSize: 00001000

State: 00001000 MEM_COMMIT

Protect: 00000004 PAGE_READWRITE

Type: 00020000 MEM_PRIVATE







0:000> !vprot 30c191c

BaseAddress: 030c1000

AllocationBase: 030c0000

AllocationProtect: 00000080 PAGE_EXECUTE_WRITECOPY

RegionSize: 00011000

State: 00001000 MEM_COMMIT

Protect: 00000010 PAGE_EXECUTE

Type: 01000000 MEM_IMAGE







프로세스 관련

모든 프로세스를 보기위해서는 !process 0 0 를 입력하면 된다. 디버거를 특정 프로세스에 붙이고 싶으면 .process /i [pid] 를 입력하면 된다.







lkd> !process 0 0

**** NT ACTIVE PROCESS DUMP ****

PROCESS 8a3a3490 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000

DirBase: 00780000 ObjectTable: e1001c70 HandleCount: 521.

Image: System



PROCESS 8a184158 SessionId: none Cid: 03f0 Peb: 7ffdd000 ParentCid: 0004

DirBase: 17a40020 ObjectTable: e163dd70 HandleCount: 20.

Image: smss.exe



PROCESS 89df4da0 SessionId: 0 Cid: 0440 Peb: 7ffd5000 ParentCid: 03f0

DirBase: 17a40040 ObjectTable: e1c6cb18 HandleCount: 626.

Image: csrss.exe

댓글 없음:

댓글 쓰기