WinDBG可以显示有关任意堆地址的信息吗?

问题描述 投票:0回答:1

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堆上。

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

windows windbg usermode
1个回答
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'

如雷蒙德所说,您可以使用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)
© www.soinside.com 2019 - 2024. All rights reserved.