现在的位置: 首页 > 综合 > 正文

windbg之使用!list指令遍历双向链表

2013年10月21日 ⁄ 综合 ⁄ 共 3321字 ⁄ 字号 评论关闭

windows内核中大量的数据结构使用了双向链表。

如果能查看每个链表的元素,甚是美哉。

windbg就给我们提供了这么好用的功能。

!list命令是一个用来查看链表的命令,该功能非常强大并且易于使用。

下面我们就用例子来看一下!list命令的用法

使用!list遍历活动进程的进程Id和进程名

活动进程链表节点在EPROCESS中德偏移

 +0x088 ActiveProcessLinks : _LIST_ENTRY

遍历活动进程列表

lkd> !list -t nt!_LIST_ENTRY.FLink -e -x "dt nt!_eprocess UniqueProcessId ImageFileName @$extret-88" nt!PsActiveProcessHead
dt nt!_eprocess UniqueProcessId ImageFileName @$extret-88 
   +0x084 UniqueProcessId : 0x8055d0c0 Void
   +0x174 ImageFileName   : [16]  "???"

dt nt!_eprocess UniqueProcessId ImageFileName @$extret-88 
   +0x084 UniqueProcessId : 0x00000004 Void
   +0x174 ImageFileName   : [16]  "System"

dt nt!_eprocess UniqueProcessId ImageFileName @$extret-88 
   +0x084 UniqueProcessId : 0x00000324 Void
   +0x174 ImageFileName   : [16]  "smss.exe"

dt nt!_eprocess UniqueProcessId ImageFileName @$extret-88 
   +0x084 UniqueProcessId : 0x00000388 Void
   +0x174 ImageFileName   : [16]  "csrss.exe"

dt nt!_eprocess UniqueProcessId ImageFileName @$extret-88 
   +0x084 UniqueProcessId : 0x000003a4 Void
   +0x174 ImageFileName   : [16]  "winlogon.exe"

dt nt!_eprocess UniqueProcessId ImageFileName @$extret-88 
   +0x084 UniqueProcessId : 0x000003d0 Void
   +0x174 ImageFileName   : [16]  "services.exe"

dt nt!_eprocess UniqueProcessId ImageFileName @$extret-88 
   +0x084 UniqueProcessId : 0x000003dc Void
   +0x174 ImageFileName   : [16]  "lsass.exe"
dt nt!_eprocess UniqueProcessId ImageFileName @$extret-88 
   +0x084 UniqueProcessId : 0x00000e9c Void
   +0x174 ImageFileName   : [16]  "windbg.exe"

使用!list 查看windbg.exe的线程列表

先获取windbg.exe的EPROCESS的对象指针

lkd> !process 0 0 windbg.exe
PROCESS 893813c0  SessionId: 0  Cid: 0e9c    Peb: 7ffdc000  ParentCid: 0798
    DirBase: 09f60380  ObjectTable: e179f950  HandleCount:  87.
    Image: windbg.exe

获取windbg.exe的线程列表

线程链表在EPROCESS中德偏移:

+0x190 ThreadListHead   : _LIST_ENTRY

线程链节点在ETHread中德偏移:

+0x22c ThreadListEntry  : _LIST_ENTRY

查看线程列表

lkd> !list -t nt!_LIST_ENTRY.FLink -x "dt nt!_ETHREAD Cid Cid. @$extret-0x22c" 893813c0+0x190
   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : (null) 
      +0x004 UniqueThread : (null) 

   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : 0x00000e9c Void
      +0x004 UniqueThread : 0x00000ea4 Void

   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : 0x00000e9c Void
      +0x004 UniqueThread : 0x00000f38 Void

   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : 0x00000e9c Void
      +0x004 UniqueThread : 0x00000a90 Void

!list中处理多条命令

如果要在-x后面的命令字符串中处理多条命令,请使用“”把!list命令参数括起来。

lkd> !list "-t nt!_LIST_ENTRY.FLink  -x \"r @$t1=@$extret-0x22c; dt nt!_ETHREAD Cid Cid. @$t1; dt nt!_ETHREAD Win32StartAddress @$t1;\" 893813c0+0x190"
   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : (null) 
      +0x004 UniqueThread : (null) 
   +0x228 Win32StartAddress : (null) 

   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : 0x00000e9c Void
      +0x004 UniqueThread : 0x00000ea4 Void
   +0x228 Win32StartAddress : 0x01058c77 Void

   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : 0x00000e9c Void
      +0x004 UniqueThread : 0x00000f38 Void
   +0x228 Win32StartAddress : 0x0102b590 Void

   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : 0x00000e9c Void
      +0x004 UniqueThread : 0x00000bb4 Void
   +0x228 Win32StartAddress : (null) 

#CONTAINING_RECORD宏的应用

由于@$extret-0x22c不直观,可以@@(#CONTAINING_RECORD(@$extret, nt!_ETHREAD, ThreadListEntry))来等价替换。

lkd> !list -t nt!_LIST_ENTRY.FLink  -x "dt nt!_ETHREAD Cid Cid. @@(#CONTAINING_RECORD(@$extret, nt!_ETHREAD, ThreadListEntry))" 893813c0+0x190
   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : (null) 
      +0x004 UniqueThread : (null) 

   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : 0x00000e9c Void
      +0x004 UniqueThread : 0x00000ea4 Void

   +0x1ec Cid  : _CLIENT_ID
      +0x000 UniqueProcess : 0x00000e9c Void
      +0x004 UniqueThread : 0x00000f38 Void

以上结果基于windows xp sp3 系统展示。

转载请注明出处。ddlx studio。点点灵犀。

http://blog.csdn.net/sunyikuyu

抱歉!评论已关闭.