如何使用PYKD读取堆

时间:2018-11-20 12:45:12

标签: python windbg pykd

this question中,我想用一个API调用替换DbgCommand("dt ..."),而PYKD命令typedVar()得以解决。

结果,我的heap_stat脚本(扩展了m_nSizem_nCount信息)现在的运行速度快了三倍。

为您提供信息,我已经完成了此替换,以计算STL集合中的成员数量:

Replace: collection_Size = dbgCommand(("dt 0x" + pointer_format + " %s m_nSize") % (ptr,type_name)).split(' : ').[-1].split('\n')[0]
By:      collection_Size = typedVar(type_name, ptr).m_nSize

作为这次成功的结果,我想用API调用替换其他DbgCommand个请求。

对于dbgCommand('!heap -h 0'),这似乎不是那么简单(一些示例):

>>> for t in targetHeapIterator():
...   print t
... 
Traceback (most recent call last):
  File "<console>", line 1, in <module>
RuntimeError: This class cannot be instantiated from Python

>>> for t in targetHeap().entries:
...   print t
... 
Traceback (most recent call last):
  File "<console>", line 1, in <module>
RuntimeError: This class cannot be instantiated from Python

>>> for t in targetProcess().getManagedHeap().entries:
...   print t
... 
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: 'instancemethod' object is not iterable

如何遍历进程堆(替换!heap -h 0)?

P.S。即使targetHeap()不能代替!heap -h 0,出于调查目的,我仍然想知道如何使用它。

1 个答案:

答案 0 :(得分:1)

targetHeapIterator()-仅适用于托管堆,并且不能通过特殊类直接创建。

for entry in targetProcess.getManagedHeap().entries():
    pass # enumerate managed heap

要枚举本机堆,您需要编写自己的脚本。

也许对您有用: https://githomelab.ru/pykd/pykdwin

此程序包具有堆枚举,但有限制:

  • 不支持LFH
  • 不支持分段堆

文档样本:

from pykdwin.heap import *
for heap in get_heaps():
    for entry in heap.entries():
        print( hex(entry.address), entry.size )