0

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]并没有太大帮助。

因为我知道大小和地址,所以我可以在堆中四处走动,看看我能找到什么,但这似乎是随机的。

关于如何获取更多数据的任何提示都会很棒。

对于它的价值:我与 LFH 在 NT 堆上。

编辑: 在我的示例中,我当然知道数据类型,但在现实世界的场景中,我所面临的这些类型对我来说是未知的,即使可以访问代码,除了巧合匹配之外,哪些对象的哪个实例指向该地址可能并不明显的大小。

4

1 回答 1

3

如果 UserPtr 包含一个 vftable,windbg 通常会在输出中对其进行解码,如下所示

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

正如 raymond 评论的那样,您可以使用 dps poi(UserPtr) 之类的 dps 或打印单个条目

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)
于 2019-11-11T20:24:19.377 回答