아래 3가지 옵션을 이용하면 보다 많은 정보를 쉽게 확인 할 수 있습니다.
-V : 레지스터 또는 버추얼 메모리 주소 값을 보여 줍니다.
-t : 각 로컬 변수의 data type을 보여 줍니다.
-i : local, global, parameter, function, or unknown 등의 정보를 보여 줍니다.
적용예
1: kd> dv -V -t -i
prv param b60b6b20 @ebp+0x08 void * P = 0x86558908
prv param b60b6b24 @ebp+0x0c unsigned long TagToFree = 0
prv local b60b6b24 @ebp+0x0c struct _EPROCESS * ProcessBilled = 0x00000000
prv local b60b6b0c @ebp-0x0c unsigned long Tag = 0xb60b6b8d
prv local b60b6b14 @ebp-0x04 _POOL_TYPE EntryPoolType = PagedPool (1)
prv local b60b6b08 @ebp-0x10 unsigned long BigPages = 0x805bc066
prv local b60b6b00 @ebp-0x18 _POOL_TYPE PoolType = NonPagedPool (0)
prv local b60b6af0 @ebp-0x28 struct _KLOCK_QUEUE_HANDLE LockHandle = struct _KLOCK_QUEUE_HANDLE
prv local b60b6b20 @ebp+0x08 unsigned long Combined = 0x86558908
로컬 변수인지 또는 파라미터 인지 보여주고 주소값이 나와서 값을 확인해 볼수 있다.
최근에 알게된 Tip을 하나 소개 합니다.
1)특정 콜스택 프레임으로 이동
1: kd> .frame 12
12 013bf554 65e931e8 ipnathlp!NatpDeletePortBlock+0x48
2) 로컬 변수와 파라미터 값 확인
1: kd> dv -V -t
013bf55c @ebp+0x08 struct _NAT_PORT_RESERVATION * PortReservation = 0x0013d1f0
013bf560 @ebp+0x0c struct _NAT_PORT_BLOCK * PortBlock = 0x02f75988
013bf544 @ebp-0x10 struct _IO_STATUS_BLOCK IoStatus = struct _IO_STATUS_BLOCK
013bf54c @ebp-0x08 struct tcp_blockports_request Request = struct tcp_blockports_request
//dt 명령어로 값을 확인했다.
1: kd> dt _NAT_PORT_RESERVATION 0x0013d1f0
ipnathlp!_NAT_PORT_RESERVATION
+0x000 TcpipHandle : 0x00000da8
+0x004 BlockSize : 0x20
+0x006 PortBlockSize : 0x18
+0x008 PortBlockList : _LIST_ENTRY [ 0x2f75988 - 0x12b7f8 ]
//dt 명령어로 값을 확인했다.
1: kd> dt _NAT_PORT_BLOCK 0x02f75988
ipnathlp!_NAT_PORT_BLOCK
+0x000 Link : _LIST_ENTRY [ 0x12c050 - 0x13d1f8 ]
+0x008 StartHandle : 0x1389
+0x00c Bitmap : _RTL_BITMAP
+0x014 BitmapBuffer : [0] 0
3) ?? 명령으로 특정 로컬 변수값 확인
1: kd> ?? Request -> (?? 명령어로 확인할수 있는줄 몰랐다, 꼭 dt만 사용해야 하는줄 알았다.)
struct tcp_blockports_request
+0x000 ReservePorts : 0
+0x004 NumberofPorts : 0x1389
+0x004 StartHandle : 0x1389 a 0n5001