【问题标题】:Can WinDBG display information about an arbitrary heap address?WinDBG 可以显示有关任意堆地址的信息吗?
【发布时间】:2019-11-10 18:08:48
【问题描述】:

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] 不返回任何内容。

所以我在这里,我知道实际上0x00000224ceae3ad00x00000224ceae8090 是罪魁祸首。实际上[UserPtr]+0x30(48 字节)出于某种原因,我还需要找出原因,但我被困在这里。 (我创建了一个小样本,我可以在其中验证地址,所以至少在样本中我很确定地址是正确的)

在这一点上,我可以做些什么来获得有关!address [Addr] 旁边的地址的更多信息,但这并没有太大帮助。

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

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

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

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

【问题讨论】:

  • 您没有提供任何关于00000224ceade3a0+30 是什么或您的程序如何使用堆的信息,因此很难提供任何具体的指导。在没有任何其他信息的情况下,您只需将内存块转储到0x00000224ceae3ad00x00000224ceae8090 并寻找有关其身份的间接证据。也许其中有一个 vtable 或指针。也许还有其他具有已知身份的堆块指向它们。
  • @RaymondChen 我更新了条目,但对该对象知之甚少。我将如何发现 vtable?你将如何转储这些块?一些d* 命令?
  • 您可以使用dps 转储地址,就好像它是一个vtable。可以看看结果是不是一堆虚函数指针。
  • 与 .NET 不同,C++ 不与对象一起维护类型信息。所以一般来说,无法确定堆块的类型
  • @ThomasWeller 当我在 Visual Studio 中使用 /GR 启用运行时类型信息时,您知道运行时如何存储它们的类型信息吗?

标签: windows windbg usermode


【解决方案1】:

如果 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,例如 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)

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2011-05-22
    相关资源
    最近更新 更多