WinDbg 디버깅2007. 9. 23. 02:19
반응형

아래에서 핸들에 대한 주제를 올려주셨으니 !handle 명령에 대해서 알아보도록 하겠습니다. ^^

!handle은 특정 또는 모든 핸들에 대한 정보를 보여주는 명령입니다.

유저모드의 형식
!handle [Handle [UMFlags [TypeName]]]

커널모드의 형식
!handle [Handle [KMFlags [Process [TypeName]]]]

플래그의 자세한 설명은 언제나 그렇듯이 WinDbg Help 를 참조하시기 바랍니다. ^^
진행하면서 필요한 것만 간단히 설명하겠습니다.

아래의 예제들은 WinDbg Help !handle 에 있는 예제입니다.
WinDbg Help 에 쓸만한 예제도 있더군요. ^^

유저모드 먼저 간단히 살펴봅니다.

아래와 같이 명령어만 주고 인자를 생략하면 현재 프로세스의 핸들 테이블을 모두 보여주고
UMFlags는 기본값인 0x1 이 적용되어 handle type 만 보여주게 됩니다.

0:000> !handle
Handle 4
  Type          Section
Handle 8
  Type          Event
Handle c
  Type          Event
Handle 10
  Type          Event
Handle 14
  Type          Directory
Handle 5c
  Type          File
6 Handles
Type            Count
Event           3
Section         1
File            1
Directory       1

아래는 특정 핸들 8 을 보여주는 예제입니다.
UMFlags 에 f 를 주어 가능한 모든 Flag 를 다 켰습니다. 이 핸들에 대한 모든 정보를 보여줍니다.

0:000> !handle 8 f
Handle 8
  Type          Event
  Attributes    0
  GrantedAccess 0x100003:
         Synch
         QueryState,ModifyState
  HandleCount   2
  PointerCount  3
  Name         
  Object Specific Information
    Event Type Auto Reset
    Event is Waiting


커널모드에 대해서 살펴봅니다.

아래 예제는 Handle 에 0 을 주어 모든 핸들을 보이게 하고 KMFlags 에 4 를 주어 해제된 핸들도 포함하여 보이게 합니다.

kd> !handle 0 4
processor number 0
PROCESS 80559800  SessionId: 0  Cid: 0000    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1000d60  TableSize: 380.
    Image: Idle

New version of handle table at e1002000 with 380 Entries in use

0000: free handle, Entry address e1002000, Next Entry fffffffe
0004: Object: 80ed5238  GrantedAccess: 001f0fff
0008: Object: 80ed46b8  GrantedAccess: 00000000
000c: Object: e1281d00  GrantedAccess: 000f003f
0010: Object: e1013658  GrantedAccess: 00000000
......
0168: Object: ffb6c748  GrantedAccess: 00000003 (Protected)
016c: Object: ff811f90  GrantedAccess: 0012008b
0170: free handle, Entry address e10022e0, Next Entry 00000458
0174: Object: 80dfd5c8  GrantedAccess: 001f01ff
......

사실 해제된 핸들을 특별히 볼 일은 별로 없으니 위와 같이 사용하는 경우는 없을 것 같네요.

좀 더 현실적인 예로 제 자리에서 그냥 !handle 을 사용한 결과를 보여드립니다.
현재 프로세스의 핸들 테이블을 모두 보고 싶을 때 사용하면 좋습니다.
KMFlags 의 기본값은 0x3 이라 좀 더 자세한 내용을 볼 수 있습니다.

lkd> !handle
processor number 0, process 80562f00
PROCESS 80562f00  SessionId: none  Cid: 0000    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1003e60  HandleCount: 275.
    Image: Idle

Handle table at e16a9000 with 275 Entries in use
0004: Object: 867b5a00  GrantedAccess: 001f0fff Entry: e1004008
Object: 867b5a00  Type: (867b5040) Process
    ObjectHeader: 867b59e8
        HandleCount: 2  PointerCount: 72

0008: Object: 867b5340  GrantedAccess: 00000000 Entry: e1004010
Object: 867b5340  Type: (867b5e70) Thread
    ObjectHeader: 867b5328
        HandleCount: 1  PointerCount: 1

000c: Object: e1010478  GrantedAccess: 00000000 Entry: e1004018
Object: e1010478  Type: (867ab980) Key
    ObjectHeader: e1010460
        HandleCount: 1  PointerCount: 3
        Directory Object: 00000000  Name: \REGISTRY

0010: Object: e13aa168  GrantedAccess: 000f003f Entry: e1004020
Object: e13aa168  Type: (867ab980) Key
    ObjectHeader: e13aa150
        HandleCount: 1  PointerCount: 1
        Directory Object: 00000000  Name: \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\SESSION MANAGER\MEMORY MANAGEMENT\PREFETCHPARAMETERS

...

보통 10 이라는 핸들이 어떤 Object 인지 궁금할 때 다음과 같이 사용합니다.

lkd> !handle 10
processor number 0, process 80562f00
PROCESS 80562f00  SessionId: none  Cid: 0000    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1003e60  HandleCount: 275.
    Image: Idle

Handle table at e16a9000 with 275 Entries in use
0010: Object: e13aa168  GrantedAccess: 000f003f Entry: e1004020
Object: e13aa168  Type: (867ab980) Key
    ObjectHeader: e13aa150
        HandleCount: 1  PointerCount: 1
        Directory Object: 00000000  Name: \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\SESSION MANAGER\MEMORY MANAGEMENT\PREFETCHPARAMETERS

모든 핸들을 보였던 바로 위 예제에 이 내용이 포함되어 있는 것을 볼 수 있습니다.

아래는 KMFlags 의 0x10 플래그(커널 핸들 테이블 보이기 플래그)를 사용하여 커널 핸들 테이블의 핸들 0x14 를 보는 예제입니다.

kd> !handle 14 13
processor number 0
PROCESS 80559800  SessionId: 0  Cid: 0000    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1000d60  TableSize: 380.
    Image: Idle

Kernel New version of handle table at e1002000 with 380 Entries in use
0014: Object: e12751d0  GrantedAccess: 0002001f
Object: e12751d0  Type: (80ec8db8) Key
    ObjectHeader: e12751b8
        HandleCount: 1  PointerCount: 1
        Directory Object: 00000000  Name: \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\SESSION MANAGER\EXECUTIVE


!handle 의 마지막 인자인 [Process [TypeName]] 을 활용하면 특정 프로세스의 핸들을 볼 수도 있고 특정 타입의 핸들을 볼 수도 있습니다.
필요할 때 활용하시면서 익혀 보시기 바랍니다.

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=3&s_bulu=&s_key=&no=68

반응형
Posted by GreeMate