首页
社区
课程
招聘
[旧帖] [漏洞exploit工具-mona系列3]mona.py和winDBG的堆布局可视化 0.00雪花
发表于: 2015-2-25 18:13 4235

[旧帖] [漏洞exploit工具-mona系列3]mona.py和winDBG的堆布局可视化 0.00雪花

2015-2-25 18:13
4235
Heap Layout Visualization with mona.py and WinDBG

ps:2013年,corelan.be的文章,正好学习mona使用,感觉不错,翻译过来分享给大家,有不通顺、表达不清楚的地方可以参考原文 https://www.corelan.be/index.php/2013/01/18/heap-layout-visualization-with-mona-py-and-windbg/

介绍.
时光飞逝,自从我们宣称能够在winDBG下运行mona已经有3周了。于此同时在mona.py做了很多工作。我们改进了它的稳定性和表现。更新pykd.pyd到0.2.0.14版本,并且(ported )一些附加的immlib方法到windbglib中。

我认为这将是一个好时机去查看mona的2个新特性:
    》heap
    》kb(knowledgebase)

Heap.
当你听到 “heap”这个词的时候可能毛骨悚然,或许你感觉你有充裕的能力去探索线程栈存储了什么,但是当你探索堆时,你会相当的迷茫和无知。

这就是我为什么决定去改进mona.py中heap方法的。注意,我将用在这篇文章中使用windbg,因为“heap”将充分利用windbg的符号。这个方法也能工坐在immunityDebgger上,不过它的能力和输出会受到限制。

在看多种多样mona的命令之前,让我们来统一一下这些定义。“chunk”一词将被用于参考一区域内存。“block"一词将用于参考8字节的内存。”blocks"经常备用做堆块头部某些大小域的单元。

事不宜迟,让我们来看看“heap”可以做什么。针对此练习,我把windbg去附加到calc.exe进程上(在xp sp3) 。当然,这些也可以工作在win7上(32bit 或者 32bit in WOW64)

如果你想跟随,请先更新mona.py:

0:014> .load pykd.pyd
0:014> !py mona update
Hold on...
[+] Version compare :
    Current Version : '2.0', Current Revision : 322
    Latest Version : '2.0', Latest Revision : 322
[+] You are running the latest version
[+] Locating windbglib path
[+] Checking if C:\Program Files\Debugging Tools for Windows (x86)\windbglib.py needs an update...
[+] Version compare :
    Current Version : '1.0', Current Revision : 108
    Latest Version : '1.0', Latest Revision : 108
[+] You are running the latest version

[+] This mona.py action took 0:00:07.579000


如果你没有mona 和 windbglib ,看这里
    》 windbglib  http://redmine.corelan.be/projects/windbglib  (有个为windbglib和mona他俩准备的安装脚本
    》mona : http://redmine.corelan.be/projects/mona

首先,运行 !py mona help heap 看看所有可用的选项:
Usage of command 'heap' :
--------------------------
Show information about various heap chunk lists
Mandatory arguments :
    -h <address> : base address of the heap to query
    -t <type> : where type is 'lal' (lookasidelist), 'freelist', 'segments', 'chunks', 'layout' or 'all'
    'lal' and 'freelist' only work on XP/2003
    'layout' will show all heap chunks and their vtables & strings. Use on WinDBG for maximum results.
Optional arguments :
    -stat : show statistics (also works in combination with -h heap, -t segments or -t chunks
    -size <nr> : only show strings of at least the specified size. Works in combination with 'layout'
    -after <data> : only show current & next chunk layout entries when an entry contains this data
                    (Only works in combination with 'layout')
    -v : show data / write verbose info to the Log window


-t lal ,-t freelist 和 -t 所有的选项是过时,现在我们感兴趣的选项是:"segments", "chunks" 和 "layout".

获得进程所有堆的清单,
0:001> !py mona heap
Hold on...
Heaps:
------
0x000a0000 (1 segment(s) : 0x000a0640) * Default process heap
0x001a0000 (1 segment(s) : 0x001a0640) 
0x001b0000 (1 segment(s) : 0x001b0640) 
0x003c0000 (1 segment(s) : 0x003c0640) 
0x003d0000 (1 segment(s) : 0x003d0640) 
0x003f0000 (1 segment(s) : 0x003f0640) 
0x00370000 (1 segment(s) : 0x00370640) 

Please specify a valid searchtype -t
Valid values are :
   lal
   freelist
   all
   segments
   chunks
   layout

[+] This mona.py action took 0:00:00.190000


输出应该和windbg的 !heap命令比较,但是 mona也将会立马显示关于段(segements)的信息。

看一下特定堆的段 ,
0:001> !py mona heap -h 000a0000 -t segments
Hold on...
Heaps:
------
0x000a0000 (1 segment(s) : 0x000a0640) * Default process heap
0x001a0000 (1 segment(s) : 0x001a0640) 
0x001b0000 (1 segment(s) : 0x001b0640) 
0x003c0000 (1 segment(s) : 0x003c0640) 
0x003d0000 (1 segment(s) : 0x003d0640) 
0x003f0000 (1 segment(s) : 0x003f0640) 
0x00370000 (1 segment(s) : 0x00370640) 

[+] Processing heap 0x000a0000
Segment List for heap 0x655360:
---------------------------------
Heap : 0x000a0000 : Segment 0x000a0640 - 0x001a0000 (FirstEntry: 0x000a0680 - LastValidEntry: 0x001a0000)

[+] This mona.py action took 0:00:00.327000


(注:如果你省略 -h <heapbase> 参数 ,mona.pu将显示所有的堆的所有段)
如果你很懒,你也可以用 “default"一词作为-h 的参数,去表明你想要默认进程堆的信息。

看看堆段中所有的数据块,
0:001> !py mona heap -h 000a0000 -t chunks
Hold on...
Heaps:
------
0x000a0000 (1 segment(s) : 0x000a0640) * Default process heap
0x001a0000 (1 segment(s) : 0x001a0640) 
0x001b0000 (1 segment(s) : 0x001b0640) 
0x003c0000 (1 segment(s) : 0x003c0640) 
0x003d0000 (1 segment(s) : 0x003d0640) 
0x003f0000 (1 segment(s) : 0x003f0640) 
0x00370000 (1 segment(s) : 0x00370640) 

[+] Preparing output file 'heapchunks.txt'
    - (Re)setting logfile heapchunks.txt
[+] Generating module info table, hang on...
    - Processing modules
    - Done. Let's rock 'n roll.
[+] Processing heap 0x000a0000
Segment List for heap 0x655360:
---------------------------------
Heap : 0x000a0000 : Segment 0x000a0640 - 0x001a0000 (FirstEntry: 0x000a0680 - LastValidEntry: 0x001a0000)
    Nr of chunks : 584 
    _HEAP_ENTRY  psize   size  unused  UserPtr   UserSize
       000a0680  00008  01808   00008  000a0688  00001800 (6144) (Busy)
       000a1e88  00301  00210   00008  000a1e90  00000208 (520) (Busy)
       000a2098  00042  00228   0000e  000a20a0  0000021a (538) (Busy)
       000a22c0  00045  00030   0000e  000a22c8  00000022 (34) (Busy)
<...> 
       000b4110  00025  00040   00008  000b4118  00000038 (56) (Busy)
       000b4150  00008  00128   00008  000b4158  00000120 (288) (Busy)
       000b4278  00025  03d88   00008  000b4280  00003d80 (15744) (Last)
       0x000b8000 - 0x001a0000 (end of segment) : uncommitted

[+] This mona.py action took 0:00:03.027000


这个命令的数据也将会写入到heapchunks.txt中。

你又可以省略掉 -h <heapbase>的参数来查看所有堆中所有段的所有数据块。

当然,输出应该与windbg中与数据块相关的 !heap -h <heapbase>命令完全相同,但是mona将会显示多一些关于每个数据块的信息,很容易的立刻发现你需要的信息。

看一些数据块和他们大小的统计,你可以用 -stat 参数 与 -t chunks 组合。
0:001> !py mona heap -h 000a0000 -t chunks -stat
Hold on...
Heaps:
------
0x000a0000 (1 segment(s) : 0x000a0640) * Default process heap
0x001a0000 (1 segment(s) : 0x001a0640) 
0x001b0000 (1 segment(s) : 0x001b0640) 
0x003c0000 (1 segment(s) : 0x003c0640) 
0x003d0000 (1 segment(s) : 0x003d0640) 
0x003f0000 (1 segment(s) : 0x003f0640) 
0x00370000 (1 segment(s) : 0x00370640) 

[+] Preparing output file 'heapchunks.txt'
    - (Re)setting logfile heapchunks.txt
[+] Generating module info table, hang on...
    - Processing modules
    - Done. Let's rock 'n roll.
[+] Processing heap 0x000a0000
Segment List for heap 0x655360:
---------------------------------
Heap : 0x000a0000 : Segment 0x000a0640 - 0x001a0000 (FirstEntry: 0x000a0680 - LastValidEntry: 0x001a0000)
    Nr of chunks : 584 
    _HEAP_ENTRY  psize   size  unused  UserPtr   UserSize
    Segment Statistics:
    Size : 0x3d80 (15744) : 1 chunks (0.17 %)
    Size : 0x1800 (6144) : 1 chunks (0.17 %)
    Size : 0x1258 (4696) : 1 chunks (0.17 %)
    Size : 0x928 (2344) : 2 chunks (0.34 %)
    Size : 0x888 (2184) : 1 chunks (0.17 %)
    Size : 0x7ac (1964) : 1 chunks (0.17 %)
    Size : 0x586 (1414) : 1 chunks (0.17 %)
    Size : 0x4e4 (1252) : 1 chunks (0.17 %)
    Size : 0x4b0 (1200) : 1 chunks (0.17 %)
    Size : 0x494 (1172) : 1 chunks (0.17 %)
    Size : 0x480 (1152) : 1 chunks (0.17 %)
    Size : 0x400 (1024) : 1 chunks (0.17 %)
    Size : 0x314 (788) : 2 chunks (0.34 %)
    Size : 0x30e (782) : 1 chunks (0.17 %)
    Size : 0x308 (776) : 1 chunks (0.17 %)
    Size : 0x2fa (762) : 1 chunks (0.17 %)
    Size : 0x2f8 (760) : 1 chunks (0.17 %)
    
    < . . . >

    Total chunks : 584


Global statistics
  Size : 0x3d80 (15744) : 1 chunks (0.17 %)
  Size : 0x1800 (6144) : 1 chunks (0.17 %)
  Size : 0x1258 (4696) : 1 chunks (0.17 %)
  Size : 0x928 (2344) : 2 chunks (0.34 %)
  Size : 0x888 (2184) : 1 chunks (0.17 %)
  Size : 0x7ac (1964) : 1 chunks (0.17 %)
  Size : 0x586 (1414) : 1 chunks (0.17 %)
  Size : 0x4e4 (1252) : 1 chunks (0.17 %)
  Size : 0x4b0 (1200) : 1 chunks (0.17 %)
  Size : 0x494 (1172) : 1 chunks (0.17 %)
  Size : 0x480 (1152) : 1 chunks (0.17 %)
  Size : 0x400 (1024) : 1 chunks (0.17 %)
  Size : 0x314 (788) : 2 chunks (0.34 %)
  Size : 0x30e (782) : 1 chunks (0.17 %)
  Size : 0x308 (776) : 1 chunks (0.17 %)
  Size : 0x2fa (762) : 1 chunks (0.17 %)
  
  < . . . >

  Total chunks : 584

[+] This mona.py action took 0:00:01.562000


一切都不错,让我们继续前进。

Heap layout  堆布局

布局常规使事情更进一步,这将会获取所有的进程堆(或者仅仅是选择的堆),查询所有的堆涉及到的所有的段,获取段中的所有数据块,并且尝试着去发现数据块中的存储的数据类型。现在mona.py能发现字符串(ascii和unicode的)BSTR对象,有虚表的对象。当immunityDebugger下运行布局特性时,你不能发现有虚表的对象,关于这个我可做的不多。

“layout”方法的输出结果将被写入到heaplayout.txt文件中,接下来的几分钟我们来看看一些例子。

这里的一些参数可以改变“layout”命令的输出和表现,不但允许你去微调信息的数量,而且还有你想去看的信息类型:

    》-v: 这个将造成所有的信息都将被写入到log窗口。
    》-fast:这个奖跳过发现对象的大小
    》 -size <nr> :这将使mona.py跳过小于所提供大小的条件的相关的条目的字符串
    》 -after <value> :这个将造成mona.py忽略条目直到含有<value>的字符串或者虚函数表被发现,然后输出当前数据块的所有事情(信息)。

我们将用3个例子去证明(演示) mona.py如何帮助你去查看堆中所存的是什么,那些与栈上数据相关的某些数据在哪。

Overall Layout 整体布局

获取最大数量的信息
!py mona heap -t layout -v


输出是被分为每个堆,每个段,每个数据块的。 让我们随便看一块输出中的位置。
----- Heap 0x003d0000, Segment 0x003d0640 - 0x003e0000 (1/1) -----
chunk 0x003d0680 (Usersize 0x1800, chunksize 0x1808) : Busy
chunk 0x003d1e88 (Usersize 0x88, chunksize 0x90) : Busy
chunk 0x003d1f18 (Usersize 0x88, chunksize 0x90) : Busy
chunk 0x003d1fa8 (Usersize 0x3df, chunksize 0x448) : Free
  +003f @ 003d1fe7->003d200b : String (Data : 0x23/35 bytes, 0x23/35 chars) : ComSpec=C:\WINDOWS\system32\cmd.exe
  +0021 @ 003d202c->003d2053 : String (Data : 0x26/38 bytes, 0x26/38 chars) : HOMEPATH=\Documents and Settings\peter
  +003c @ 003d208f->003d21bd : String (Data : 0x12d/301 bytes, 0x12d/301 chars) : Path=C:\Perl\site\bin;C:\Perl\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;c:\python2...
        @ 003d2168           : Object : 74726f54 MSCTF!CLBarItemSinkProxy::`vftable'+0x8 
  +0055 @ 003d21bd->003d21f6 : String (Data : 0x38/56 bytes, 0x38/56 chars) : PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
  +001b @ 003d2211->003d2256 : String (Data : 0x44/68 bytes, 0x44/68 chars) : PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 11, GenuineIntel
  +0081 @ 003d22d7->003d22fc : String (Data : 0x24/36 bytes, 0x24/36 chars) : TEMP=C:\DOCUME~1\peter\LOCALS~1\Temp
  +0000 @ 003d22fc->003d2320 : String (Data : 0x23/35 bytes, 0x23/35 chars) : TMP=C:\DOCUME~1\peter\LOCALS~1\Temp
  +0023 @ 003d2343->003d236f : String (Data : 0x2b/43 bytes, 0x2b/43 chars) : USERPROFILE=C:\Documents and Settings\peter
  +0000 @ 003d236f->003d23bb : String (Data : 0x4b/75 bytes, 0x4b/75 chars) : VS100COMNTOOLS=C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\

在这个摘要中,我们可以看到:
    》 0x003d0000 堆的0x003d0640 段中的前三个数据块没有看到含有字符串或虚表。
    》 第四个数据块不好韩字符串和一个对象。

让我们注意第四数据块中的第一个字符串。这行包含了一下值:
    》+003F: 这表明距离上一个条目(如果是第一条的话,就是堆块的开始)到当前条目开始的距离(如果这是字符串的话)
    》@ 003d1fe7->003d200b : 这个是当前条目内存范围边界。如果是字符串的话(ascii unicode),第一个指针将指向字符串的开始,如果是BSTR,第一个指针将指向BSTR的头。如果是对象的话,指针将包含虚表的地址
    》 “string":这表明条目的类型,并且紧跟其后的是数据的大小 (字节大小,字符大小);字符表明这个条目所占字节的多少,包含开头和结尾的字节。如果是unicode ,字节数是字符数的2倍。
    》Data: 如果条目是字符串,你将看到前100字符,如果是一个对象,你将得到虚表。

每当,虚表被发现,mona.py将尝试去发现他所属对象的大小。如果不能这样做,你只能看到对象的开始地址,但是没有结束地址。对象后边位于线的右边的偏移表明对象是多大。你将经常需要从这个之中减去8 或者12 字节获得准确的对象大小。

最重要的是,一个虚表包含很多函数指针这是常见的。mona.py将所有的函数指针聚合在一个12字节距离上,并且在日志中只显示一条有关这个的条目。不完美,但是可以避免很多噪音(杂乱的输出)。

让我们看看2个例子去验证有附加的特性。

Heap Spray 堆喷射

设想下你想去看 堆喷射是否成功,数据块在哪有多大。让我们在IE8,xpsp3 上 尝试下列基础的堆喷射脚本。
<html><head>
<script>

var largechunk = "AAAA";
var spray = new Array();

function dospray()
{
	while (largechunk.length < 0x10000) largechunk += largechunk;
	
	for (var i = 0; i < 0x200; i++)
	{
		spray[i] = largechunk.substring(0,(0x800-6)/2);
	}
	alert("Spray done ?");
}

</script>
</head>
<body onload="dospray();" />
</html>


将winDBG附加到包含有堆喷射iexplore.exe页上。我决定使用字母A在我的堆喷射中,并且我知道每个 BSTR应该是0x800个字节,确保mona.py能发现我们的字符串,我将告诉他去寻找0x300字节或者更大的字符串。这应该足够的去忽略噪音,有足够的空间处理错误。

记住我没有使用保有的方法,我尝试分配恰好的0x800大小的数据块,这意味着事实上字符串的长度是少于0x800的。-size 参数将寻找一定数量的ascii字节,如果是BSTR,将仅仅有一半的字节数。当然,你不一定用 -size 参数,不管怎样,我期待发现一串BSTR对象,多半在默认的进程堆中。但是 我们自以为(或者证实)我们是笨的。

让我们的mona 去找我们的堆喷射

!py mona heap -t layout -size 0x300


事实上这条指令的执行将花费更长的时间去完成,相比于calc.exe,因为我们没有限制查找明确的堆。我们的进程有很多堆,大量的段和数据块。在我缓慢的虚拟机(VM)中,命令花费了大约4分钟才完成。然而这听起来很坏,你将注意到然而随后的任何运行都将变得很快。事实上第二次运行只用了20-30秒的时间。甚至关闭winDG打开一个新的会话,这还是很快。这个我稍后在说。

我们告诉mona去给我们至少有0x500字节的字符串。除此之外发现其他的东西,mona.py将直到发现虚表。这次,mona.py能发现一些对象的大小,这意味着输出将包含关于这些对象更多的信息:
chunk 0x02dc9840 (Usersize 0x1ff8, chunksize 0x2000) : Busy
  +01f8 @ 02dc9a38           : Object : 774ec300 ole32!CComApartment::`vftable' 
  +01d8 @ 02dc9c10->02dc9c38 : Object (0x28 bytes): 3cf70002 mshtml!CMetaElement::`vftable'+0x16a 


不管怎样,当查询完成后,打开heaplayout.txt查找 ”AAAAAAAAAAAAAAA“

非常完美,这里就是我么的 spray 让我们看看这行
+2040 @ 02da2080->02da2880 : BSTR 0x800/2048 bytes (Data : 0x7fa/2042 bytes, 0x3fd/1021 chars)


BSTR对象预料中恰好是0x800字节,包含4字节的头和2字节的结束,0x800-6字节被用于数据,在这个数据中,我们发现字符串 0x7fa/2 (=0x3fd)没有null字节的字符。

上个截图中每行之间的偏移都是8字节。这表明spray的数据块是紧挨着的,输出表明BSTR对象是位于比较大的堆块中的。这也解释了为什么我们密友看见一些0x800大小的数据块在winDBG输出中 !heap -stat -h 00150000:

0:016> !heap -stat -h 00150000
 heap @ 00150000
group-by: TOTSIZE max-display: 20
    size     #chunks     total     ( %) (percent of total busy bytes)
    fff8 18 - 17ff40  (41.05)
    3fff8 3 - bffe8  (20.53)
    3ff8 11 - 43f78  (7.27)
    1ff8 1e - 3bf10  (6.41)
    20fc1 1 - 20fc1  (3.53)
    1fff8 1 - 1fff8  (3.42)
    7ff8 3 - 17fe8  (2.57)
    13fc1 1 - 13fc1  (2.14)
    8fc1 2 - 11f82  (1.92)
    b2e0 1 - b2e0  (1.20)
    ff8 b - afa8  (1.17)
    7f8 15 - a758  (1.12)
    57f0 1 - 57f0  (0.59)
    4ffc 1 - 4ffc  (0.53)
    4fc1 1 - 4fc1  (0.53)
    5e4 b - 40cc  (0.43)
    3980 1 - 3980  (0.38)
    20 1c7 - 38e0  (0.38)
    3f8 a - 27b0  (0.27)
    1e04 1 - 1e04  (0.20)


Precise Heap Layout 精准的堆布局

让我们更进一步。设想你想去设置一个特殊的堆布局在win7的IE9中,堆布局中需要包含重复的顺序排列的按钮对象(CButtonLayout)和字符串。这次,我们将限制mona输出,只显示包含CButtonLayout虚表的堆块(以及这个堆块中位于虚表后的任何信息)

执行命令:
!py mona heap -t layout -after CButtonLayout


mona.py一发现包含所提供的value参数夫人字符串或者虚表,将展示在这个数据块中所有的信息。这个value的匹配过程是区分大小写的。

打开日志文件(heaplayout.txt)并且查找字符串。这次,日志文件中所有的详情只限包含CButtonLayout虚表的数据块。


就如你所看到的一样,mona.py 不能确定CButtonLayout对象的准确大小,因为它不能在mshtml.dll中发现创建元素的结构。此后,通过花费几分钟的逆向,你将发现CButtonLayout的大小为0x100字节,我们现在可以通过向知识库添加这个值来告诉mona.py记住这个值。
!py mona kb -set -id vtableCache -value MSHTML!CButtonLayout,0x100
!py mona kb -set -id vtableCache -value mshtml!CButtonLayout,0x100


再次执行 mona heap -t layout -after CButtonLayout  命令 ,输出现在看起来是这样子


好多了,更重要的事情是mona将记住这个值最为知识库的一部分。当你关闭windbg的时候知识库也不会被清理,这一位置永远存在。仅仅记住当系统更新时可能会改变对象的大小,所以你要时不时的移除知识库,再让mona生成它。

Knowledgebase 知识库

先前已经提及,有一件事你可能已经注意到第一次执行heap -t layout 花费了好几分钟,随后的所有执行都表现的很快,甚至在关闭Windbg后,再打开。

当mona heap -t layout 运行的时候,它将尝试去发现对象的大小并存储他们到vtableCache 字典中,这个字典将存到知识库中,它是主要的文件(windbglib.db)包含了序列化的python对象。每当 mona heap -t layout  被用时,mona将读取这个知识库并将库中的值填入到整个vtablecache中。这就解释了为什么第一次运行后会快很多是怎么产生的。

mona.py "kb"命令允许你去操纵知识库,使用list set del方法

列出文件中所有的知识库的ID
0:015> !py mona kb -list
Hold on...

Number of IDs in Knowledgebase : 1
IDs :
-----
vtableCache

[+] This mona.py action took 0:00:00


获取与给定ID相关的python对象中所有的数据。简单的加上 -id 参数
0:015> !py mona kb -list -id vtableCache
Hold on...

Number of IDs in Knowledgebase : 1
Entries for ID vtableCache (type dict) :
------------------------------------------
  IEFRAME!CFrameLayer : 0 (0x0)
  DWrite!pz::Rule::GenericExpression<pz::Expression<pz::BinaryOperation<pz::Expression<pz::BinaryOperation<pz::Expression<pz::BinaryOperation<pz::Expression<pz::Reference,pz::IsAlwaysTrue,pz::NoAction>,pz::Expression<pz::UnaryOperation<pz::Expression<pz::BinaryOperation<pz::Expression<pz::Reference,pz::IsAlwaysTrue,pz::NoAction>,pz::Expression<pz::UnaryOperation<pz::Expression<pz::DynamicKind<enum : 0 (0x0)
  MSHTML!QuirkTokenizer : 0 (0x0)
  MSHTML!ATL::CComObject<CHTMLEditorProxy> : 0 (0x0)
  windowscodecs!CDemandBitmapCache<IWICBitmapSource> : 0 (0x0)
  d3d10!D3D10Statechunk::TShaderInput<ID3D10Buffer,&ID3D10Device::`vcall'{192}',&ID3D10Device::`vcall'{64}'> : 0 (0x0)
  IEFRAME!CMenuBandMetrics : 0 (0x0)
  IEFRAME!CIEFrameAuto::COmHistory : 0 (0x0)
  DWrite!ClientAlpcConnection : 0 (0x0)
  MSHTML!CCurrentStyle : 0 (0x0)
  msimtf!CClassFactory : 0 (0x0)
  MSHTML!CInsertParagraphCommand : 0 (0x0)
  MSHTML!CDoc : 0 (0x0)
  MSHTML!CProgSink : 0 (0x0)
  MSHTML!CIE50PasteModeCommand : 0 (0x0)
  propsys!CGlobalMappingData : 0 (0x0)
  ieapfltr!GenericDeletableCollection<FormDetails> : 0 (0x0)
  MSHTML!CForeColorCommand : 0 (0x0)
  MSHTML!CBaseROStmOnBuffer : 0 (0x0)
  MSHTML!CBaseXSLTFilter : 0 (0x0)
  d2d1!CHwRadialGradientBrush : 0 (0x0)
  MSHTML!CDataCache<CBoxShadow> : 0 (0x0)


  <...>


  MSCTF!CEditRecord : 0 (0x0)
  DWrite!InnerComObject<DWriteFactory,DWriteGdiInterop> : 0 (0x0)

Number of entries for ID vtableCache : 605

[+] This mona.py action took 0:00:00.219000

你也可以通过 -value参数 过滤
0:015> !py mona kb -list -id vtableCache -value CButton
Hold on...

Number of IDs in Knowledgebase : 1
Entries for ID vtableCache (type dict) :
------------------------------------------
  (Filter : CButton)
  MSHTML!CButton : 0 (0x0)
  MSHTML!CButtonLayout : 256 (0x100)
  mshtml!CButtonLayout : 256 (0x100)

Number of filtered entries for ID vtableCache : 3

[+] This mona.py action took 0:00:00.016000


使用 del 方法,从列表中移除一条
0:015> !py mona kb -del -id vtableCache -value mshtml!CButtonLayout
Hold on...

*** Object mshtml!CButtonLayout in ID vtableCache removed from Knowledgebase

[+] This mona.py action took 0:00:00.032000

0:015> !py mona kb -list -id vtableCache -value CButton
Hold on...

Number of IDs in Knowledgebase : 1
Entries for ID vtableCache (type dict) :
------------------------------------------
  (Filter : CButton)
  MSHTML!CButton : 0 (0x0)
  MSHTML!CButtonLayout : 256 (0x100)

Number of filtered entries for ID vtableCache : 2

[+] This mona.py action took 0:00:00

注: 如果你忽略了-value参数,全部ID对象都将被删除,莫大惊小怪,mona将自动创建ID,素偶的手动修改都将丢失,无论如何,也不要自己去修改windbglib.db文件,如果它损坏了,移除它,让mona自动生成个新的。

如果你有问题请到这里
https://www.corelan.be/index.php/forum/mona/

Have a great week-end !(周末愉快)

-peter

----------------------------------------------------------
2015/2/25
-AN94 (译者)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 69
活跃值: (270)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
msf
2
求分,早日脱离临时会员
2015-2-25 18:15
0
雪    币: 69
活跃值: (270)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
msf
3
好帖别沉
2015-2-27 08:31
0
雪    币: 69
活跃值: (270)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
msf
4
mona摸哪 哈哈
2015-3-1 08:58
0
雪    币: 69
活跃值: (270)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
msf
5
mona 手册求伯乐
2015-3-3 10:13
0
游客
登录 | 注册 方可回帖
返回
//