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