2015年2月17日星期二

list命令用法总结

list命令用法总结:

功能:
The !list extension executes the specified debugger commands repeatedly, once for every element in a linked list.
就是枚举/遍历链表的。

用法:
!list -t [Module!]Type.Field -x "Commands" [-a "Arguments"] [Options] StartAddress
!list " -t [Module!]Type.Field -x \"Commands\" [-a \"Arguments\"] [Options] StartAddress "
!list -h

第三个是显示帮助的,注意这个和WINDBG帮助文档的优点少。
建议用第一个,第二个可能在别的情况下有用,如脚本。


示例:
这里以进程结构为例。


1: kd> !list -t nt!_EPROCESS.ImageFileName -x "dp" -e poi(nt!PsActiveProcessHead)
dp 0xffffffff8214e6e8
8214e6e8  81e1fd80 805648b8 00000000 00000000
8214e6f8  00000000 00000000 00000000 00000000
8214e708  00000007 00299000 001ca000 00000000
8214e718  00000000 00000000 00000000 e1003e38
8214e728  e1000add 00000001 f88fabe4 00000000
8214e738  00040001 00000000 8214e740 8214e740
8214e748  00000000 000028c6 00000001 f88fabe4
8214e758  00000000 00040001 00000000 8214e764
1: kd> !list -t nt!eprocess.ImageFileName -x "dp" -e poi(nt!PsActiveProcessHead)
GetFieldOffset failed for nt!eprocess.ImageFileName

注意:
1.结构最好区分大小写。
2.结构最好是链表,否则好像不循环。
3.-e是显示的命令,不是显示结构的每个成员。
4.-m Max控制显示的循环数,在某些情况下有用。

1: kd> !list -t nt!_LIST_ENTRY.Flink -x "dp" -e -m 3 poi(nt!PsActiveProcessHead)
dp 0xffffffff8214e6e8
8214e6e8  81e1fd80 805648b8 00000000 00000000
8214e6f8  00000000 00000000 00000000 00000000
8214e708  00000007 00299000 001ca000 00000000
8214e718  00000000 00000000 00000000 e1003e38
8214e728  e1000add 00000001 f88fabe4 00000000
8214e738  00040001 00000000 8214e740 8214e740
8214e748  00000000 000028c6 00000001 f88fabe4
8214e758  00000000 00040001 00000000 8214e764

dp 0xffffffff81e1fd80
81e1fd80  81f5b350 8214e6e8 00000280 000017b4
81e1fd90  0000002b 00001318 00006bd4 000001a3
81e1fda0  0000002b 00e45000 003ab000 00000000
81e1fdb0  00000000 00000000 00000000 e13604c0
81e1fdc0  e17933d7 00000001 f80f5cb8 00000000
81e1fdd0  00040001 00000000 81e1fdd8 81e1fdd8
81e1fde0  00000000 0000c0c0 00000001 f80f5cb8
81e1fdf0  00000000 00040001 00000000 81e1fdfc

dp 0xffffffff81f5b350
81f5b350  81dfba08 81e1fd80 00006560 0002157c
81f5b360  00000be8 000075f8 000215a4 00000bef
81f5b370  00000be8 04762000 0475f000 81dfba34
81f5b380  f89bb014 00000000 00000000 e1759e50
81f5b390  e174bde1 00000001 f853ed00 00000003
81f5b3a0  00040001 00000000 81f5b3a8 81f5b3a8
81f5b3b0  00000000 0000d627 00000001 f853ed04
81f5b3c0  00000005 00040001 00000000 81f5b3cc


!list -t nt!_LIST_ENTRY.Flink -x "dt nt!_EPROCESS UniqueProcessId ImageFileName @@(#CONTAINING_RECORD(@$extret, nt!_EPROCESS, ActiveProcessLinks))" poi(nt!PsActiveProcessHead)
这个命令摘自:http://bbs.pediy.com/showthread.php?t=43835
注释:dt nt!_EPROCESS UniqueProcessId ImageFileName @@(#CONTAINING_RECORD(@$extret, nt!_EPROCESS, ActiveProcessLinks))
这个是DT命令,可以自己输入看看效果。DT命令还是很强大的,DT也可以显示链表,请看WINDBG的帮助文档,还有很多没有搞懂的参数。

课题:
用WINDBG显示一个进程VadRoot内容。


成功运用的例子是:!list -t nt!_LIST_ENTRY.Flink -x "dt _enumerate_key key_path @@(#CONTAINING_RECORD(@$extret, enumerate_key, le))" -e poi(g_register_key_le)

made by correy
made at 2015.01.22

没有评论:

发表评论