Может ли WinDBG отображать информацию о произвольном адресе кучи? - PullRequest
0 голосов
/ 10 ноября 2019

Предоставляет ли WinDBG способ отображения информации о типе (dt?) Для простого адреса кучи?

Я смотрю на сценарий, в котором трассировки стека кучи и пользовательского режима недоступны. При анализе кучи я отслеживал чрезмерное использование кучи и обнаружил в куче различные объекты, которые ссылались на определенный адрес памяти. В основном !heap -srch [UserPtr] +0x30 возвращенные объекты выглядят так:

0:004> !heap -srch 00000224ceade3a0+30
    _HEAP @ 224ceaa0000
              HEAP_ENTRY Size Prev Flags            UserPtr UserSize - state
        00000224ceae3ac0 045c 0000  [00]   00000224ceae3ad0    045ac - (busy)
    _HEAP @ 224ceaa0000
              HEAP_ENTRY Size Prev Flags            UserPtr UserSize - state
        00000224ceae8080 0346 045c  [00]   00000224ceae8090    03454 - (busy)

Теперь из-за пропущенных трассировок стека в пользовательском режиме !heap -p -a [UserPtr] ничего не возвращает.

Итак, я знаю, что на самом деле 0x00000224ceae3ad0и 0x00000224ceae8090 являются виновниками. Ну, на самом деле [UserPtr]+0x30 (48 байт) по причине, которую я еще должен выяснить, но я застрял здесь. (Я создал небольшой образец, в котором мне удалось проверить адрес, поэтому, по крайней мере, в этом образце я совершенно уверен, что адрес правильный)

Есть ли что-то полезное, что я могу сделать в этот момент, чтобы получить большеинформация об этих адресах рядом с !address [Addr], которая не очень помогает.

Поскольку я знаю размер и адрес, я могу бродить в куче и видеть то, что могу найти, но это кажется случайным.

Любые советы о том, как получить больше данных, были бы хорошими.

Для чего это стоит: я нахожусь на NT Heap с LFH.

Редактировать: В моемНапример, я знаю типы данных, но в реальном сценарии, с которым я сталкиваюсь, эти типы мне неизвестны, даже при доступе к коду может быть не очевидно, какой экземпляр объектов указывает на этот адрес, кроме совпадений размеров.

1 Ответ

3 голосов
/ 11 ноября 2019

, если UserPtr содержал vftable windbg, как правило, будет декодировать его в выводе, как показано ниже

HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        029b1428 0030 0007  [00]   029b1430    00168 - (busy)
          dbgeng!Debugger::DataModel::Host::HostModule::`vftable'

, как прокомментировал Рэймонд, вы можете использовать dps как dps poi (UserPtr) или печатать отдельные записи

0:004> .printf "%y\n" , poi(029b1430)
dbgeng!Debugger::DataModel::Host::HostModule::`vftable' (59cde364)
0:004> .printf "%y\n" , poi(poi(029b1430)+2c)
dbgeng!Debugger::DataModel::Host::BaseSymbol::GetFullyQualifiedName (59f79670)
0:004> .printf "%y\n" , poi(poi(029b1430)+28)
dbgeng!Debugger::DataModel::Host::HostModule::IsEqual (59f77680)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...