如何使用 PYKD 读取堆
How to read heap using PYKD
在 中,我想用 API 调用替换 DbgCommand("dt ...")
,PYKD
命令 typedVar()
来救援。
因此,我的 heap_stat 脚本(扩展了 m_nSize
和 m_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
的替代品,我仍然想知道如何使用它,以供研究之用。
targetHeapIterator() - 仅用于托管堆,不能直接创建,只能通过特殊的 class.
for entry in targetProcess.getManagedHeap().entries():
pass # enumerate managed heap
要枚举本机堆,您需要编写自己的脚本。
也许对您有用:
https://githomelab.ru/pykd/pykdwin
这个包有堆枚举器但有限制:
- 不支持低频
- 不支持段堆
来自文档的示例:
from pykdwin.heap import *
for heap in get_heaps():
for entry in heap.entries():
print( hex(entry.address), entry.size )
在 DbgCommand("dt ...")
,PYKD
命令 typedVar()
来救援。
因此,我的 heap_stat 脚本(扩展了 m_nSize
和 m_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
的替代品,我仍然想知道如何使用它,以供研究之用。
targetHeapIterator() - 仅用于托管堆,不能直接创建,只能通过特殊的 class.
for entry in targetProcess.getManagedHeap().entries():
pass # enumerate managed heap
要枚举本机堆,您需要编写自己的脚本。
也许对您有用: https://githomelab.ru/pykd/pykdwin
这个包有堆枚举器但有限制:
- 不支持低频
- 不支持段堆
来自文档的示例:
from pykdwin.heap import *
for heap in get_heaps():
for entry in heap.entries():
print( hex(entry.address), entry.size )