Как читать кучи с помощью PYKD - PullRequest
0 голосов
/ 20 ноября 2018

В этом вопросе я хотел заменить DbgCommand("dt ...") вызовом API, и на помощь пришла команда 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

В результате этого успеха я хотел бы заменить другие DbgCommand запросы вызовами API.

Для случая 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)?

PS Даже если targetHeap() не может использоваться какзамена для !heap -h 0, я все еще хотел бы знать, как использовать это для целей расследования.

1 Ответ

0 голосов
/ 22 ноября 2018

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 )
...